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这类型也有点太不严谨了吧,查了一下确实是类名和函数名是不区分大小写的,变量名区分大小写

posted @ 2021-12-07 20:43  无据  阅读(252)  评论(0编辑  收藏  举报