Rate Limit Bypass

Reading time: 10 minutes

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

应尝试对目标端点的变体进行暴力攻击,例如 /api/v3/sign-up,包括类似 /Sing-up/SignUp/singup/api/v1/sign-up/api/sign-up 等替代方案。

Incorporating Blank Characters in Code or Parameters

在代码或参数中插入空字节,如 %00%0d%0a%0d%0a%09%0C%20 可以是一种有效策略。例如,将参数调整为 code=1234%0a 允许通过输入的变体扩展尝试,例如在电子邮件地址中添加换行符以绕过尝试限制。

Manipulating IP Origin via Headers

修改头部以改变感知的 IP 来源可以帮助规避基于 IP 的速率限制。可以调整 X-Originating-IPX-Forwarded-ForX-Remote-IPX-Remote-AddrX-Client-IPX-HostX-Forwared-Host 等头部,包括使用多个 X-Forwarded-For 实例,以模拟来自不同 IP 的请求。

bash
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

更改其他头部

建议更改其他请求头,例如用户代理和 cookies,因为这些也可以用于识别和跟踪请求模式。更改这些头部可以防止识别和跟踪请求者的活动。

利用 API 网关行为

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

在每次尝试之前登录到您的帐户

在每次尝试或每组尝试之前登录到帐户,可能会重置速率限制计数器。这在测试登录功能时尤其有用。利用像 Burp Suite 这样的工具中的 Pitchfork 攻击,在每几次尝试中轮换凭据,并确保跟随重定向被标记,可以有效地重启速率限制计数器。

利用代理网络

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

在不同帐户或会话之间分散攻击

如果目标系统在每个帐户或每个会话的基础上应用速率限制,将攻击或测试分散到多个帐户或会话可以帮助避免检测。这种方法需要管理多个身份或会话令牌,但可以有效地分散负载,以保持在允许的限制内。

继续尝试

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


滥用 HTTP/2 多路复用和请求流水线 (2023-2025)

现代速率限制器实现通常计算 TCP 连接(甚至单个 HTTP/1.1 请求),而不是连接包含的 HTTP/2 流的数量。当重用相同的 TLS 连接时,攻击者可以打开数百个并行流,每个流携带一个单独的请求,而网关只从配额中扣除 一个 请求。

bash
# 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

如果限流器仅保护 /verify 而不保护 /api/v2/verify,您还可以将 路径混淆 与 HTTP/2 多路复用结合使用,以实现 极高 速度的 OTP 或凭证暴力破解。

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

GraphQL 别名和批处理操作

GraphQL 允许客户端通过使用 别名 在单个请求中发送 多个逻辑上独立的查询或变更。因为服务器执行每个别名,但限流器通常只计算 一个 请求,这对于登录或密码重置限流是一个可靠的绕过方法。

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

查看响应:只有一个别名在正确的代码被触发时会返回 200 OK,而其他的则受到速率限制。

该技术在 2023 年由 PortSwigger 对“GraphQL 批处理和别名”的研究中被推广,并且已导致许多最近的漏洞赏金支付。

滥用 batchbulk REST 端点

一些 API 暴露辅助端点,例如 /v2/batch 或在请求体中接受 对象数组。如果限制器仅放置在 legacy 端点前面,将多个操作包装在单个批量请求中可能完全绕过保护。

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

定时滑动窗口

经典的令牌桶或漏桶限流器 重置 在固定的时间边界上(例如,每分钟)。如果窗口已知(例如,通过错误消息如 X-RateLimit-Reset: 27),在桶重置 之前 发起最大允许的请求数量,然后立即发起另一个完整的突发请求。

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

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


工具

  • https://github.com/Hashtag-AMIN/hashtag-fuzz: 支持头部随机化、分块词汇表和轮询代理旋转的模糊测试工具。
  • https://github.com/ustayready/fireprox: 自动创建一次性 AWS API Gateway 端点,使每个请求都来自不同的 IP 地址 – 非常适合击败基于 IP 的限流。
  • Burp Suite – IPRotate + 扩展: 在 IntruderTurbo Intruder 攻击期间,使用 SOCKS/HTTP 代理(或 AWS API Gateway)池透明地旋转源 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