条件竞争的骚操作(二)
字数 1851 2025-08-23 18:31:24

条件竞争漏洞高级利用技术详解

一、条件竞争基础概念

条件竞争(Race Condition)是指当多个线程或进程同时访问共享资源时,由于执行顺序的不确定性导致程序出现非预期行为的安全漏洞。在Web安全中,这类漏洞通常出现在并发请求处理不当时。

二、邮箱绑定绕过验证漏洞

漏洞场景

  • 目标:将carlos@ginandjuice.shop绑定到当前账户,绕过邮箱验证
  • 限制:网站每次只存储一个待处理的电子邮件地址

利用步骤

  1. 分析流程

    • 提交更改邮件请求时,数据库会直接编辑邮件地址
    • 第二个绑定相同邮箱的请求会显示"This link is invalid"
  2. 构造竞争条件

    • 准备两个数据包:
      • 数据包1:绑定到攻击者邮箱(wiener%40exploit-...)
      • 数据包2:绑定到目标邮箱(carlos@ginandjuice.shop)
    • 将两个数据包放入Burp Suite的同一Group
  3. 并发发送

    • 使用并发请求使服务器同时处理两个绑定操作
    • 利用时间差使验证邮件发送到攻击者邮箱而非目标邮箱
  4. 验证结果

    • 检查攻击者邮箱是否收到验证链接
    • 完成验证后账户将绑定目标邮箱

三、时间戳重置密码漏洞

漏洞场景

  • 目标:获取用户carlos的有效密码重置令牌
  • 特点:令牌生成基于时间戳,但加密实现存在缺陷

利用步骤

  1. 令牌分析

    • 观察多封重置邮件,发现令牌长度固定但内容不同
    • 推断令牌可能基于时间戳+计数器生成
  2. 构造并发请求

    • 获取新的Cookie和CSRF令牌(因PHP会话限制)
    • 准备两个密码重置请求:
      • 请求1:为攻击者账户
      • 请求2:为carlos账户
    • 确保两个请求使用相同的时间戳
  3. 关键技巧

    • 通过GET请求获取新的会话Cookie和CSRF
    • 将获取的凭证用于POST请求
    • 使用Burp Suite的Group功能并发发送
  4. 利用结果

    • 成功使两个账户获得相同的重置令牌
    • 使用该令牌修改carlos账户密码

技术原理

  • PHP会话处理是串行的,需要新会话绕过限制
  • 并发请求确保时间戳相同,使令牌生成算法产生相同输出
  • 独立user参数使不同账户可共享相同令牌

四、部分构造注册绕过漏洞

漏洞场景

  • 目标:绕过邮箱域名限制(@ginandjuice.shop)注册账户
  • 限制:前端和后端都验证邮箱格式

利用步骤

  1. 初始分析

    • 正常注册被限制为特定域名邮箱
    • 直接并发注册请求无效
  2. 发现漏洞点

    • 检查user.js发现/confirm端点
    • 尝试数组注入:/confirm?token[]=
    • 返回"Incorrect token: Array",表明PHP数组处理
  3. 构造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)
    
  4. 执行攻击

    • 发送大量并发注册和确认请求
    • 通过响应长度筛选成功的注册

技术原理

  • 利用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.";
}

利用步骤

  1. 分析上传流程

    • 文件先被移动到目标目录(/files/avatars/)
    • 然后进行病毒和类型检查
    • 检查失败才会删除文件
  2. 构造竞争条件

    • 准备两个请求:
      • 请求1:上传PHP Web shell
      • 请求2:访问上传的文件
    • 并发发送这两个请求
  3. 利用窗口

    • 在文件被删除前快速访问
    • 多次尝试直到成功执行Web shell

六、防御措施

  1. 原子操作

    • 使用数据库事务确保操作完整性
    • 文件上传应先验证后存储
  2. 同步机制

    • 对关键操作使用互斥锁
    • 实现请求队列处理
  3. 输入验证

    • 在操作前严格验证所有参数
    • 避免将未验证数据写入存储
  4. 令牌设计

    • 重置令牌应包含用户唯一信息
    • 使用强随机数生成令牌
  5. 文件上传

    • 先验证后存储
    • 使用不可执行目录存储上传文件
    • 重命名上传文件

七、高级技巧总结

  1. 会话处理

    • 在PHP环境中,获取新会话绕过串行限制
    • 并发请求需使用相同时间戳
  2. 参数注入

    • 利用PHP数组特性(param[]=value)
    • 测试边界条件和非预期输入
  3. 时间窗口

    • 精确计算操作之间的时间差
    • 自动化工具增加利用成功率
  4. 流量分析

    • 检查所有JS文件和隐藏端点
    • 分析前后端验证差异

通过深入理解这些技术和原理,安全研究人员可以更有效地发现和利用条件竞争漏洞,同时也帮助开发人员构建更安全的应用程序。

条件竞争漏洞高级利用技术详解 一、条件竞争基础概念 条件竞争(Race Condition)是指当多个线程或进程同时访问共享资源时,由于执行顺序的不确定性导致程序出现非预期行为的安全漏洞。在Web安全中,这类漏洞通常出现在并发请求处理不当时。 二、邮箱绑定绕过验证漏洞 漏洞场景 目标:将 carlos@ginandjuice.shop 绑定到当前账户,绕过邮箱验证 限制:网站每次只存储一个待处理的电子邮件地址 利用步骤 分析流程 : 提交更改邮件请求时,数据库会直接编辑邮件地址 第二个绑定相同邮箱的请求会显示"This link is invalid" 构造竞争条件 : 准备两个数据包: 数据包1:绑定到攻击者邮箱( wiener%40exploit-... ) 数据包2:绑定到目标邮箱( carlos@ginandjuice.shop ) 将两个数据包放入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攻击 : 执行攻击 : 发送大量并发注册和确认请求 通过响应长度筛选成功的注册 技术原理 利用PHP将 token[]= 解析为数组的特性 大量并发请求增加绕过校验的概率 未初始化的token可能与空数组匹配 五、文件上传竞争漏洞 漏洞场景 目标:上传PHP Web shell并读取 /home/carlos/secret 限制:文件类型检查在临时存储之后 漏洞代码分析 利用步骤 分析上传流程 : 文件先被移动到目标目录( /files/avatars/ ) 然后进行病毒和类型检查 检查失败才会删除文件 构造竞争条件 : 准备两个请求: 请求1:上传PHP Web shell 请求2:访问上传的文件 并发发送这两个请求 利用窗口 : 在文件被删除前快速访问 多次尝试直到成功执行Web shell 六、防御措施 原子操作 : 使用数据库事务确保操作完整性 文件上传应先验证后存储 同步机制 : 对关键操作使用互斥锁 实现请求队列处理 输入验证 : 在操作前严格验证所有参数 避免将未验证数据写入存储 令牌设计 : 重置令牌应包含用户唯一信息 使用强随机数生成令牌 文件上传 : 先验证后存储 使用不可执行目录存储上传文件 重命名上传文件 七、高级技巧总结 会话处理 : 在PHP环境中,获取新会话绕过串行限制 并发请求需使用相同时间戳 参数注入 : 利用PHP数组特性( param[]=value ) 测试边界条件和非预期输入 时间窗口 : 精确计算操作之间的时间差 自动化工具增加利用成功率 流量分析 : 检查所有JS文件和隐藏端点 分析前后端验证差异 通过深入理解这些技术和原理,安全研究人员可以更有效地发现和利用条件竞争漏洞,同时也帮助开发人员构建更安全的应用程序。