iwebsec靶场之代码执行关卡-06 array_map函数

目录

一、代码执行关卡array_map渗透原理

(一) array_map简介

(二) array_map利用

1、callback=system 

2、0=whoami 部分

3、 最终执行流程

二、代码执行关卡array_map函数渗透实战

(一)源码分析

1、未过滤的用户输入直接作为回调函数

2、参数完全可控

3、漏洞函数调用

(二)渗透实战

1、方法1

2、方法2


本文通过《iwebsec靶场代码执行漏洞第六关 06 array_map函数》来进行渗透实战。

一、代码执行关卡array_map渗透原理

打开iwebsec靶场代码执行关卡的06-array_map关,如下图红框所示。

(一) array_map简介

array_map 是 PHP 中用于对数组元素批量应用回调函数的高阶函数,它接收一个回调函数和一个或多个数组作为参数,并将回调并行应用到所有数组的对应元素上。

array_map(callable $callback, array $array1, array ...$arrays): array

array_map — 为数组每个元素应用回调函数,可调用自定义函数。当处理单个数组时,它会遍历每个元素并返回由回调结果组成的新数组;当处理多个数组时,它会同步遍历各数组的当前元素,并将它们作为参数传递给回调函数。若回调设为 null 且传入多个数组,则返回由各数组同位置元素组成的子数组(类似矩阵转置)。参数含义如下所示。 

  • $callback (可调用类型,可为 null)

    • 要对每个数组元素执行的回调函数

    • 如果为 null,则会创建多维数组(当提供多个数组时)

    • 回调函数应接受与传入数组数量相同的参数

  • $array (数组)

    • 第一个要处理的输入数组

    • 必需参数

  • ...$arrays (可变数量的数组参数)

    • 可选的其他输入数组

    • 如果提供多个数组,array_map() 会并行迭代它们

(二) array_map利用

如下为利用方法示例。

// 漏洞代码示例
$func = $_GET['callback'];
$data = [1, 2, 3];
$result = array_map($func, $data);

攻击向量参数分解如下所示。

?callback=system&0=whoami

1、callback=system 

  • 作用:控制 $func 变量值为 system

  • 结果array_map() 的第一个参数变成 system 函数

  • 等效代码

    $result = array_map('system', [1, 2, 3]);

2、0=whoami 部分

  • 原理:PHP 会解析 0=whoami 为 $_GET[0] = 'whoami'

  • 数组覆盖$_GET 是超全局数组,数字索引会修改 $data 数组

  • 实际效果

    $data[0] = 'whoami'; // 原始数组 [1,2,3] 被修改为 ['whoami',2,3]

3、 最终执行流程

​array_map('system', ['whoami', 2, 3]) 执行

     如上脚本会对数组每个元素调用 system():

        1) 第一次迭代:system('whoami') → 执行系统命令

        2)后续迭代:system(2) 和 system(3) 也会执行但无实质影响

二、代码执行关卡array_map函数渗透实战

(一)源码分析

进入iwebsec的代码执行第6关卡,如下所示

找到对应的源码,发现关键代码array_map , 具体如下所示。

接下来我们对漏洞代码进行分析,array_map会产生代码注入漏洞,具体解释如下。

$func = $_GET['func'];  // 用户可控的回调函数名
$argv = $_GET['argv'];  // 用户可控的参数值
$array[0] = $argv;      // 将参数放入数组
array_map($func, $array); // 动态调用函数

漏洞原因如下所示。

1、未过滤的用户输入直接作为回调函数

        (1)$_GET['func'] 直接赋给 $func 并作为 array_map 的第一个参数
        (2)攻击者可控制要执行的任意函数

2、参数完全可控

        (1)$_GET['argv'] 直接作为回调函数的参数
        (2)攻击者可指定任意参数值

3、漏洞函数调用

        (1)array_map() 无条件信任传入的回调函数
        (2)没有对函数名和参数进行任何安全检查

漏洞利用方法如下所示。

func=system&argv=id

该代码注入回调函数为 system()(系统命令执行函数),设置参数为 Linux/Unix 的 id 命令,该命令会返回当前用户权限信息

(二)渗透实战

1、方法1

注入语句:func=system&argv=id

这个语句等于执行如下的代码,即获取当前用户的信息。

array_map('system', ['id']);

2、方法2

注入语句:?func=system&argv=cat /etc/passwd 

这个语句等于执行如下的代码,即获取当前用户的信息。

array_map('system', ['cat /etc/passwd ']);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值