SUCTF2018 annonymous

本文最后更新于:2024年7月28日 下午

[SUCTF 2018]annonymous

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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__);

目的很明确

$_GET["func_name"](); 通过执行SUCTF_$hash()进而执行 $MY = create_function("","die(`cat flag.php`);");创建的匿名函数

但是$hash得不到,无法执行SUCTF_$hash()

create_function()函数在创建之后会生成一个函数名为:%00lambda_[1-···] 后面的数字是递增的

因此创建的匿名函数其实是有名字的,例如%00lambda_1%00lambda_13 %00lambda_55

因此可以绕过SUCTF_$hash(),直接执行匿名函数

这里有两种方法,

第一种是直接爆破,这个很简单就不多说了

第二种是通过大量的请求来迫使Pre-fork模式启动,Apache启动新的线程,这样这里的函数名后面的数字会刷新为1

原理

Apache服务器的Pre-fork模式意味着在服务器启动时,就会预先创建一定数量的子进程(工作进程),用于处理客户端的请求。

我们可以通过发送大量请求来增加服务器的负载。

如果请求足够多,将会耗尽所有预先创建的子进程。

这时,Apache服务器会启动新的子进程来处理额外的负载

启动新的子进程时,用于生成函数名的计数器将会重置

%00lambda_[1-···] 后面的数字会从1开始重新计数。


SUCTF2018 annonymous
http://example.com/2024/07/28/SUCTF2018-annonymous/
作者
sawtooth384
发布于
2024年7月28日
许可协议