二、命令执行
2.1 rce中常用的php代码执行函数
2.1.6 call_user_func()/call_user_func_array() 函数PHP函数详解:call_user_func()使用方法 - djiz - 博客园
1)call_user_func()函数(一种特别的调用函数)
- 把第⼀个参数作为回调函数调用
call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed
//第⼀个参数是被调⽤的回调函数,后⾯的参数是函数的形参
利用方式:
<?php
$cmd=$_REQUEST['cmd'];
//cmd = phpinfo()
call_user_func(assert,$cmd);
?>
例:
<?php
function nowamagic($a,$b)
{
echo $a;
echo $b;
}
call_user_func('nowamagic', "111","222");
call_user_func('nowamagic', "333","444");
//显示 111 222 333 444
?>
2)call_user_func_array() 函数PHP: call_user_func_array - Manual
- 调用回调函数,并把一个数组参数作为回调函数的参数
call_user_func_array(callable $callback, array $param_arr): mixed
//把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
利用方式:
<?php
$func = $_REQUEST['func'];
$cmd = $_REQUEST['cmd'];
$array['0'] = $cmd
$result = call_user_func_array($func,$cmd);
//print_r($result);
?>
例:
<?php
function a($b, $c)
{
echo $b;
echo $c;
}
call_user_func_array('a', array("111", "222"));
//显示 111 222
?>
比较:
- call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰。
- call_user_func函数和call_user_func_array函数都支持引用。
2.1.7 array_filter() 函数
- 使用回调函数过滤数组的元素
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
//依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 array 数组的//当前值会被包含在返回的结果数组中。
//数组的键名保留不变。
//如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的元素。
//参数 flag 决定callback接收的参数形式:
//ARRAY_FILTER_USE_KEY - 接受键名作为的唯一参数,整型 1
//ARRAY_FILTER_USE_BOTH - 同时接受键名和键值,整型 2
//两个系统预定义常量,可通过 get_defined_constants 查看。
利用方式:
<?php
$func = $_GET['func'];
$cmd = $_GET['cmd'];
$array1=array($cmd);
array_filter($array1,$func)
?>
例:
//使用回调函数
<?php
function even($var)
{
// returns whether the input integer is even
return(!($var & 1));
}
$array = array(6, 7, 8, 9, 10, 11, 12);
echo "Even:\n";
print_r(array_filter($array, "even"));
?>
//输出:
Even:
Array
(
[0] => 6
[2] => 8
[4] => 10
[6] => 12
)
//不使用回调函数
<?php
$entry = array(
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => ''
);
print_r(array_filter($entry));
?>
//输出:
Array
(
[0] => foo
[2] => -1
)