NCS보안3기/웹 해킹2017. 6. 8. 20:28

- 개요


웹 어플리케이션에서 많이 나타나는 취약점의 하나로 웹 사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 이는 취약점이다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점으로 해커가 사용자의 정보( 쿠키, 세션 등 )를 탈취하거나, 자옫ㅇ으로 비정상적인 기능을 수행하게 하거나 할 수 있다.



❑ 반사형( Reflected ) XSS

공격 스크립트가 삽입된 URL을 사용자가 쉽게 확인할 수 없도록 변형시킨 후 이메일이나 다른 웹 사이트 등에 클릭을 유도하도록 하는 방법


❑ 저장형( Stored ) XSS

스크립트를 웹 서버에 저장하여 일반 게시판 등에 공격자가 게시글에 스크립트를 삽입하여 사용자가 해당 페이지를 클릭하는 순간 스크립트가 실행되도록 하는 방법이다.



입력란에 다음 스크립트를 실행하면 아래 그림처럼 공격이 성공되는 것을 볼 수 있다.

<script>alert("XSS Test!!");</script>

- 취약점 점검 방법


✓ 게시판에 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.

✓ 사이트의 검색란에 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.

✓ 서버 에러 메시지를 조작하여 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.


- 대응조치


✓ 사용자용 게시판 등과 같은 매개체들에 사용자 입력값 검증루틴을 거친다.

✓ 어플리케이션 차원에서 HTTP 헤더, HTML, Javascript/VBScript, Flash, GIF/JPG, 쿠키, 쿼리 스트링, 폼 필드, 히든 필드 등의 모든 인자( Parameter )들에 대해 허용된 유형의 데이터만 입력할 수 있도록 한다.


입력 값 

수정 값 

입력 값 

수정 값 

&lt; 

&#41; 

&gt; 

&#35; 

&#40; 

&#38; 


- 필터링


strip_tags($content) : HTML 태그 제거하기


if($_SERVER['QUERY_STRING'] == "write"){

#echo "<script>console.log(\"$_POST[content]\");</script>";

if($_POST['content'])

$_POST['content'] = strip_tags($_POST['content']);

mysqli_query($db, "insert into board(`no`,`id`,`content`,`time`) values(null,'{$_SESSION[site_id]}','{$_POST[content]}',now())");

echo "<script>location.href='./main.php';</script>";

}


content에 값이 있으면 쿼리문을 만들기 전에 strip_tags() 함수를 이용해 HTML 태그를 제거한다.

아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.

<script>alert("XSS Test!!");</script>


htmlspecialchars($content) : 강제 URL Encoding

태그에 사용되는 특수문자( <, >, &, " )가 있으면 URL 인코딩한다.


if($_SERVER['QUERY_STRING'] == "write"){

#echo "<script>console.log(\"$_POST[content]\");</script>";

if($_POST['content'])

$_POST['content'] = htmlspecialchars($_POST['content']);

mysqli_query($db, "insert into board(`no`,`id`,`content`,`time`) values(null,'{$_SESSION[site_id]}','{$_POST[content]}',now())");

echo "<script>location.href='./main.php';</script>";

}


content에 값이 있으면 htmlspecialchars() 함수를 이용해 URL 인코딩한다.

아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.

<script>alert("XSS Test!!");</script>


str_replace("<", "<", $string) : 발견된 문자를 지정한 문자로 치환


if($_SERVER['QUERY_STRING'] == "write"){

#echo "<script>console.log(\"$_POST[content]\");</script>";

if($_POST['content']) {

$_POST['content'] = str_replace("<", "$lt;",$_POST['content']);

$_POST['content'] = str_replace(">", "$gt;",$_POST['content']);

}

mysqli_query($db, "insert into board(`no`,`id`,`content`,`time`) values(null,'{$_SESSION[site_id]}','{$_POST[content]}',now())");

echo "<script>location.href='./main.php';</script>";

}


위 코드는 만약 문자 < 또는 > 가 있을 때 강제로 변경해 주어 스크립트가 실행되지 않게 한다.

아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.

<script>alert("XSS Test!!");</script>


Posted by Imp3rio