挖洞经验丨有上传文件的文件名处发现的时间延迟注入漏洞
字数 1523 2025-08-18 11:38:49
时间延迟注入漏洞利用教学文档:基于文件名的SQL盲注攻击
漏洞概述
本教学文档详细分析了一种相对少见但危害严重的时间延迟注入漏洞(Time-Based Blind SQL Injection),该漏洞出现在文件上传功能的文件名参数(filename)处理中。攻击者可以通过精心构造文件名参数,利用数据库查询的时间延迟来提取敏感信息。
漏洞发现环境
- 测试类型:HackerOne平台私密众测项目
- 目标系统:某厂商重要域名下的会员注册系统
- 测试范围:注册后获得的Web应用访问权限
- 关键功能:文件上传功能(仅接受PDF格式)
前期信息收集
- 咨询同行:与参与过该厂商测试的朋友@reefbr交流,获取目标系统概况
- 注册流程:通过正常注册获取测试账户
- 功能分析:登录后发现文件上传功能
上传功能限制分析
- 格式限制:仅接受"filename.pdf"格式的PDF文档
- 安全措施:
- 后端部署杀毒软件(AV)
- 前端严格校验文件扩展名
- 绕过尝试:
- 尝试绕过格式限制(部分成功)
- 上传的非PDF文件无法在服务端有效执行
漏洞假设与验证
基于历史经验提出假设:如果文件名被存储到数据库中,可能存在SQL注入漏洞
测试方法
- 抓包工具:使用BurpSuite Proxy拦截上传请求
- 修改参数:尝试修改filename参数值
- 初步发现:
- 不加.pdf后缀会被拒绝
- 系统部署Cloudflare WAF,多数测试返回"Access Denied"
WAF绕过
利用已知的Cloudflare配置问题绕过WAF防护:
- 朋友@reefbr曾报告过该厂商的Cloudflare绕过漏洞
- 相同的绕过方法在本测试中有效
漏洞验证POC
无延迟基准测试
POST /upload HTTP/1.1
Host: target.example.com
[...其他头部...]
filename=test.pdf
- 响应时间:1380毫秒(基准值)
时间延迟测试
测试1:sleep(10) - 延迟10秒(10000毫秒)
POST /upload HTTP/1.1
Host: target.example.com
[...其他头部...]
filename=test'+(select+1+from+information_schema.tables+where+table_schema=database()+and+1=1+and+sleep(10))+'.pdf
- 响应时间:11350毫秒(≈基准+10000毫秒)
测试2:sleep(20) - 延迟20秒(20000毫秒)
filename=test'+(select+1+from+information_schema.tables+where+table_schema=database()+and+1=1+and+sleep(20))+'.pdf
- 响应时间:21358毫秒(≈基准+20000毫秒)
漏洞原理分析
- 注入点:filename参数未经过滤直接拼接进SQL查询
- 盲注类型:时间延迟盲注(Time-Based Blind SQL Injection)
- 数据库特征:
- 支持
sleep()函数 - 使用
information_schema查询 - 支持字符串拼接操作
- 支持
漏洞危害评估
- 数据敏感性:系统处理大量个人身份信息(PII)
- 潜在影响:
- 提取数据库中的敏感信息
- 获取用户凭证
- 访问受限数据
- 攻击隐蔽性:时间延迟注入难以被传统WAF检测
漏洞修复建议
-
输入验证:
- 严格限制文件名格式(白名单)
- 过滤特殊字符(如单引号、分号等)
-
参数化查询:
- 使用预处理语句(Prepared Statements)
- 避免直接拼接用户输入到SQL查询
-
防御措施:
- 修复Cloudflare配置问题
- 实施多层防御(WAF+输入验证+参数化查询)
-
监控与日志:
- 记录异常长的数据库查询
- 监控可疑的文件名模式
漏洞上报流程
- 初报:提供详细重现步骤和POC
- 分类:确认为时间延迟SQL注入漏洞
- 修复:厂商团队确认并修复漏洞
- 奖励:获得相应漏洞赏金
教学总结
本案例展示了几个关键安全要点:
- 非常规注入点:文件名参数常被忽视,但可能成为注入点
- WAF绕过:配置不当的WAF可能被绕过
- 时间延迟注入:当布尔型盲注不可行时的替代方案
- 信息共享价值:同行交流可提高测试效率
扩展思考
- 如何自动化检测此类文件名注入漏洞?
- 除了时间延迟,还有哪些方法可以验证这类盲注?
- 在严格的文件格式限制下,如何设计更有效的测试用例?