Hello there, ('ω')ノ
📘 XMLとは?
**XML(Extensible Markup Language)は、データの保存・転送を目的としたマークアップ言語です。HTMLのようにタグ構造(ツリー構造)**を持ちますが、タグ名は自由に定義可能です。
- 昔はAJAX(Asynchronous JavaScript And XML)にも使われていたが、
- 現在ではJSONが主流です。
🧩 XMLエンティティとは?
エンティティは「データの代わりに使用する記号的な表現」です。
💡 例:組み込みエンティティ
表記 | 意味 |
---|---|
< |
< (開始タグ) |
> |
> (終了タグ) |
& |
& (アンパサンド) |
これらは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, (^^ゞ