【XXE編】XMLに混ざる悪意の参照とファイル漏洩の経路|CTF思考フレームワーク #17
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 Web脆弱性編 #17 / 公開中 10記事 → シリーズ一覧を見る →
XXE(XML外部実体参照)は、XML処理を行うサーバで、攻撃者が「外部実体」を仕込んでファイル読み取り・SSRF・DoSに持ち込む攻撃。SOAP API、SAML認証、SVGアップロード、Officeファイル(docx/xlsx)処理などXMLが裏に潜む箇所が標的になります📄
XMLは「ただのデータ形式」と侮りがち。でも仕様には「外部のファイルを取り込む」機能が標準で入ってます。
XML仕様を悪用するXXEは、ファイル漏洩からSSRFまで一気に行ける危険な脆弱性です📜

XXEはXML外部実体参照の機能を悪用してサーバ内部のファイルを読む攻撃だよ📜
👀 観察フェーズ:まず何を見る?

まずアプリがXMLを受け取る箇所を探す!SOAP、SAML、RSS取込、SVG、DOCX/XLSXなどが盲点🔍
JSONが主流の今でもXMLは生き残っています。特に企業向け・認証系・ドキュメント処理に多いので要チェック。

画像にしか見えないSVGでもXML実体参照がそのまま動いちゃうんだね…😨
🤔 仮説フェーズ:攻撃者は何を考える?

XXEの典型は4経路。
攻撃者の仮説。
📁 仮説①:ローカルファイル読込
<!ENTITY xxe SYSTEM "file:///etc/passwd">を埋め込み、サーバ上の任意ファイルを取得。
🌐 仮説②:SSRF経由で内部ネット
<!ENTITY xxe SYSTEM "http://169.254.169.254/...">でクラウドメタデータや内部APIを叩く。
🤐 仮説③:Blind型(OOB)
レスポンスに結果が出なくても、外部DTDを使いparameter entityで攻撃者サーバへ漏洩。
💥 仮説④:Billion Laughs(DoS)
入れ子になった実体参照でメモリを指数的に消費させてサービス停止。
XXEは「XMLパーサの設定1つ」が運命を分ける脆弱性。デフォルトが安全な言語と危険な言語があります。

XMLって地味なのに攻撃面が広すぎるんだね…💧
🔬 検証フェーズ:どうやって確かめる?

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>を仕込んでレスポンスにファイル内容が出るか確認!
検証ステップ。

OOBの場合はBurp Collaboratorで外部通信を捕まえるんだね🧪
⚔️ 攻撃フェーズ:実際の手口

XXE攻撃の主軸はこの3つ。
実戦シナリオ。
/etc/passwd、/proc/self/environ、web.xml、.envなどを取得し認証情報を入手。
XXE経由で169.254.169.254を叩き、IAM credentialsを盗む。クラウド乗っ取りに直結。
パラメータ実体参照と外部DTDを組み合わせて、レスポンス非表示でもファイル内容を攻撃者サーバに送信。
CTF{disable_external_entity_in_xml_parser}
結論はシンプル:「外部実体参照を無効化する」。これだけでXXEの大半は防げます。
🛡️ 防御フェーズ:どう守る?

XXE対策の3点セット!🛡️
XXE防御の鉄則。
パーサーにsetFeatureでdisallow-doctype-decl=true、external-general-entities=falseを設定。これだけでXXEの大半は死ぬ。
Java/.NET/PythonなどのXMLパーサーは最新版へ。デフォルト設定が安全な実装(defusedxml等)を採用。
XML受信前に<!DOCTYPEや<!ENTITYを含むかをチェックして即拒否するレイヤーを置く。

「外部実体オフ」を初期設定にしてくれない言語が悪い…💪
🛡️ 今日からできる対策ツール
パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
よくあるミス。
- ライブラリのデフォルト設定を信用して、実は外部実体が有効なまま。
- PHPのlibxmlを古いバージョンで使い続け、disable_entity_loader未設定。
- Java DocumentBuilderFactoryで FEATURE_SECURE_PROCESSING のみ有効化し、disallow-doctype-declを設定し忘れる。
- docxの中身をunzipせずに丸ごとXMLパーサに食わせる。
- SAMLライブラリを使う際、署名検証とXXE対策を別々に管理して片方だけ有効。
- Out-of-band XXEを「ネットワーク的にegress制限あるから大丈夫」と過信。
🧰 ツール早見表
使う道具。
| ツール | 用途 | ひと言 |
|---|---|---|
| Burp Suite XXE Scanner | XXE自動検出 | PassiveでもActiveでも |
| Burp Collaborator | Out-of-band検出 | Blind XXEの定番 |
| XXEinjector | Blind XXE自動エクスプロイト | Rubyスクリプト、ファイル抜き取り自動化 |
| defusedxml (Python) | 安全なXML処理 | 防御側ライブラリ |
🎓 本気で学びたい人へ
Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
📚 次に読みたい
- コマンドインジェクション編|CTF思考フレームワーク #16
- HTTPリクエストスマグリング編|CTF思考フレームワーク #18
- デシリアライズ編|CTF思考フレームワーク #15
- Webキャッシュ汚染編|CTF思考フレームワーク #19
🧪 自分で検証してみる
「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝



