条件竞争的骚操作(二)
字数 1851 2025-08-23 18:31:24
条件竞争漏洞高级利用技术详解
一、条件竞争基础概念
条件竞争(Race Condition)是指当多个线程或进程同时访问共享资源时,由于执行顺序的不确定性导致程序出现非预期行为的安全漏洞。在Web安全中,这类漏洞通常出现在并发请求处理不当时。
二、邮箱绑定绕过验证漏洞
漏洞场景
- 目标:将
carlos@ginandjuice.shop绑定到当前账户,绕过邮箱验证 - 限制:网站每次只存储一个待处理的电子邮件地址
利用步骤
-
分析流程:
- 提交更改邮件请求时,数据库会直接编辑邮件地址
- 第二个绑定相同邮箱的请求会显示"This link is invalid"
-
构造竞争条件:
- 准备两个数据包:
- 数据包1:绑定到攻击者邮箱(
wiener%40exploit-...) - 数据包2:绑定到目标邮箱(
carlos@ginandjuice.shop)
- 数据包1:绑定到攻击者邮箱(
- 将两个数据包放入Burp Suite的同一Group
- 准备两个数据包:
-
并发发送:
- 使用并发请求使服务器同时处理两个绑定操作
- 利用时间差使验证邮件发送到攻击者邮箱而非目标邮箱
-
验证结果:
- 检查攻击者邮箱是否收到验证链接
- 完成验证后账户将绑定目标邮箱
三、时间戳重置密码漏洞
漏洞场景
- 目标:获取用户carlos的有效密码重置令牌
- 特点:令牌生成基于时间戳,但加密实现存在缺陷
利用步骤
-
令牌分析:
- 观察多封重置邮件,发现令牌长度固定但内容不同
- 推断令牌可能基于时间戳+计数器生成
-
构造并发请求:
- 获取新的Cookie和CSRF令牌(因PHP会话限制)
- 准备两个密码重置请求:
- 请求1:为攻击者账户
- 请求2:为carlos账户
- 确保两个请求使用相同的时间戳
-
关键技巧:
- 通过GET请求获取新的会话Cookie和CSRF
- 将获取的凭证用于POST请求
- 使用Burp Suite的Group功能并发发送
-
利用结果:
- 成功使两个账户获得相同的重置令牌
- 使用该令牌修改carlos账户密码
技术原理
- PHP会话处理是串行的,需要新会话绕过限制
- 并发请求确保时间戳相同,使令牌生成算法产生相同输出
- 独立user参数使不同账户可共享相同令牌
四、部分构造注册绕过漏洞
漏洞场景
- 目标:绕过邮箱域名限制(
@ginandjuice.shop)注册账户 - 限制:前端和后端都验证邮箱格式
利用步骤
-
初始分析:
- 正常注册被限制为特定域名邮箱
- 直接并发注册请求无效
-
发现漏洞点:
- 检查
user.js发现/confirm端点 - 尝试数组注入:
/confirm?token[]= - 返回"Incorrect token: Array",表明PHP数组处理
- 检查
-
构造Turbo Intruder攻击:
def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=1, engine=Engine.BURP2) confirmationReq = '''POST /confirm?token[]= HTTP/2 Host: target.web-security-academy.net Cookie: phpsessionid=xxx Content-Length: 0''' for attempt in range(20): currentAttempt = str(attempt) username = 'User' + currentAttempt engine.queue(target.req, username, gate=currentAttempt) for i in range(50): engine.queue(confirmationReq, gate=currentAttempt) engine.openGate(currentAttempt) -
执行攻击:
- 发送大量并发注册和确认请求
- 通过响应长度筛选成功的注册
技术原理
- 利用PHP将
token[]=解析为数组的特性 - 大量并发请求增加绕过校验的概率
- 未初始化的token可能与空数组匹配
五、文件上传竞争漏洞
漏洞场景
- 目标:上传PHP Web shell并读取
/home/carlos/secret - 限制:文件类型检查在临时存储之后
漏洞代码分析
$target_file = $target_dir . $_FILES["avatar"]["name"];
move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file);
if(checkViruses($target_file) && checkFileType($target_file)) {
echo "The file has been uploaded.";
} else {
unlink($target_file); // 检查失败后删除
echo "Sorry, error uploading file.";
}
利用步骤
-
分析上传流程:
- 文件先被移动到目标目录(
/files/avatars/) - 然后进行病毒和类型检查
- 检查失败才会删除文件
- 文件先被移动到目标目录(
-
构造竞争条件:
- 准备两个请求:
- 请求1:上传PHP Web shell
- 请求2:访问上传的文件
- 并发发送这两个请求
- 准备两个请求:
-
利用窗口:
- 在文件被删除前快速访问
- 多次尝试直到成功执行Web shell
六、防御措施
-
原子操作:
- 使用数据库事务确保操作完整性
- 文件上传应先验证后存储
-
同步机制:
- 对关键操作使用互斥锁
- 实现请求队列处理
-
输入验证:
- 在操作前严格验证所有参数
- 避免将未验证数据写入存储
-
令牌设计:
- 重置令牌应包含用户唯一信息
- 使用强随机数生成令牌
-
文件上传:
- 先验证后存储
- 使用不可执行目录存储上传文件
- 重命名上传文件
七、高级技巧总结
-
会话处理:
- 在PHP环境中,获取新会话绕过串行限制
- 并发请求需使用相同时间戳
-
参数注入:
- 利用PHP数组特性(
param[]=value) - 测试边界条件和非预期输入
- 利用PHP数组特性(
-
时间窗口:
- 精确计算操作之间的时间差
- 自动化工具增加利用成功率
-
流量分析:
- 检查所有JS文件和隐藏端点
- 分析前后端验证差异
通过深入理解这些技术和原理,安全研究人员可以更有效地发现和利用条件竞争漏洞,同时也帮助开发人员构建更安全的应用程序。