Rate Limit Bypass

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

Rate limit bypass techniques

Exploring Similar Endpoints

应尝试对目标端点的不同变体进行 brute force attacks,例如 /api/v3/sign-up,包括诸如 /Sing-up/SignUp/singup/api/v1/sign-up/api/sign-up 等替代路径。

Incorporating Blank Characters in Code or Parameters

在 code 或参数中插入像 %00%0d%0a%0d%0a%09%0C%20 这样的空字节,可能是个有用的策略。例如,将参数调整为 code=1234%0a 可以通过输入变体来扩展尝试,例如在电子邮件地址中加入换行字符以绕过尝试次数限制。

Manipulating IP Origin via Headers

修改请求头以改变感知到的 IP 来源,可以帮助规避基于 IP 的 rate limiting。像 X-Originating-IPX-Forwarded-ForX-Remote-IPX-Remote-AddrX-Client-IPX-HostX-Forwared-Host 这样的 headers(包括使用多个 X-Forwarded-For 实例)可以被调整为模拟来自不同 IP 的请求。

X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Host: 127.0.0.1
X-Forwared-Host: 127.0.0.1

# Double X-Forwarded-For header example
X-Forwarded-For:
X-Forwarded-For: 127.0.0.1

更改其他请求头

建议修改其他请求头,例如 user-agent 和 cookies,因为这些也可用于识别和追踪请求模式。更改这些请求头可以防止识别并跟踪请求者的活动。

利用 API Gateway 行为

一些 API Gateway 被配置为根据 endpoint 和参数的组合来应用速率限制。通过改变参数值或向请求添加无关紧要的参数,可以绕过网关的速率限制逻辑,使每个请求看起来都是唯一的。例如 /resetpwd?someparam=1

在每次尝试前登录你的账户

在每次尝试或每组尝试前登录账户可能会重置速率限制计数器。这在测试登录功能时尤其有用。使用像 Burp Suite 这样的工具实施 Pitchfork attack,在每几次尝试后轮换凭据并确保启用 follow redirects,可以有效重置速率限制计数器。

使用代理网络

部署代理网络,将请求分散到多个 IP 地址,可以有效绕过基于 IP 的速率限制。通过通过各个代理路由流量,每个请求看起来都来自不同来源,从而削弱速率限制的效果。

将攻击分散到不同账户或会话

如果目标系统按每个账户或每个会话施加速率限制,将攻击或测试分散到多个账户或会话可以帮助规避检测。该方法需要管理多个身份或会话令牌,但可以有效分配负载以保持在允许的限制内。

继续尝试

请注意,即使存在速率限制,也应尝试在发送有效 OTP 时查看响应是否不同。在 这篇文章 中,该漏洞猎人发现,即使在 20 次失败尝试后触发了速率限制并以 401 响应,如果发送了有效的 OTP,会收到 200 响应。


滥用 HTTP/2 multiplexing & request pipelining (2023-2025)

现代的 rate–limiter 实现通常统计的是 TCP connections(甚至是单个 HTTP/1.1 请求),而不是连接包含的 number of HTTP/2 streams。当重用相同的 TLS 连接时,攻击者可以打开数百个并行流,每个流都携带独立请求,而网关只从配额中扣除 one 请求。

# Send 100 POST requests in a single HTTP/2 connection with curl
seq 1 100 | xargs -I@ -P0 curl -k --http2-prior-knowledge -X POST \
-H "Content-Type: application/json" \
-d '{"code":"@"}' https://target/api/v2/verify &>/dev/null

如果 limiter 只保护 /verify 而不保护 /api/v2/verify,你也可以将 path confusion 与 HTTP/2 多路复用结合,用于 极其 高速的 OTP 或 credential brute-forcing。

🐾 提示: PortSwigger’s Turbo Intruder 支持 HTTP/2,允许你微调 maxConcurrentConnectionsrequestsPerConnection 来自动化此攻击。

GraphQL aliases & 批量操作

GraphQL 允许客户端通过在请求前添加 aliases,在单个请求中发送 多个在逻辑上独立的 queries 或 mutations。因为服务器会执行每个 alias,但 rate-limiter 常常只将它们计为一次请求,所以这是一种可靠的绕过 login 或 password-reset throttling 的方法。

