Shikata Ga Nai

Private? There is no such things.

XMLのエンティティとXXEの関係を理解する

Hello there, ('ω')ノ

📘 XMLとは?

**XML(Extensible Markup Language)は、データの保存・転送を目的としたマークアップ言語です。HTMLのようにタグ構造(ツリー構造)**を持ちますが、タグ名は自由に定義可能です。

  • 昔はAJAX(Asynchronous JavaScript And XML)にも使われていたが、
  • 現在ではJSONが主流です。

🧩 XMLエンティティとは?

エンティティは「データの代わりに使用する記号的な表現」です。

💡 例:組み込みエンティティ

表記 意味
&lt; <(開始タグ)
&gt; >(終了タグ)
&amp; &(アンパサンド)

これらはXMLの文法的に特別な文字をデータ内で扱うために必要です。


📑 DTD(Document Type Definition)とは?

DTDとは、XML文書の構造やルールを定義する部分であり、<!DOCTYPE> 宣言の中に記述されます。

  • 内部DTD:XML文書内に定義される
  • 外部DTD:外部ファイルやURLから読み込まれる
  • ハイブリッド:内部と外部の組み合わせ

🛠️ XMLのカスタムエンティティ

XMLでは**独自のエンティティ(カスタムエンティティ)**を定義できます。

<!DOCTYPE foo [
  <!ENTITY myentity "my entity value">
]>

この場合、&myentity; と記述すると "my entity value" に置き換えられます。


🔓 XMLの外部エンティティ(External Entities)

外部エンティティは、DTDの外にあるリソースを参照するエンティティです。

📡 外部URLの読み込み

<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "http://normal-website.com">
]>

📂 ローカルファイルの読み込み

<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "file:///etc/passwd">
]>

このように、&ext; をXML内に含めることで、外部またはローカルのファイル内容がそのまま埋め込まれるのです。


💥 XXE攻撃の本質

この外部エンティティの読み込み機能を悪用することで、次のような攻撃が可能になります:

攻撃内容
ファイルの読み取り file:///etc/passwd
SSRF http://localhost:8080/admin
環境変数の取得 file:///proc/self/environ

🧠 エンティティとは「ショートカット」。そのショートカットの先が「機密ファイルや内部URL」だった場合、それをアプリが勝手に読んで表示してしまうのがXXEの怖さです。

Best regards, (^^ゞ