<?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__);
代码分析可以得知$MY是create_function匿名函数创建了一个die()输出flag的函数名
openssl_random_pseudo_bytes(32)随机生成32位的字节
eval定义了一个字符串拼接的函数名,并且调用了$MY
给了我们一个get方法传参
这不是小case嘛,直接传入$MY调用匿名函数即可
发现报500,不知道咋回事,弄得我写一个php测试一下发现没问题,可能后台有过滤
试试phpinfo可能有惊喜
也没有,那要从字符串拼接的函数入手了啊,查询了一下 openssl_random_pseudo_bytes(32)生成的是伪随即字节
既然不是真的随机那就估计像random一样有漏洞,但是查了很久没有查到一个漏洞利用的
想了很久,试着查询一下creat_function真的是无名函数嘛,没想到入口在这里
放一个测试的代码即可懂
可以发现匿名函数并不是真正的匿名,而是由%00lambda_{%d}组成
那我们直接调一下burp的进程进行爆破后面数字即可(不直接用%00lambda_1的原因是我们不清楚数字持续递增到多少了)
还有一种方法是使用脚本一直调用%00lambda是后台线程拉满至清空,导致重新从1开始