2018SUCTF-annonymous
打开得到源码:
<?php
$MY = create_function("","die(`cat flag.php`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
// 生成32字节的伪随机字节序列,并将其转换为16进制字符串,这个字符串被用于函数名的一部分,以确保函数名是唯一的
eval("function SUCTF_$hash(){"
."global \$MY;" // 声明$MY是全局变量,那样他就能在函数内部访问$MY
."\$MY();" // 调用$MY变量所引用的匿名函数
."}");
// 思路:注入代码到$MY中
if(isset($_GET['func_name'])){
$_GET["func_name"]();
die();
}
show_source(__FILE__);
看样子能执行一个phpinfo
?func_name=phpinfo
思路:直接执行匿名函数或者执行SUCTF和hash拼接成的新函数
即:
<?php
$MY = create_function("","die(`calc`);");
$MY();
此时就能执行die(calc
);这个语句
漏洞点:
create_function这个函数的漏洞,他create之后会自动生成一个函数名为%00lamba_[0-999],后面的数字逐次递增
<?php
$MY = create_function("","die(`cat flag.php`);");
echo $MY;
create_function的返回值为这个函数的名称,如:
这道题中因为我们不知道前面有多少匿名函数,所以要遍历数字,来执行该函数
flag{90ca7e34-4b49-4431-b8d4-567ee0b79042}