diff --git a/src/pentesting-web/rate-limit-bypass.md b/src/pentesting-web/rate-limit-bypass.md index 4e94e74f5..24ef00326 100644 --- a/src/pentesting-web/rate-limit-bypass.md +++ b/src/pentesting-web/rate-limit-bypass.md @@ -46,14 +46,72 @@ X-Forwarded-For: 127.0.0.1 ### 異なるアカウントやセッションに攻撃を分散させる -ターゲットシステムがアカウントまたはセッションごとにレート制限を適用する場合、攻撃やテストを複数のアカウントやセッションに分散させることで、検出を回避するのに役立ちます。このアプローチは複数のアイデンティティやセッショントークンを管理する必要がありますが、許可された制限内に留まるために負荷を効果的に分散させることができます。 +ターゲットシステムがアカウントまたはセッションごとにレート制限を適用する場合、攻撃やテストを複数のアカウントやセッションに分散させることで、検出を回避するのに役立ちます。このアプローチは複数のアイデンティティやセッショントークンを管理する必要がありますが、許容範囲内に負荷を分散させることができます。 ### 続けて試す -レート制限が存在していても、有効なOTPが送信されたときに応答が異なるかどうかを確認することをお勧めします。[**この投稿**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732)では、バグハンターが20回の不成功な試行の後に401で応答されるとレート制限が発動しても、有効なものが送信された場合には200の応答が受信されることを発見しました。 +レート制限が存在していても、有効なOTPが送信されたときに応答が異なるかどうかを確認することをお勧めします。[**この投稿**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732)では、バグハンターが20回の不成功な試行の後にレート制限がトリガーされ、401で応答された場合でも、有効なものが送信されたときには200の応答が受信されたことを発見しました。 -### ツール +--- -- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): hashtag-fuzzは、WAFやCDNをテストおよび回避するために設計されたファジングツールです。ランダムなUser-Agentやヘッダー値、ランダムな遅延、マルチスレッド処理、単語リストの選択的チャンク化、各チャンクのラウンドロビンプロキシ回転などの高度な機能を活用することで、ウェブアプリケーションの脆弱性を特定しようとするセキュリティ専門家にとって堅牢なソリューションを提供します。 +### HTTP/2のマルチプレクシングとリクエストパイプライニングの悪用 (2023-2025) + +現代のレートリミッターの実装は、接続に含まれる**TCP接続**(または個々のHTTP/1.1リクエスト)を数えることが多く、接続が持つ*HTTP/2ストリームの数*を数えることはありません。同じTLS接続が再利用されると、攻撃者は数百の並行ストリームを開くことができ、それぞれが別々のリクエストを運びますが、ゲートウェイは*1つ*のリクエストのみをクォータから差し引きます。 +```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](https://portswigger.net/research/turbo-intruder) は HTTP/2 をサポートしており、`maxConcurrentConnections` と `requestsPerConnection` を微調整してこの攻撃を自動化できます。 + +### GraphQL エイリアスとバッチ処理 + +GraphQL は、クライアントが **複数の論理的に独立したクエリまたはミューテーションを単一のリクエストで送信する** ことを可能にし、それらを *エイリアス* で接頭辞を付けます。サーバーはすべてのエイリアスを実行しますが、レートリミッターはしばしば *1* 回のリクエストのみをカウントするため、これはログインやパスワードリセットのスロットリングを回避するための信頼できる方法です。 +```graphql +mutation bruteForceOTP { +a: verify(code:"111111") { token } +b: verify(code:"222222") { token } +c: verify(code:"333333") { token } +# … add up to dozens of aliases … +} +``` +正しいコードがヒットしたとき、正確に1つのエイリアスが200 OKを返し、他はレート制限されます。 + +この技術は、2023年にPortSwiggerの「GraphQLバッチ処理とエイリアス」に関する研究によって普及し、多くの最近のバグバウンティの支払いに寄与しています。 + +### *バッチ*または*バルク* RESTエンドポイントの悪用 + +一部のAPIは、`/v2/batch`のようなヘルパーエンドポイントを公開したり、リクエストボディに**オブジェクトの配列**を受け入れたりします。制限が*レガシー*エンドポイントの前にのみ配置されている場合、複数の操作を単一のバルクリクエスト内にラップすることで、保護を完全に回避できる可能性があります。 +```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 ‑->| +###### ###### +``` +このシンプルな最適化により、他のバイパステクニックに触れることなく、スループットを2倍以上に増やすことができます。 + +--- + +## ツール + +- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): ヘッダーのランダム化、チャンク化された単語リスト、ラウンドロビンプロキシの回転をサポートするファジングツール。 +- [**https://github.com/ustayready/fireprox**](https://github.com/ustayready/fireprox): すべてのリクエストが異なるIPアドレスから発信されるように、使い捨てのAWS API Gatewayエンドポイントを自動的に作成します - IPベースのスロットリングを打破するのに最適です。 +- **Burp Suite – IPRotate + 拡張機能**: *Intruder*および*Turbo Intruder*攻撃中に、ソースIPを透過的に回転させるためにSOCKS/HTTPプロキシ(またはAWS API Gateway)のプールを使用します。 +- **Turbo Intruder (BApp)**: HTTP/2のマルチプレクシングをサポートする高性能攻撃エンジン; `requestsPerConnection`を100-1000に調整して、数百のリクエストを単一の接続にまとめます。 + +## 参考文献 + +- PortSwigger Research – “GraphQLエイリアスを使用したレート制限のバイパス” (2023) +- PortSwigger Research – “HTTP/2: 続編は常に悪化する” (セクション *接続ベースのスロットリング*) (2024) {{#include ../banners/hacktricks-training.md}}