0%

[SUCTF2018]anonymous

[SUCTF2018]anonymous

SUCTF的老题,考的一个匿名函数

源码

<?php
$MY = create_function("","die(`dir`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
eval("function SUCTF_$hash(){"
    ."global \$MY;"
    ."\$MY();"
    ."}");
if(isset($_GET['func_name'])){
    $_GET["func_name"]();
    die();
}

创建一个匿名函数,然后使用eval再创建一个名字为随机字符串的函数调用我们的匿名函数
允许提交一个func_name去动态调用一个没参数的函数。

先看了眼phpinfo,一无所有,不过只能调用一个无参数函数肯定也没别的攻击方法了,要么预测hash值,要么想办法获取匿名函数值

查了一下这个openssl_random_pseudo_bytes,是一个安全的随机数算法,也没法预测什么的,32位硬爆破去碰也不太可能,那就只能先想办法看看这个匿名函数是不是有名字

本地var_dump了一下$GLOBALS,拿到了一些有趣的东西,hash值是一个很长的随机字符串,但是我们的这个变量$MY,拥有一个名字\000lambda_1,再用这个名字动态调用一下,的确能行
url编码一下变成%00lambda_1,打过去500了,没法执行, 本地试了好几次都没成功
最后又去搜wp怎么回事
匿名函数均有名字,名为\000lambda_%d,%d为该匿名函数是进程中第几个匿名函数,本地环境代码很正常匿名函数就这一个,线上可能是Apache起了很多个线程,导致有多个匿名函数吧?
解决方案也很简单,发包到burp的intruder模块里面跑一遍就可以了,最后在\000lambda_6处获得flag
还有一种做法是疯狂访问,让Apache启动新的进程,新的进程刚创建出来的话匿名函数的序号就是1了,不过对于稍微扫一扫就会429的buu平台恐怕行不通?