- 이 글을 무단으로 전재 및 재배포를 금지하고 있습니다.
- 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위 입니다. 본 내용을 악의적인 목적으로 사용 시 그에 대한 법적 책임을 포함한 모든 책임은 당사자에게 있으며, 작성자는 어떠한 책임도 지지 않음을 밝힙니다.
반사된 XSS(Reflected Cross-Site Scripting)란 파라미터에 악의적인 스크립트 코드를 입력하여 사용자가 URL을 클릭하면 악성 스크립트 코드가 실행되는 공격
<script>alert('Succeed')</script>
와 같이 작은 따옴표를 우회하는 함수를 사용하는 경우는
<script>alert(String.fromCharCode(83,117,99,99,101,101,100,33))</script>
String.fromCharCode 자바 스크립트 내장함수를 사용한다.
String.fromCharCode 함수는 인자로 받은 아스키코드나 유니코드를 문자열로 반환한다.
xss_json.php 페이지는 GET 메소드를 사용하기 때문에 URL에 변수(title, action)를 노출한다.
웹 개발자 도구 및 실제 php 소스코드 확인
movies 라는 배열에 검색값이 존재 유뮤에 따라 JSONResponseString 변수 값이 달라지는 것을 확인함
영화를 입력하는 검색란에 스크립트 코드를 입력한다. 스크립트 코드의 끝을 알리는 문구를 먼저 입력하여 기존 스크립트 코드를 실행하지 않게 막는다.
</script><script>alert("Succeed")</script>
버프스위트를 실행하고 xss_ajax_2-1.php 페이지에 접속하면 xss_ajax_2-2.php에 대한 요청을 가로챈다. host 해더를 확인하면 xss_ajax_2-2.php는 title 변수를 GET 메서드 입력받는다.
또한 이미지 태그를 활용하여 XSS가 가능하다.
이미지 태그에서는 태그에 입력한 주소에 이미지가 존재하지 않을 경우 'onError' 속성으로 이미지를 대체한다. onError 속성을 이용하여 스크립트 코드를 입력하면 XSS가 가능하다.
<img src=x onerror=alert('Succeed')>
eval 함수는 문자로 표현 된 JavaScript 코드를 실행하는 함수
- eval(string)
- 매개변수
string : 자바스크립트 표현식, 명령문, 또는 연속되는 다수의 명령문을 나타내는 문자열. 표현식은 이미 존재하는 객체의 변수나 속성을 포함할 수 있음- 반환값
주어진 코드를 평가하여 얻은 값. 값이 없다면 undefined를 반환함
eval(document.write(document.cookie))
a 태그(anchor)는 문서에서 다른 문서로 이동하는 하이퍼텍스트 기능을 제공함
xss_href-1.php 페이지는 사용자의 이름을 입력하고 Continue를 클릭하면 xss_href-2.php 페이지로 이동하여 투표를 진행할 수 있는 페이지가 나타난다.
xss_href-2.php 페이지에서 웹 개발자도구를 실행하면 아래와 같이 a 태그를 사용하여 href 속성으로 xss_href-3.php를 연결한다. 이뿐만이 아니라 xss_href-3.php 페이지로 movie 변수와 name 변수, action 변수를 넘긴다. name 변수에 사용자가 입력한 이름이 들어가므로 스크립트 코드를 name 변수에 입력하며 XSS 공격을 시도한다.
<tr height="30">
<td>G.I. Joe: Retaliation</td>
<td align="center">2013</td>
<td>Cobra Commander</td>
<td align="center">action</td>
<td align="center"> <a href=xss_href-3.php?movie=1&name=Anonymous&action=vote>Vote</a></td>
</tr>
0 onmouseover=alert("Success") a
// 0와 a는 변수의 입력값으로 사용하여 문법 오류를 막는다.
[Vote] 에 마우스 오버 시 alert 창 출력
0 onmouseover=alert(document.location='http://192.168.56.104/bWAPP/attack.html') a
//입력한 주소로 location 되는 스크립트 코드
[Vote] 에 마우스 오버 시 alert 창 출력 및 입력한 주소로 이동됨
🔑대응방안
Urlencode는 0-9, a-z, A-Z, _, - 를 제외한 특수 문자를 URL 인코딩하는 함수
따라서 스크립트 코드에 사용하는 (, ), ' 등의 문자가 인코딩 되어 코드가 실행되지 않는다.<a href=xss_href-3.php?movie=1&name=0+onmouseover%3Dalert%28%22Success%22%29+a&action=vote>Vote</a>
phpMyAdmin은 웹 상에서 MySQL을 관리하기 위한 도구로 PHP 언어로 작성됨
xss_phpmyadmin.php 페이지는 phpmyadmin 3.3.8.1/3.3.9.0 버전 이하에서 'error.php'로 XSS 취약점이 존재한다는 힌트를 제공한다.
CVE(Common Vulnerabilities and Exposures)는 알려진 보안 취약점을 정리하는 코드명 중 하나로, CVE 뒤에 연도와 발견된 순서를 붙여 취약점에 대한 코드명을 생성한다.
CVE-2010-4480 취약점은 '@' 문자를 포함하여 조작된 BBCode(Bulletin Board Code, 마크업언어, 대괄호[] 를 사용하여 태그함) 태그를 통하여 XSS가 가능하다. BBCode는 자바스크립트 및 HTML 인젝션 공격을 방어하기 위해 만들어졌는데, BBCode에서 자바스크립트나 HTML로 변환할 때 XSS 공격이 가능한 취약점이 발견되었다.
error.php 페이지에서 사용하는 변수는 type, error 변수를 사용한다. error 변수에 bad.html를 호출하는 BBcode 태그를 입력한다.
http://192.168.56.104/phpmyadmin/error.php?type=Bugged!&error=[a@http://192.168.56.104/bWAPP/bad.html@]Click here[/a]
[Click here]라는 하이퍼링크 클릭 시 bad.html로 이동한다.
🔑대응방안
해당 취약점은 phpmyadmin 3.3.8.1 버전과 3.4.0-beta1 버전에서 발생하므로 버전을 업데이트
PHP_SELF는 웹 서버가 실행 중인
현재 웹 페이지의 경로를 나타내며 $_SERVER에 속하는 속성
- $_SERVER['PHP_SELF']
- $_SERVER는 웹 서버의 헤더와 경로 등의 정보를 포함하는 배열
xss_php_self.php 페이지에서는 HTML 폼 태그의 action 속성에서$_SERVER['PHP_SELF']을 사용하여 현재 페이지의 경로를 반환한다.
http://192.168.56.104/bWAPP/xss_php_self.php/"/><script>alert("success");</script>
조작한 URL을 입력하면 success라는 메시지를 출력하는 경고창이 발생한다.
난이도 중 페이지에서 동일 URL 입력 시에는 경고창이 발생하지 않고 쿠키 값을 출력하는 것으로 보아 큰따옴표가 필터링되고 있었다.
http://192.168.56.104/bWAPP/xss_php_self.php/"/><script>alert(document.cookie);</script>
http://192.168.56.104/bWAPP/xss_php_self.php/"/><script>alert("success");</script>
따라서 큰따옴표를 사용하지 않고 문자열을 출력하는 스크립트 코드를 작성한다.
fromCharCode 함수로 아스키 값을 문자열로 반환하는 스크립트 코드를 입력한다.
http://192.168.56.104/bWAPP/xss_php_self.php/"/><script>alert(String.fromCharCode(83,117,99,99,101,115,115))</script>
🔑대응방안
htmlspecialchars 함수로 HTML에 사용되는 기호를 UTF-8로 반환하고 HTML 코드에 사용되는 문자들을 HTML 엔티티 코드로 변환한다.
<form action="/bWAPP/xss_php_self.php/"/><script>alert(String.fromCharCode(83,117,99,99,101,115,115))</script>"