匿名函数
特点:无函数名,使用一次就被丢弃,一般可以动态执行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 | <?php |
前面的步骤这里就先不解释了,这里直接看匿名类的利用
可以看到他的报错,说明在/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 | <?php |
可以看到$MY创建了一个方法,但是这个方法并没有被定义方法名,这里我们做一个简单的本地测试
可以看到生成了一个%00lambda_1
,这里就可以发现当create_function
方法未定义方法名时,会生成一个%00lambda_1
,再进行测试,会发现1其实是随机生成的,
然后我们看一下接下来的语句,可以发现只要存在func_name
参数,func_name
参数内的值就会被当作方法执行,这样就很简单了,我们只需要去匹配到随机生成的数字时,就可以获得flag,这里即可以循环去主动匹配,也可以直接使用一个数字进行持续匹配,这里我就利用脚本直接等数字随机生成到固定值上
1 | import requests |