Shikata Ga Nai

Private? There is no such things.

XML外部実体インジェクション(XXE)とは?

Hello there, ('ω')ノ

🧠 XXEの基本概念

XML External Entity Injection(XXE)とは、アプリケーションがユーザー入力を含むXMLデータをパース(解析)する際に、そのXML構造に埋め込まれた外部エンティティ(External Entity)を不適切に処理してしまう脆弱性です。


⚠️ XXE攻撃で可能になること

攻撃内容 説明
📂 サーバーファイルの閲覧 /etc/passwd.env などの機密ファイルを読み取れる
🌐 SSRF(サーバー側リクエスト偽造) アプリケーションから内部ネットワークや外部サイトへ不正なリクエストを送信させる
🧠 構成情報の漏洩 システム内部のIP、環境変数、アクセス権限などが漏れることも
💣 サーバー乗っ取り(高度) 特定条件下でリモートコード実行やDoS攻撃に発展する可能性も

🔧 攻撃の仕組み

XMLドキュメントに次のような「外部エンティティ定義」を埋め込みます:

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
  • <!ENTITY> はエンティティを定義する宣言
  • SYSTEM "file:///etc/passwd" でローカルファイルを読み込み
  • &xxe; を通じてその内容をXML内に展開

📦 実際の攻撃シナリオ(例)

  1. WebアプリがXMLを受け付けるAPIエンドポイントを提供(例:ファイルアップロード、SOAP、SAML)
  2. 攻撃者が外部エンティティ付きのXMLを送信
  3. サーバーがXMLを無防備に解析 → 外部ファイルやURLにアクセス
  4. 結果がレスポンスやログなどに表示される

🛡️ 対策

対策項目 詳細
XMLパーサー設定の制限 外部エンティティやDTDを無効にする(例:JavaならsetFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true)
JSONなど非XML形式の使用 そもそもXMLを使わない
サーバー構成の最小権限化 サービスユーザーにファイルアクセスや外部通信の権限を最小限にする
WAFの導入 攻撃的なXML構造の検知・遮断

🧩 XXEは「データ形式の柔軟性」が裏目に出た典型例。 一見無害なXMLが、サーバーの目と手を通じて内側を暴き出す強力な攻撃手段となるのです。

Best regards, (^^ゞ