競合状態とリクエストスマグリング
競合 / スマグリングには、タイミングに依存する攻撃と HTTP のプロトコルレベルの攻撃向けに、二つの専用ツールがあります。
競合状態
競合タブは同じエンドポイントへリクエストの複数のコピーを同時に送り、各並列実行のレスポンスと時間を比較できます。
使用する場面
- TOCTOU(チェック時点 / 使用時点):並行リクエストによって、チェックと状態変更操作を切り離せるかをテストします。
- アカウント操作:残高変更、クーポン利用、上限付きの操作を並行して送信し、二重支払いや過剰利用をテストします。
- 投票制限やレート制限の回避:ユーザーごとの制限がアトミックに適用されるかを確認します。
競合テストの実行
- 対象リクエストを競合タブで作成するか、競合タブに送ります。
- 同時実行数を設定します。これは並列に送るコピーの数です。
- リクエストを送信ボタン(リクエスト数も表示されます)をクリックします。すべてのコピーが可能な限り同時に送信されます。
- レスポンステーブルで、各コピーのステータスコード、ボディ、経過時間を確認します。
- レスポンス間の違い(異なるステータスコード、異なるボディ、2 番目以降のコピーの予期しない成功)は、競合が発生する時間枠の存在を示します。
HTTP/2 のシングルパケット競合
対象が HTTP/2 に対応している場合、H2 単一パケットモードを有効にします。HTTP/2 はすべての並列リクエストを一つの接続上で多重化し、ネットワークの揺らぎをなくして、サーバーへの同時到着をより確実にします。
HTTP リクエストスマグリング
スマグリングタブは、不明確な Content-Length と Transfer-Encoding ヘッダーをサーバーがどう処理するかテストし、フロントエンドとバックエンドの同期ずれを検出します。
背景
リバースプロキシとバックエンドサーバーで、あるリクエストの終わりと次のリクエストの始まりの解釈が異なると、リクエスト A に紛れ込ませたリクエストの先頭部分がリクエスト B の先頭に付加されることがあります。影響はキャッシュポイズニングから認証回避、任意リクエストの注入まで及びます。
同期ずれの種類
| 種類 | 説明 |
|---|---|
| CL.TE | フロントエンドは Content-Length、バックエンドは Transfer-Encoding を使用 |
| TE.CL | フロントエンドは Transfer-Encoding、バックエンドは Content-Length を使用 |
| TE.TE | 両方が Transfer-Encoding を使用するが、難読化されたヘッダーの処理が異なる |
スマグリングプローブの実行
- スマグリングタブで対象エンドポイントを選びます。
- テストする同期ずれの種類を選びます。
- スマグリングの検査を実行をクリックします。ツールが細工したリクエストを送り、レスポンスを測定します。
- シーケンス内の二番目のリクエストのタイムアウトや予期しないレスポンスは、同期ずれの可能性を示します。
- 指摘事項を作成する前に手動で確認してください。プローブとは無関係なネットワーク状況でタイムアウトした場合にも、誤検知が発生します。