织梦管理系统任意文件删除从 0 开始的挖掘思路分析
字数 1119 2025-08-29 08:30:24

织梦管理系统(DedeCMS)任意文件删除漏洞挖掘与分析

一、环境搭建

  1. 源码获取:从织梦管理系统(DedeCMS)官方网站下载源码
  2. 环境配置:使用phpStudy一键搭建环境
  3. 后台目录:默认后台访问路径为/dede

二、漏洞挖掘方法论

1. 审计工具辅助

  • 使用代码审计工具进行初步扫描
  • 重点关注文件删除相关函数和操作

2. 人工审计流程

  • 筛选可能存在文件删除功能的代码段
  • 逐个跟踪分析可能的漏洞点
  • 耐心是关键,大部分代码路径不可控

三、漏洞挖掘过程分析

第一次尝试

  • 定位代码:发现文件名参数不可控
  • 结论:无法利用

第二次尝试

  • 发现位置file_manage_control.php文件
  • 标准文件删除操作
    unlink($filename);
    
  • 测试过程
    1. 构造请求包测试文件删除功能
    2. 发现默认目录为网站根目录
    3. 尝试删除flag文件
  • 限制分析
    • 使用正则过滤../等路径遍历字符
    • 正则替换效果:
      • ../folder/file.txtfolder/file.txt
      • ./file.txtfile.txt
      • ....//file.txtfile.txt
    • 目录参数也有严格限制
  • 结论:路径遍历被有效防御,无法利用

第三次尝试

  • 定位代码:发现对文件类型和路径字符都有严格限制
  • 结论:无法利用

第四次尝试

  • 定位代码:文件名参数为MD5编码,不可控
  • 结论:无法利用

成功案例

  • 定位代码:发现可通过数组参数控制文件删除
  • 关键代码分析
    // 删除逻辑
    foreach($files as $file) {
        $file = $tmpdir.'/'.$file;
        if(file_exists($file)) {
            unlink($file);
        }
    }
    
  • 利用条件
    • $tmpdir默认为空(未进入赋值方法)
    • 基础目录:D:/phpstudy_pro/WWW/DedeCMS-V5.7.115/uploads/data/
    • 需要传入数组参数
  • Payload构造
    $files = array('../../../flag.txt');  // 需要实际存在的文件
    
  • 效果验证:成功删除网站根目录下的flag.txt文件

四、漏洞利用关键点

  1. 参数控制:必须能够控制$files数组参数
  2. 路径构造:利用基础目录与相对路径组合
  3. 文件存在:要删除的文件必须实际存在
  4. 目录拼接:利用$tmpdir为空的特点进行路径穿越

五、防御建议

  1. 输入验证

    • 严格过滤用户输入的特殊字符
    • 限制文件操作的范围
  2. 权限控制

    • 文件操作使用绝对路径
    • 设置open_basedir限制文件访问范围
  3. 安全编码

    • 避免直接使用用户输入作为文件路径
    • 对文件操作进行权限检查
  4. 日志监控

    • 记录所有文件删除操作
    • 监控异常的文件系统操作

六、总结

该漏洞展示了在文件操作中不安全的参数处理可能导致的安全风险。通过精心构造的数组参数,攻击者可以利用路径拼接特性实现任意文件删除。防御此类漏洞需要多层次的防护措施,包括输入验证、权限控制和操作监控。

织梦管理系统(DedeCMS)任意文件删除漏洞挖掘与分析 一、环境搭建 源码获取 :从织梦管理系统(DedeCMS)官方网站下载源码 环境配置 :使用phpStudy一键搭建环境 后台目录 :默认后台访问路径为 /dede 二、漏洞挖掘方法论 1. 审计工具辅助 使用代码审计工具进行初步扫描 重点关注文件删除相关函数和操作 2. 人工审计流程 筛选可能存在文件删除功能的代码段 逐个跟踪分析可能的漏洞点 耐心是关键,大部分代码路径不可控 三、漏洞挖掘过程分析 第一次尝试 定位代码 :发现文件名参数不可控 结论 :无法利用 第二次尝试 发现位置 : file_manage_control.php 文件 标准文件删除操作 : 测试过程 : 构造请求包测试文件删除功能 发现默认目录为网站根目录 尝试删除 flag 文件 限制分析 : 使用正则过滤 ../ 等路径遍历字符 正则替换效果: ../folder/file.txt → folder/file.txt ./file.txt → file.txt ....//file.txt → file.txt 目录参数也有严格限制 结论 :路径遍历被有效防御,无法利用 第三次尝试 定位代码 :发现对文件类型和路径字符都有严格限制 结论 :无法利用 第四次尝试 定位代码 :文件名参数为MD5编码,不可控 结论 :无法利用 成功案例 定位代码 :发现可通过数组参数控制文件删除 关键代码分析 : 利用条件 : $tmpdir 默认为空(未进入赋值方法) 基础目录: D:/phpstudy_pro/WWW/DedeCMS-V5.7.115/uploads/data/ 需要传入数组参数 Payload构造 : 效果验证 :成功删除网站根目录下的 flag.txt 文件 四、漏洞利用关键点 参数控制 :必须能够控制 $files 数组参数 路径构造 :利用基础目录与相对路径组合 文件存在 :要删除的文件必须实际存在 目录拼接 :利用 $tmpdir 为空的特点进行路径穿越 五、防御建议 输入验证 : 严格过滤用户输入的特殊字符 限制文件操作的范围 权限控制 : 文件操作使用绝对路径 设置open_ basedir限制文件访问范围 安全编码 : 避免直接使用用户输入作为文件路径 对文件操作进行权限检查 日志监控 : 记录所有文件删除操作 监控异常的文件系统操作 六、总结 该漏洞展示了在文件操作中不安全的参数处理可能导致的安全风险。通过精心构造的数组参数,攻击者可以利用路径拼接特性实现任意文件删除。防御此类漏洞需要多层次的防护措施,包括输入验证、权限控制和操作监控。