- 개요
웹 어플리케이션에서 많이 나타나는 취약점의 하나로 웹 사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 이는 취약점이다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점으로 해커가 사용자의 정보( 쿠키, 세션 등 )를 탈취하거나, 자옫ㅇ으로 비정상적인 기능을 수행하게 하거나 할 수 있다.
❑ 반사형( Reflected ) XSS
공격 스크립트가 삽입된 URL을 사용자가 쉽게 확인할 수 없도록 변형시킨 후 이메일이나 다른 웹 사이트 등에 클릭을 유도하도록 하는 방법
❑ 저장형( Stored ) XSS
스크립트를 웹 서버에 저장하여 일반 게시판 등에 공격자가 게시글에 스크립트를 삽입하여 사용자가 해당 페이지를 클릭하는 순간 스크립트가 실행되도록 하는 방법이다.
입력란에 다음 스크립트를 실행하면 아래 그림처럼 공격이 성공되는 것을 볼 수 있다.
<script>alert("XSS Test!!");</script>
- 취약점 점검 방법
✓ 게시판에 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.
✓ 사이트의 검색란에 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.
✓ 서버 에러 메시지를 조작하여 HTML 코드나 자바스크립트가 삽입 가능한지 확인한다.
- 대응조치
✓ 사용자용 게시판 등과 같은 매개체들에 사용자 입력값 검증루틴을 거친다.
✓ 어플리케이션 차원에서 HTTP 헤더, HTML, Javascript/VBScript, Flash, GIF/JPG, 쿠키, 쿼리 스트링, 폼 필드, 히든 필드 등의 모든 인자( Parameter )들에 대해 허용된 유형의 데이터만 입력할 수 있도록 한다.
입력 값 |
수정 값 |
입력 값 |
수정 값 |
< |
< |
) |
) |
> |
> |
# |
# |
( |
( |
& |
& |
- 필터링
❑ 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>";
}
아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.
❑ 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 인코딩한다.
아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.
❑ 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>";
}
아래 스크립트를 이용해 입력하면 다음 그림과 같이 공격이 수행되지 않음을 볼 수 있다.
'NCS보안3기 > 웹 해킹' 카테고리의 다른 글
[Web Hacking] SQL Injection (0) | 2017.06.08 |
---|---|
[Web Hacking] 테스트 서버 구축 (0) | 2017.06.07 |
[Web Hacking] 서버 구축을 위한 사전 준비 (0) | 2017.06.07 |
[Web Hacking] 웹 해킹의 기초 (0) | 2017.06.07 |