creat_func代码注入学习和call_user_func()
Create_function()简介
适用范围是版本php>=4.0.1,php5,php7
在php7.2.0以后就不支持create_function()这个功能
create_function("函数参数/变量","函数体")
官方案例如下
<?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()会创建一个匿名函数匿名函数在php>5.2才支持
叫lambda_2,然后给这个函数传参,会发现它执行了,所以其实上述代码相当于
<?php
function func($a,$b){
return "ln($a) + ln($b) =".log($a * $b);
}
?>
测试
源代码如下:
<?php
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
create_function('$a, $b', $sort_function);
?>
payload="]);}phpinfo();/*
call_user_func()
这个函数和create_func有点像所以就放一起总结了
call_user_func函数类似于一种特别的调用函数的方法,调用函数的方法如下:
<?php
function test($b)
{
echo $b;
}
call_user_func('test', "hello");
call_user_func('test', "my neighbours");
?>
结果如下:
如果要调用类里面的函数应该用数组,测试代码如下:
<?php
class Test1{
function test($b)
{
echo $b;
}
}
call_user_func(['Test1','test'], "hello");
call_user_func(['Test1','test'], "my neighbours");
?>
上面的的call_user_func可以换成call_user_func_array
测试结果:
本来我把类也写成了Test但是给我报错,报的是类和方法同名,php这类型也有点太不严谨了吧,查了一下确实是类名和函数名是不区分大小写的,变量名区分大小写