竞争条件是现代应用中最具破坏性的安全漏洞之一,然而自动化扫描器对此类问题的覆盖依然不足。Nuclei、ffuf、sqlmap等工具擅长发现静态漏洞,但从根本上无法识别基于并发的安全问题。
渗透测试人员面临两难选择:要么为每次测试手动编写一次性脚本,要么完全跳过竞争条件测试。这两种方案都不可扩展,也不够专业。
RatRace 通过提供一个精致且可重复的竞争条件测试工作流解决了这一难题——将以往临时拼凑的脚本过程转变为系统化的流程,可与CI/CD流水线集成,并生成专业报告。
竞争条件漏洞经常出现在高影响领域:
这些漏洞在漏洞赏金项目中通常获得最高赏金,因为它们直接威胁到企业收入和客户信任。
用YAML定义竞争场景一次,即可在多个项目中复用。格式仿照Nuclei模板,便于上手:
id: checkout-race
info:
name: 下单重复竞争
severity: critical
race:
mode: burst
concurrency: 20
request:
method: POST
path: /api/v1/checkout
headers:
Authorization: "Bearer {{session}}"
body: '{"item_id": "SKU-001"}'
validate:
follow_up:
method: GET
path: /api/v1/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals
value: 1
爆发模式 — 基于goroutine的并行请求,精确同步(稳定,生产就绪)
最后字节同步 — HTTP/1.1 TCP层攻击(实现就绪,测试阶段)
单包模式 — 基于HTTP/2帧的攻击(实现就绪,测试阶段)
RatRace自动执行:
equals、not_equals、greater_than、contains导入现有请求:
# 从curl命令导入
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o template.yaml
# 从Burp导出的HAR文件导入
ratrace import --har session.har -o template.yaml
CI/CD自动化:
ratrace race -u $TARGET -t template.yaml --silent
echo $? # 退出码10=发现竞争,0=未发现
专业报告生成:
# JSON格式用于自动化
ratrace race -u $TARGET -t template.yaml -o results/
# HTML报告(计划V2)
ratrace report --input results.json --format html
git clone https://github.com/bogdanticu88/ratrace.git
cd ratrace
go build ./cmd/ratrace
./ratrace --help
要求: Go 1.24+
docker build -t ratrace:latest .
docker run --rm -it ratrace:latest race -u https://api.example.com -t template.yaml
# 1. 从curl导入或使用现有模板
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o checkout.yaml
# 2. 执行竞争测试
ratrace race -u https://api.example.com -t checkout.yaml -m burst -c 20
# 3. 查看发现结果
# 输出显示:
# 🔴 [严重] 下单重复竞争
# 异常率: 91.7%
# 置信度: 84%
ratrace race \
-u https://shop.example.com \
-t examples/templates/checkout-race.yaml \
-m burst \
-c 25 \
--output results/
# 运行时不输出详细日志,以语义退出码退出
ratrace race -u https://api.example.com -t template.yaml --silent
# 检查退出码
if [ $? -eq 10 ]; then
echo "发现竞争条件!"
exit 1
fi
ratrace race -u <url> -t <template> [options]
选项:
-m, --mode string burst|lastbyte|singlepacket(默认使用模板中的设置)
-c, --concurrency int Goroutine数量(默认20)
-H, --header strings 自定义请求头(可重复)
-x, --proxy string 请求使用的代理URL
-o, --output string 结果输出目录
--timeout duration 请求超时(默认10s)
--insecure 跳过TLS证书验证
--dry-run 解析模板后退出
--silent 抑制日志,仅显示发现结果
ratrace import [--curl <command> | --har <file>] -o <output.yaml>
将现有请求(curl命令或HAR导出)转换为RatRace模板。
适用于与现有工作流集成。
ratrace report --input results.json --format [html|json] --output report.html
从竞争测试结果生成人类可读的报告。
ratrace ratelimit -u <url> -c <concurrency>
测试端点是否容易受到并发速率限制绕过攻击。
模板是定义竞争场景的YAML文件。完整参考:
id: unique-identifier
info:
name: "人类可读的名称"
severity: critical|high|medium|low|info
tags: [tag1, tag2]
race:
mode: burst|lastbyte|singlepacket
concurrency: 20
request:
method: POST|GET|PUT|DELETE|PATCH
path: /api/endpoint
headers:
Authorization: "Bearer {{token}}"
Custom-Header: "value"
body: '{"json": "body", "user": "{{user_id}}"}'
validate:
follow_up:
method: GET
path: /api/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals|greater_than|contains|not_equals
value: 1
变量(使用 {{name}} 占位符):
ratrace race ... -H "Authorization: Bearer {{session_token}}"清晰、颜色编码的日志显示测试进度:
[INF] 加载模板 path=checkout-race.yaml
[INF] 模板已加载 id=checkout-race mode=burst
[RUN] 发起爆发攻击 concurrency=20
[INF] 所有请求完成 total=20
[RUN] 聚类响应 baseline=17 anomalous=3
[RACE] 检测到竞争条件 anomaly_rate=15% confidence=94%
[CONF] 验证通过 field=orders.length expected=1
[INF] 竞争测试完成 findings=1
Templates: 1 Requests: 20 Time: 3.2s
🔴 [严重] 下单重复竞争
异常率: 15.0%
置信度: 94%
状态差异: 201 → 200
字段差异: order_id (100 → 101)
完整结果保存到 results_<timestamp>.json,用于自动化和存档:
{
"TemplateID": "checkout-race",
"Target": "https://api.example.com/api/v1/checkout",
"Mode": "burst",
"Concurrency": 20,
"TotalRequests": 20,
"Duration": 3200000000,
"Findings": [
{
"TemplateName": "下单重复竞争",
"Severity": "critical",
"AnomalyRate": 0.15,
"Confidence": 0.94,
"Diff": {
"StatusChanged": true,
"BaselineStatus": 201,
"AnomalousStatus": 200
}
}
]
}
用于CI/CD集成和自动化:
make build # 编译二进制文件
make test # 全部测试
make test-unit # 仅单元测试
make test-int # 集成测试
make coverage # 覆盖率报告(HTML)
make lint # 运行代码检查器
make run-race # 构建并运行示例
cmd/ratrace/
└── main.go 入口点,CLI定义
internal/
├── cmd/ 子命令实现
├── engine/ 竞争攻击模式(burst, lastbyte, singlepacket)
├── validator/ 响应聚类、差异对比、后续检查
├── importer/ HAR和curl解析器
├── reporter/ JSON和HTML输出
├── template/ YAML解析与模板引擎
├── log/ 结构化彩色日志
└── models/ 共享数据类型
欢迎提交Issue、PR和模板贡献。请确保:
make testmake lintMIT
RatRace专为授权安全测试、漏洞赏金计划和渗透测试设计。仅在你拥有或已获得明确书面许可的系统上使用。 未经授权测试他人系统属违法行为。
Bogdan Ticu — 安全研究与工程
如有问题、疑问或安全报告,请访问:GitHub Issues
| 码 | 含义 |
|---|
| 0 | 成功 — 未发现竞争条件 |
| 3 | 数据错误 — 模板未找到、解析错误 |
| 4 | 执行错误 — 网络故障、引擎错误 |
| 10 | 发现竞争条件 — 需要处理 |
| 11 | 确认速率限制绕过 |
| 12 | 检测到异常但验证无结论 |