race

GitHub

提供竞态条件(Race Condition)和TOCTOU漏洞的测试方案。涵盖单包攻击、HTTP/1.1管道化等技术,用于检测礼品卡、优惠券、余额扣除等场景下的并发逻辑缺陷及文件上传竞争问题。

skills/race/SKILL.md PentesterFlow/agent

Trigger Scenarios

礼品卡或促销代码重复兑换 余额转账或扣款的并发请求 一次性验证码的并行尝试 文件上传与读取的竞争操作 需要验证时间敏感逻辑的业务场景

Install

npx skills add PentesterFlow/agent --skill race -g -y
More Options

Use without installing

npx skills use PentesterFlow/agent@race

指定 Agent (Claude Code)

npx skills add PentesterFlow/agent --skill race -a claude-code -g -y

安装 repo 全部 skill

npx skills add PentesterFlow/agent --all -g -y

预览 repo 内 skill

npx skills add PentesterFlow/agent --list

SKILL.md

Frontmatter
{
    "name": "race",
    "description": "Race condition \/ TOCTOU playbook — limit overrun (one-time codes used twice, gift cards spent twice), single-packet attack (last-byte sync) to force parallel processing, and state-confusion races (file upload + read, order before payment). Use when timing-sensitive logic could be abused — one-time codes, coupons\/gift cards, balance or limit checks, double-spend.",
    "allowed-tools": [
        "http",
        "shell",
        "file_write"
    ]
}

Race / TOCTOU playbook

Confirm the target is in scope for stress-style testing (multiple parallel requests can look like abuse). Then identify the candidate operation.

Execution rule: capture a real request for the operation and replay that request with concrete cookies/body values. Never write literal placeholders such as <sess> to files; ask once if a session or replayable request is missing.

Targets worth racing

  • Redeem a gift card / promo code (does the second redeem succeed?)
  • Cast a vote / claim a one-per-user reward
  • Withdraw / transfer balance (does it deduct twice?)
  • Submit a 2FA code (can N parallel guesses each be checked against an unused-attempts counter?)
  • Apply a discount that's supposed to be once-per-cart
  • Send a friend / invite request (creates duplicate rows / privileges)
  • Confirm an email (mark verified twice with different addresses)
  • Upload then read a file (write safe.png, then race a swap to evil.svg before AV scans)

1. Burp-style "single packet attack" (last-byte sync) — preferred

Modern servers buffer HTTP/2 frames. The classic trick: send N requests where each is fully serialized except the last byte. Then in a single TCP write, flush the final byte of all N. The server receives them effectively simultaneously and dispatches them in parallel — bypassing nearly all software-side rate limiting.

You can do this with a small Go/Python script. Skeleton (Python, HTTP/2):

import asyncio, ssl
import httpx

async def main():
    transport = httpx.AsyncHTTPTransport(http2=True)
    async with httpx.AsyncClient(transport=transport, verify=False) as c:
        # Build N partial requests, then race the last byte.
        # In practice: use turbo-intruder or a Go h2 client for byte-level control.
        ...
asyncio.run(main())

For the highest-fidelity version, use Burp Suite's Turbo Intruder (race-single-packet-attack.py template) — it's the de facto tool. The shell tool can run it if installed.

2. Fallback: HTTP/1.1 pipelined burst

If HTTP/2 isn't available, fire N requests over a single keep-alive connection back-to-back without waiting for responses:

# 50 parallel uses of the same coupon code
seq 50 | xargs -P 50 -I{} curl -s -X POST https://target/redeem \
  -H 'Cookie: session=<sess>' \
  -d 'code=GIFT100'

Less reliable than single-packet but often enough.

3. Confirm a race actually happened

For each candidate operation, measure the invariant twice:

  • Before: query balance / count / state.
  • Fire N parallel requests.
  • After: query balance / count / state.

If invariant differs by more than 1× the per-request delta, you have a race. Example: gift card worth $50, used 5× before lockout → $250 credit. Confirmed.

4. TOCTOU on file/auth flows

Time-Of-Check / Time-Of-Use bugs:

  • Upload + scan + serve: race the swap between AV scan and final write.
  • "Is admin?" check on session, then long-running task that uses the role: race a logout/role-change between the check and the use.
  • Symlink race on file-write tools that write through user-supplied paths.

5. Mitigation patterns (so you know what defeats you)

If you see any of these, the race probably isn't winnable — refocus:

  • SELECT ... FOR UPDATE / explicit row lock.
  • Optimistic concurrency: every update carries a version field that's CAS'd.
  • Idempotency keys on the request: server stores the key+result and replays.
  • UNIQUE (user_id, code_id) constraint with ON CONFLICT DO NOTHING.

Reporting

Required for a credible finding:

  • The exact race window measured (N=50, mean=20ms apart).
  • Before / after invariant query results.
  • Concrete impact: "$X credit overspent" / "Y duplicate privileged rows created" / "Z brute-force guesses processed before lockout".

A race with no measurable impact (e.g., creates a second pending order that the next cron job dedupes) is info at best.

Version History

  • 117c95c Current 2026-07-22 09:38

Same Skill Collection

skills/_template/SKILL.md
skills/deserialize/SKILL.md
skills/graphql/SKILL.md
skills/jwt/SKILL.md
skills/recon/SKILL.md
skills/ssrf/SKILL.md
skills/ssti/SKILL.md
skills/supabase/SKILL.md
skills/takeover/SKILL.md
skills/webvuln/SKILL.md

Metadata

Files
0
Version
117c95c
Hash
2bd287d2
Indexed
2026-07-22 09:38

ホーム - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-22 20:34
浙ICP备14020137号-1 $お客様$