0728 반사된 XSS 취약점 POST 10.2
실습 페이지는 POST 메소드를 사용해 HTTP 연결 요청을 하는 페이지다.
XSS 취약점을 알아보기 위해 입력란에 'Succeed' 경고창을 출력하는 스크립트 코드를 입력해 보았다.<script>alert('Succeed');</script>
ok를 누르면 Last name에 입력한 값이 출력된다.
First name에는 사용자의 쿠키 값을 경고창으로 출력하는 스크립트 코드를 입력하고 Last name 입력란을 비우고 Go를 눌러보았다.
<script>alert(document.cookie)</script>
두 입력란을 모두 채우라는 오류 메시지를 볼 수 있었다.
문자열을 출력하라는 스크립트 코드는 실행되지 않았지만 사용자의 쿠키 값을 출력하는 스크립트 코드는 실행되었다.
문자열 출력 스크립트 코드에는 작은 따옴표가 있었지만 쿠키 값을 출력하는 스크립트 코드에는 작은 따옴표가 없었다.
따라서 작은 따옴표를 우회하는 함수를 사용했다.
<script>alert(String.fromCharCode(83, 117, 99, 99, 101, 101, 100, 33))</script>
작은 따옴표를 사용하지 않고도 문자열을 출력하는 스크립트 코드다.
'String.fromCharCode' 함수는 자바 스크립트 내장 함수다. 인자로 받는 아스키코드나 유니코드를 문자로 반환한다.
실습 페이지는 입력란이 있어 버프스위트를 사용하지 않아도 스크립트 코드 입력이 가능하지만,
변수가 드러나지 않는 POST 메소드를 사용해 요청하는 페이지에 XSS를 할 때는 버프스위트를 이용해 변수에 스크립트 코드를 입력해야 한다.
이렇게 입력하면 스크립트 코드가 실행되어 'String.fromCharCode' 함수에 인자로 들어간 아스키코드를 문자열로 출력하게 된다.
경고창에 있는 확인 버튼을 클릭하면 경고창이 닫히고 원래 페이지로 돌아간다.
First name에 스크립트 코드를 입력했기 때문에 Last name에 입력한 값만 출력된다.
난이도 중에서는 First name에 ', ", \, NULL 문자를 포함한 스크립트 코드를 입력하면 문자로 인식한다.
실습 페이지의 소스 코드를 확인하면 'xss_check_4' 함수를 사용해 입력 데이터를 우회하면 된다.
'xss_check_4' 함수는 functions_external.php에 정의되어 있고 addslashes 함수를 호출한다.
addslashes 함수를 사용할 경우 XSS에 사용되는 특수 문자들 중 ', ", \, NULL 문자 앞에 슬래시를 추가하므로 스크립트 코드를 실행하지 못한다.
그러나 addslashes 함수를 사용한 XSS 방어는 ', ", \, NULL 문자를 포함하지 않는 스크립트 코드가 실행되는 문제점이 있다.
난이도 상에서는 First name이나 Last name에 스크립트 코드를 입력해도 문자로 인식한다.
xss_post.php 페이지의 소스코드를 확인하면 xss_check_3 함수를 사용해 입력 데이터를 우회함을 확인할 수 있다.
xss_check_3 함수는 functions_external.php에 정의되어 있고 htmlspecialchars 함수를 호출해 입력 데이터를 UTF-8로 인코딩한다.
htmlspecialchars 함수는 두번째 인자에 ENT_QUOTES를 추가해 XSS에 사용되는 특수 문자들을 HTML 엔티티 코드로 변환해 스크립트 코드를 입력해도 웹 브라우저에서는 문자로 인식한다.
htmlspecialchars 함수가 우회하는 특수 문자는 &, ", ', <, >이다.