Web1-Day6

二、命令执行

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
        )
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值