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