mutation bruteForceOTP {
a: verify(code:"111111") { token }
b: verify(code:"222222") { token }
c: verify(code:"333333") { token }
# … add up to dozens of aliases …
}

查看响应:当命中正确的代码时,恰好只有一个 alias 会返回 200 OK,而其他的则被 rate-limited。

该技术由 PortSwigger 在 2023 年关于 “GraphQL batching & aliases” 的研究推广,并导致了许多近期的 bug-bounty 支付。

滥用 batchbulk REST endpoints

一些 API 暴露了辅助端点,例如 /v2/batch,或者在请求体中接受 对象数组。如果限流器只放在 legacy 端点之前,将多个操作包装在单个 bulk 请求内可能会完全绕过该防护。

[
{"path": "/login", "method": "POST", "body": {"user":"bob","pass":"123"}},
{"path": "/login", "method": "POST", "body": {"user":"bob","pass":"456"}}
]

为 sliding-window 定时

一个经典的 token-bucket 或 leaky-bucket 限速器会在固定时间边界上 重置(例如,每分钟)。如果该窗口已知(例如通过错误信息如 X-RateLimit-Reset: 27),在 bucket 重置 之前 发送允许的最大数量的请求,然后立刻再发起另一轮完整的突发请求。

|<-- 60 s window ‑->|<-- 60 s window ‑->|
######                 ######

这个简单的优化可以在不触及任何其他 bypass technique 的情况下将吞吐量提高一倍以上。

升级到 WebSockets / gRPC streaming after the handshake

许多 edge rate-limiters 只检查 initial HTTP request。一旦连接升级为 WebSocket (HTTP 101) 或 gRPC bidirectional streaming,后续消息通常会绕过 request-per-second counters,因为它们不再是独立的 HTTP requests。Cloudflare 的文档指出,只有初始升级请求受到 WAF/rate-limiting 规则的约束;之后发送的 frames 是不透明的。

实践工作流程:

# Flood 1,000 OTP guesses through a single WebSocket connection
seq -w 000000 000999 | websocat -n ws://target.tld/api/verify-ws

# gRPC streaming: send multiple Verify requests in one stream
grpcurl -d @ -plaintext target.tld:50051 service.VerifyOTP/Stream <<'EOF'
{ "code": "111111" }
{ "code": "222222" }
{ "code": "333333" }
EOF

如果 login/OTP endpoint 同时暴露 HTTP 和 WebSocket/gRPC 变体,先建立升级后的通道,然后在该单一连接内 spray codes,以规避每次请求的限速。

利用 CDN PoP 分片计数器

一些 CDN 会按数据中心/PoP 对限速计数器进行分片,而不是全局共享。Cloudflare 明确说明计数器不会在数据中心之间共享。通过将请求路由到多个区域的出口节点(residential proxy pools, anycast VPNs, or cloud VMs pinned to different continents),你可以成倍增加允许的吞吐量:每个 PoP 都为相同的 key 维护独立的桶。

Quick and dirty layout using open proxies (example with proxychains + a country‑rotating list):

for p in $(cat proxies.txt); do
HTTPS_PROXY=$p curl -s -X POST https://target/api/login -d @payload.json &
done
wait

确保 limiter key 不是 per-account;否则也要轮换 user IDs / session tokens。


工具

  • https://github.com/Hashtag-AMIN/hashtag-fuzz: Fuzzing tool,支持头部随机化、分块字典和轮询代理轮换。
  • https://github.com/ustayready/fireprox: 自动创建一次性 AWS API Gateway 端点,使每个请求都来自不同的 IP 地址 —— 非常适合绕过基于 IP 的限流。
  • Burp Suite – IPRotate + extension: 使用一组 SOCKS/HTTP 代理(或 AWS API Gateway)在 IntruderTurbo Intruder 攻击期间透明地轮换源 IP。
  • Turbo Intruder (BApp): 高性能攻击引擎,支持 HTTP/2 多路复用;将 requestsPerConnection 调整为 100-1000 可将数百个请求合并到单个连接中。

参考

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks