Code::Security/비박스(BWAPP)

비박스(bWAPP) A3 XSS - Reflected (PHP_SELF)

태군 코드 2022. 8. 9. 16:11
반응형

이 도구를 이용하여 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.

 

A3 - XSS - Reflected (PHP_SELF)

 

PHP_SELF는 웹 서버가 실행 중인 현재 웹 페이지의 경로를 나타내며 $_SERVER에 속하는 속성입니다.

$_SERVER['PHP_SELF'] 형태로 사용하는데, 이때 $_SERVER는 웹 서버의 헤더와 경로 등의 정보를 포함하는 배열 입니다. $_SERVER['PHP_SELF']는 URL을 웹 페이지의 경로로 인식하고 받아들이기 때문에 URL에 악성 스크립트 코드를 입력할 경우 XSS에 취약합니다.

 

$_SERVER['PHP_SELF']
- 현재 실행 중인 파일(자신)의 경로 + 파일명을 담은 전역 변수
- 웹에서는 URL상의 경로가 출력됨
- CLI에서는 접근한 경로가 그대로 출력됨
- CLI에서는 $_SERVER['SCRIPT_FILENAME'] 과 동일한 값

 

예시)
hxxp://XSS.TEST.com/php/php-self.php

echo $_SERVER['PHP_SELF'];
# /php/php-self.php

 

PHP $_SERVER에 대한 다른 속성은 링크를 확인 바랍니다.

 

xss_php_self.php 소스코드

xss_php_self.php 페이지의 소스코드를 확인해 보면 HTML 폼 태그의 action 속성에서 $_SERVER['PHP_SELF']를 사용하여 현재 페이지의 경로를 반환합니다. PHP_SELF에서 반환하는 실제 경로로 표시하면 <form action="<?php echo xss((http://localhost/bWAPP/xss_php_self.php));?>" method="GET">가 될 것입니다.

 

난이도 하

xss_php_self.php

xss_php_self.php 페이지의 화면입니다. First name과 Last name에 값을 입력해 보도록 하겠습니다.

 

xss_php_self.php 입력폼에 값 입력

First name과 Last name에 문자열을 입력하고 [Go] 버튼을 클릭하면 입력한 두 문자열이 페이지에 출력됩니다. 또한 GET 메서드로 전송 중이기 때문에 firstname변수와 lastname 변수가 URL에 노출되는 것을 알 수 있습니다. 현재 페이지는 PHP_SELF 속성으로 URL을 폼 태그로 입력받고 있기 때문에 경고창을 출력하는 스크립트 코드를 URL에 입력해 보도록 하겠습니다.

 

URL에 스크립트 코드 입력

스크립트 코드를 입력 후 확인 버튼을 누르면 HTML 태그가 깨진 페이지를 확인할 수 있습니다.

 

스크립트 코드 입력후 소스코드 확인

/"/><script>alert("XSS TEST")</script>

스크립트 코드를 입력하기 전에 /"/>를 먼저 입력해준 이유는 HTML 폼 태그를 강제로 닫기 위함입니다. 스크립트 코드를 입력 후 소스코드를 확인해 보면 폼 태그가 강제로 닫히고 입력한 스크립트코드가 들어가 있는 것을 확인할 수 있습니다.

 

First name에 스크립트 코드 입력

 

 

스크립트 코드 실행 확인

<script>alert(document.cookie)</script>

 

스크립트 코드 입력후 소스코드 확인

Firstname과 Lastname에 문자열을 입력하였을 때 웹 페이지에 입력한 문자열이 표시되는 것을 확인할 수 있었고, 입력 폼에 스크립트 코드를 입력하여도 적절한 검증이 없기 때문에 스크립트가 동작을 하는 것을 알 수 있습니다.

 

반응형

 

난이도 중
난이도 중에서는 문자열을 출력하는 스크립트 코드를 입력하여도 실행되지 않습니다.

/"/><script>alert("XSS TEST")</script>

 

난이도 중 스크립트 코드 입력 소스코드

난이도 중에서는 addslashes() 함수를 이용하여 입력 데이터를 우회합니다. addslashes() 함수는 데이터베이스 쿼리에서 필드 값으로 저장하기 전에 사용되는 함수입니다. 만일 문자열에 작은따옴표('), 큰따옴표("), 백슬래시(\), NULL 문자(%00)가 포함되어 있다면, 이 문자들 앞에 백슬래시(\)를 붙여 특수 문자가 순수한 하나의 문자로 인식되도록 해줍니다.

 

/"/><script>alert(document.cookie)</script>

/"/><script>alert(String.fromCharCode(84,69,83,84))</script>

 

문자열을 출력하기 위해서는 fromCharCode 함수로 아스키 값을 문자열로 반환하는 스크립트 코드를 입력하면 됩니다.

 

난이도 하 - 모든 스크립트 코드 실행

난이도 중 - ', ", \, NULL 문자를 포함하지 않는 스크립트 코드 실행

 

난이도 상에서는 xss_check_3 함수를 사용하는 것을 알 수 있으며 xss_check_3 함수는 functions_external.php에 정의되어 있고 htmlspecialchars() 함수를 호출하여 문자열에서 특수문자를 HTML 코드 형식으로 변환합니다. htmlspecialchars 함수를 살펴보면 두 번째 인자에 ENT_QUOTES를 추가하여 XSS에 사용되는 문자들을 HTML 엔티티 코드로 변환하기 때문에 스크립트 코드를 입력하여도 웹 브라우저에서는 문자로 인식하게 됩니다.

 

$_SERVER['PHP_SELF']는 XSS 취약점이 발생하므로 현재 웹 페이지의 경로를 반환할 때 $_SERVER['PHP_SELF']를 사용하는 대신 코드 내에서 페이지의 절대 경로를 입력하거나 $_SERVER['PHP_SELF']를 HTML 엔티티 코드로 변환하는 등 필터링하여 웹 브라우저가 악의적인 소스 코드를 해석하지 않게 막아야 합니다.

반응형