[보안] xss 게시판 취약점 보안
XSS 취약점 보완 방법 |
Reflected XSS, Stored XSS, CSRF 모두 입력 값에 대한 검증(Filtering)이 제대로 되지 않아 나타나는 취약점이다.
사용자가 스크립트를 전혀 입력할 필요가 없는 경우 <script>,<iframe>,<embed> 등의 태그를 원천적으로 제거해 주는 것이 좋으며,
HTML 허용 게시판 처럼 일부 태그를 허용해야 한다면 White List나 Black List 기반의 필터링 방법을 적용한다
( 블랙리스트 기반의 필터링 방법은 우회 방법이 많기 때문에 새로운 우회공격에 대한 지속적인 모니터 & 업데이트의 필요성이 있다 )
1. Application 에서 HTML 비허용 시 ( 입력한 파라메터 값을 서버에서 처리하기 때문에 서버에서 수정해야 함 )
>> HTML을 사용할 필요가 없으므로 HTML 태그 자체를 사용할 수 없게 만들면 된다. [ PHP ]
strip_tags($content) : HTML 태그 삭제 |
if($name=GET['name']) $name=strip_tags($name); echo $name |
파라메터 값을 출력하기 전 strip_tags() 함수를 사용하여 넘어온 값에 HTML 태그가 포함될 경우 HTML 태그 자체를 삭제 |
htmlspecialchars($content) : 강제 URL Encoding |
if($name=$_GET['name']) $name=htmlspecialchars($name); echo $name; |
HTML 태그에 사용되는 <, >, &, " 등의 특수 문자를 강제로 URL Encoding(<, > &, ")시킴 |
$content=str_replace("<", "<", $content) : 발견된 문자를 지정한 문자로 치환 |
if($name=$_GET['name']) $name=str_replace("<", "lt;", $name); $name=str_replace(">", "gt;", $name); echo $name; |
발견된 문자("<", ">")를 지정한 문자로 강제 치환해 주어 스크립트가 실행되지 않도록 한다. ( * eregi_replace() ) |
2. Application 에서 HTML 허용 시 ( HTML 허용 게시판일 경우 선택적 필터링 )
특정 태그 사용 방지 [ PHP ] |
str_replace("script", "scr<!-- -->ipt", $content); str_replace("iframe", "ifr<!-- -->ame", $content); str_replace("embed", "em<!-- -->bed", $content); |
eregi_replace()나 str_replace() 함수를 사용하여 태그에 사용될 문자열 사이에 주석을 삽입하는 등의 대응이 가능 |
※ ASP와 JSP에서의 방어 코드
Language | Prevention Source Code |
PHP | $content = str_replace("<", "<", $content); |
ASP | content = replace(content, "<", "<") |
JSP | content = content_replaceAll("<", "<"); |