从 sql 语句的控制到任意文件读取挖掘思路
字数 774 2025-08-22 12:23:35

从SQL语句控制到任意文件读取漏洞挖掘思路

环境搭建

  1. 下载ZZCMS源码:https://www.zzcms.net/
  2. 使用PHPStudy一键搭建环境
  3. 创建数据库并导入提供的SQL文件

漏洞点寻找

使用Seay源代码审计系统进行初步审计:

  • 基于sink点的正则匹配(误报较多)
  • 重点寻找任意文件读取的漏洞点

漏洞分析

文件读取代码段

关键代码片段:

$fp = @fopen("../".$skin."/".$template,'r');

漏洞条件:

  1. $skin参数可控
  2. 需要能够实现目录穿越(../

参数溯源

  1. $skin来源于数据库查询结果:
$skin = $row['skin'];
  1. $row数据来自SQL查询,需要找到控制查询结果的方法

SQL控制点分析

寻找包含skin字段的SQL语句:

  1. 发现有两处相关SQL语句
  2. 通过全局搜索找到可控制的表

关键控制点:

  • 存在可控制的参数能够更新数据库中的skin字段
  • 更新后通过查询将恶意构造的skin值带入文件读取操作

漏洞利用步骤

  1. 访问特定文件并传入可控参数:

    • 参数用于更新数据库中的skin字段
  2. 观察SQL语句执行:

    • 确认没有对../等目录穿越字符进行过滤
  3. 验证数据库更新:

    • 检查数据库确认skin字段已被修改为恶意值
  4. 触发文件读取:

    • 通过正常业务逻辑读取被修改的skin
    • 构造类似../../../etc/passwd的路径实现任意文件读取

技术要点总结

  1. 输入控制链

    • 用户输入 → 数据库更新 → 查询结果 → 文件操作参数
  2. 关键绕过点

    • 缺乏对数据库更新内容的严格过滤
    • 文件操作时直接使用未净化的数据库值
  3. 漏洞利用条件

    • 需要有权限更新相关数据库字段
    • 系统使用数据库值作为文件路径的一部分

防御建议

  1. 对所有数据库更新操作进行严格过滤
  2. 文件操作时:
    • 限制路径范围(使用白名单)
    • 规范化路径并检查是否越界
  3. 实施权限最小化原则
  4. 对从数据库获取用于文件操作的参数进行二次验证
从SQL语句控制到任意文件读取漏洞挖掘思路 环境搭建 下载ZZCMS源码:https://www.zzcms.net/ 使用PHPStudy一键搭建环境 创建数据库并导入提供的SQL文件 漏洞点寻找 使用Seay源代码审计系统进行初步审计: 基于sink点的正则匹配(误报较多) 重点寻找任意文件读取的漏洞点 漏洞分析 文件读取代码段 关键代码片段: 漏洞条件: $skin 参数可控 需要能够实现目录穿越( ../ ) 参数溯源 $skin 来源于数据库查询结果: $row 数据来自SQL查询,需要找到控制查询结果的方法 SQL控制点分析 寻找包含 skin 字段的SQL语句: 发现有两处相关SQL语句 通过全局搜索找到可控制的表 关键控制点: 存在可控制的参数能够更新数据库中的 skin 字段 更新后通过查询将恶意构造的 skin 值带入文件读取操作 漏洞利用步骤 访问特定文件并传入可控参数: 参数用于更新数据库中的 skin 字段 观察SQL语句执行: 确认没有对 ../ 等目录穿越字符进行过滤 验证数据库更新: 检查数据库确认 skin 字段已被修改为恶意值 触发文件读取: 通过正常业务逻辑读取被修改的 skin 值 构造类似 ../../../etc/passwd 的路径实现任意文件读取 技术要点总结 输入控制链 : 用户输入 → 数据库更新 → 查询结果 → 文件操作参数 关键绕过点 : 缺乏对数据库更新内容的严格过滤 文件操作时直接使用未净化的数据库值 漏洞利用条件 : 需要有权限更新相关数据库字段 系统使用数据库值作为文件路径的一部分 防御建议 对所有数据库更新操作进行严格过滤 文件操作时: 限制路径范围(使用白名单) 规范化路径并检查是否越界 实施权限最小化原则 对从数据库获取用于文件操作的参数进行二次验证