PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【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画像アップ・DOCX解析・SOAP API・SAML SSOはXXEの宝庫。<?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/environweb.xml.envなどを取得し認証情報を入手

② クラウドメタデータ窃取(SSRF)

XXE経由で169.254.169.254を叩き、IAM credentialsを盗む。クラウド乗っ取りに直結。

③ Blind XXEで段階的窃取

パラメータ実体参照と外部DTDを組み合わせて、レスポンス非表示でもファイル内容を攻撃者サーバに送信。

CTF{disable_external_entity_in_xml_parser}

結論はシンプル:「外部実体参照を無効化する」。これだけでXXEの大半は防げます。

🛡️ 防御フェーズ:どう守る?

XXE対策の3点セット!🛡️

XXE防御の鉄則。

🚫 外部実体・外部DTDを無効化

パーサーにsetFeaturedisallow-doctype-decl=true、external-general-entities=falseを設定。これだけでXXEの大半は死ぬ。

📦 安全なライブラリ・新バージョンを使う

Java/.NET/PythonなどのXMLパーサーは最新版へ。デフォルト設定が安全な実装(defusedxml等)を採用。

🔍 入力の事前チェック

XML受信前に<!DOCTYPE<!ENTITYを含むかをチェックして即拒否するレイヤーを置く。

「外部実体オフ」を初期設定にしてくれない言語が悪い…💪

🛡️ 今日からできる対策ツール

パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。

PR / 広告

ソースネクスト

※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。

⚠️ よくある落とし穴

よくあるミス。

  1. ライブラリのデフォルト設定を信用して、実は外部実体が有効なまま。
  2. PHPのlibxmlを古いバージョンで使い続け、disable_entity_loader未設定。
  3. Java DocumentBuilderFactoryで FEATURE_SECURE_PROCESSING のみ有効化し、disallow-doctype-declを設定し忘れる。
  4. docxの中身をunzipせずに丸ごとXMLパーサに食わせる。
  5. SAMLライブラリを使う際、署名検証とXXE対策を別々に管理して片方だけ有効。
  6. Out-of-band XXEを「ネットワーク的にegress制限あるから大丈夫」と過信。

🧰 ツール早見表

使う道具。

ツール用途ひと言
Burp Suite XXE ScannerXXE自動検出PassiveでもActiveでも
Burp CollaboratorOut-of-band検出Blind XXEの定番
XXEinjectorBlind XXE自動エクスプロイトRubyスクリプト、ファイル抜き取り自動化
defusedxml (Python)安全なXML処理防御側ライブラリ

🎓 本気で学びたい人へ

Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚

📚 次に読みたい

🧪 自分で検証してみる

「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

記事URLをコピーしました