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 엔티티코드로 변환하는 필터링 과정을 통해 악의적인 스크립트 코드가 수행되지 않도록 막아야한다.
'3. 웹 애플리케이션 취약점 진단 > 비박스를 활용한 웹 애플리케이션 취약점 진단' 카테고리의 다른 글
[비박스를 활용한 웹 취약점 진단] 8-1.취약한 직접 객체 참조 [Reset Secret] (0) | 2023.12.13 |
---|---|
[비박스를 활용한 웹 취약점 진단] 8.취약한 직접 객체 참조 [Change Secret] (0) | 2023.12.13 |
[비박스를 활용한 웹 취약점 진단] 7-9.크로스 사이트 스크립팅 [Reflected XSS-phpMyAdmin] (0) | 2023.12.13 |
[비박스를 활용한 웹 취약점 진단] 7-8.크로스 사이트 스크립팅 [Reflected XSS-HREF] (0) | 2023.12.13 |
[비박스를 활용한 웹 취약점 진단] 7-7.크로스 사이트 스크립팅 [Reflected XSS-eval] (0) | 2023.12.13 |