二、命令执行
2.1?rce中常用的php代码执行函数
2.1.4?create_function() 函数
- 功能:通过传递的参数创建?个匿名函数,并且返回函数的?个名字。
注:此函数在内部执行一个eval() ,因此存在与eval() 相同的安全问题。此外,它还具有较差的性能和内存使用的量的特点。
1 create_function(string $args,string $code)
2 string $args //声明的函数变量部分
4 string $code //执行的方法代码部分
利用方式:
$newfunc = create_function('', '$_REQUEST['cmd']');
$newfunc();
例:
<?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";
?>
- creat_function 会创建一个匿名函数,在第一个 echo 中显示名字,在第二个 echo 中执行此函数。
- creat_function 会在内部执行一个eval 函数,执行后面 return 语句,属于creat_function 中第二个参数 string?$code 位置。
此匿名函数创建与执行的过程等同于:
<?php
function hanshu($a,$b){
return "ln($a) + ln($b) = " . log($a * $b);
}
?>
2.1.5 array_map() 函数
- 为数组的每个元素应用回调函数
- 将传入的数组按对应值传递给回调函数,回调函数处理结果组成新的数组作为返回值返回;传入的数组个数必须与回调函数的形参个数相同。
?
array_map(callable?$callback,?array?$array,?array?...$arrays):?array
?
array_map():返回数组,是为 array?每个元素应用?callback 函数之后的数组。?array_map()?返回一个?array,数组内容为?array1 ?的元素按索引顺序为参数调用?callback ?后的结果(有更多数组时,还会传入?arrays ?的元素)。?callback ?函数形参的数量必须匹配?array_map()?实参中数组的数量。
注:
callback :回调函数?callable,应用到每个数组里的每个元素。多个数组操作合并时,callback ?可以设置为?null 。 如果只提供了?array ?一个数组,?array_map()?会返回输入的数组。array :数组,遍历运行?callback ?函数。arrays 额外的数组列表,每个都遍历运行?callback ?函数。
利用方式:
<?php
//func = system
$func = $_GET['func'];
//cmd = ls
$cmd=$_GET['cmd'];
$array[0] = $cmd
$new_array = array_map($func,$array); //返回执行结果后的新数组
//print_r($new_array); 9 ?>
例:
a)单个数组:
<?php
function cube($n)
{
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>
$b 的值为:Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )
b)多个数组:
<?php
function show_Spanish($n, $m)
{
return "The number {$n} is called {$m} in Spanish";
}
function map_Spanish($n, $m)
{
return [$n => $m];
}
$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];
$c = array_map('show_Spanish', $a, $b);
print_r($c);
$d = array_map('map_Spanish', $a , $b);
print_r($d);
?>
$c:
Array
(
[0] => The number 1 is called uno in Spanish
[1] => The number 2 is called dos in Spanish
[2] => The number 3 is called tres in Spanish
[3] => The number 4 is called cuatro in Spanish
[4] => The number 5 is called cinco in Spanish
)
$d:
Array
(
[0] => Array
(
[1] => uno
)
[1] => Array
(
[2] => dos
)
[2] => Array
(
[3] => tres
)
[3] => Array
(
[4] => cuatro
)
[4] => Array
(
[5] => cinco
)
)
|