본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 7-10.크로스 사이트 스크립팅 [Reflected XSS-PHP_SELF]

by Robert8478 2023. 12. 13.

PHP_SELF란? - 웹서버가 실행중인 현재 웹페이지의 경로를 나타내며, $_SERVER에 속하는 속성으로 $_SERVER['PHP_SELF'] 형태로 사용한다. $_SERVER는 웹 서버의 헤더와 경로 등의 정보를 포함하는 배열이다.

$_SERVER['PHP_SELF']는 URL 을 웹페이지의 경로로 인식하고 받아들이기 때문에 URL에 악성 스크립트 입력 시 XSS에 취약하다.

이번 페이지에서는 HTML 폼 태그의 action 속성에서 $_SERVER['PHP_SELF']를 사용해서 현재 페이지 경로를 반환한다.
즉, 코드에서는 <?php echo xss(($_SERVER['PHP_SELF']));?> ​이라면 실질적으로는
 <?php echo xss((http://192.168.56.102/bWAPP/xss_php_self.php));?> 가 되는 것이다.


[난이도 하]

이번 페이지는 firstname과 lastname 변수값을 받는데 우선 firstname에 스크립트 코드를 넣어보자.

정상적으로 코드가 먹힌다. 하지만 이번엔 phpself를 공격하기 위해 URL에 작성해 볼것이다.

http://192.168.56.102/bWAPP/xss_php_self.php/%22/%3E%3Cscript%3Ealert('hi')%3C/script%3E
코드를 넣음으로써 스크립트를 실행할 수 있었다. php 뒤에 "/> 를 넣어주어 기존의 HTML 폼 태그를 강제로 닫았다.
그리고 페이지에는 HTML 태그가 깨진 듯한 페이지가 보였다.

[난이도 중]

위와 같은 코드를 넣어주었는데 스크립트는 수행이 되지 않고 HTML 태그가 깨진 페이지만 출력되었다. 아무래도 URL에 입력한 값을 필터링하고 있는 듯 싶었다. addslashes 일 가능성이 있으니 document.cookie를 출력해보자.

http://192.168.56.102/bWAPP/xss_php_self.php/%22/%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
그랬더니 정상적으로 세션값이 노출되었다. 즉, 따옴표를 필터링 하고 있는 것이니 문자열을 출력하기 위해 String.fromCharCode를 사용하면 문자열을 출력할 수 있다.

http://192.168.56.102/bWAPP/xss_php_self.php/%22/%3E%3Cscript%3Ealert(String.fromCharCode(50,80,70,99,100,101,105,105))%3C/script%3E
String.fromCharCode 함수는 인자값으로 받은 ascii 코드를 문자열로 출력해준다. ascii 코드는 아무 코드나 넣어보았다.


[난이도 상]
난이도 상에서는 스크립트 코드를 입력해도 문자열로 인식하는데 htmlspecialchars 함수를 이용해 필터링을 수행하고 있었다.

$_SERVER['PHP_SELF']는 XSS 취약점이 발생하기 때문에 현재 웹페이지 경로 반환 시 $_SERVER['PHP_SELF'] 대신 코드 내에서 페이지의 절대 경로를 입력하거나 $_SERVER['PHP_SELF']를 HTML 엔티티코드로 변환하는 필터링 과정을 통해 악의적인 스크립트 코드가 수행되지 않도록 막아야한다.