XXE - XEE - XML External Entity
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fpentest.eu%2FRENDER_WebSec_10fps_21sec_9MB_29042024.gif&width=768&dpr=4&quality=100&sign=bc0743d1&sv=1)
XMLの基本
XMLはデータの保存と輸送のために設計されたマークアップ言語であり、記述的に名前付けされたタグを使用する柔軟な構造を特徴としています。XMLは、あらかじめ定義されたタグのセットに制限されない点でHTMLとは異なります。JSONの台頭に伴い、XMLの重要性は低下していますが、AJAX技術における初期の役割はありました。
エンティティによるデータ表現: XMLのエンティティは、
<
や>
のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために<
や>
に対応します。XML要素の定義: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類は、任意のタイプから特定の子要素までさまざまです。
文書型定義 (DTD): DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。DTDは内部、外部、またはその組み合わせであり、文書のフォーマットと検証方法をガイドします。
カスタムおよび外部エンティティ: 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" > ]>
主な攻撃
これらの攻撃のほとんどは、素晴らしいPortswiggers XEEラボを使用してテストされました: https://portswigger.net/web-security/xxe
新しいエンティティテスト
この攻撃では、シンプルな新しいエンティティ宣言が機能しているかどうかをテストします。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-2dbebc042c86e8f2625d60504b9f97becee7cc58%252Fimage%2520%28870%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=292c58a3&sv=1)
ファイルを読む
/etc/passwd
を異なる方法で読み取ってみましょう。Windowsの場合は、C:\windows\system32\drivers\etc\hosts
を読み取ってみてください。
この最初のケースでは、SYSTEM "**file:///**etc/passwd" も機能することに注意してください。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-4c69caca7255eec36566b92c7d745fec87596929%252Fimage%2520%2886%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=16256461&sv=1)
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちます(Portswiggerのラボではない場合)。
この第三のケースでは、Element stockCheck
をANYとして宣言していることに注意してください。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-2c25d0a31f39e13af10fe924cd74269f51866552%252Fimage%2520%28753%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=131cb9fd&sv=1)
ディレクトリリスト
Java ベースのアプリケーションでは、XXEを介して ディレクトリの内容をリストする ことが可能な場合があります。ペイロードは次のようになります(ファイルの代わりにディレクトリを要求するだけです):
SSRF
XXEを使用して、クラウド内のSSRFを悪用することができます。
Blind SSRF
以前にコメントした技術を使用すると、サーバーがあなたが制御するサーバーにアクセスしていることを示すことができます。しかし、それが機能しない場合、XMLエンティティが許可されていない可能性があります。その場合は、XMLパラメータエンティティを使用してみることができます:
"Blind" SSRF - 外部帯域外でのデータ抽出
この場合、サーバーに悪意のあるペイロードを持つ新しいDTDを読み込ませ、HTTPリクエストを介してファイルの内容を送信させます(複数行のファイルの場合は、例えばこの基本サーバーを使用して_ftp://_経由で抽出を試みることができますxxe-ftp-server.rb)。この説明は Portswiggers lab hereに基づいています。
与えられた悪意のあるDTDでは、データを抽出するために一連の手順が実行されます:
悪意のあるDTDの例:
構造は次のようになります:
The steps executed by this DTD include:
Parameterエンティティの定義:
XMLパラメータエンティティ
%file
が作成され、/etc/hostname
ファイルの内容を読み取ります。別のXMLパラメータエンティティ
%eval
が定義されます。これは動的に新しいXMLパラメータエンティティ%exfiltrate
を宣言します。%exfiltrate
エンティティは、攻撃者のサーバーにHTTPリクエストを行い、URLのクエリ文字列内で%file
エンティティの内容を渡すように設定されています。
エンティティの実行:
%eval
エンティティが利用され、%exfiltrate
エンティティの動的宣言が実行されます。次に
%exfiltrate
エンティティが使用され、指定されたURLにファイルの内容を含むHTTPリクエストがトリガーされます。
攻撃者は、この悪意のあるDTDを自分の管理下にあるサーバーにホストし、通常はhttp://web-attacker.com/malicious.dtd
のようなURLで提供します。
XXEペイロード: 脆弱なアプリケーションを悪用するために、攻撃者はXXEペイロードを送信します:
このペイロードは、XMLパラメータエンティティ%xxe
を定義し、DTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、インラインでDTDを解釈し、悪意のあるDTDに記載された手順を実行し、/etc/hostname
ファイルを攻撃者のサーバーに流出させます。
エラーベース(外部DTD)
この場合、サーバーがファイルの内容をエラーメッセージ内に表示する悪意のあるDTDを読み込むようにします(これはエラーメッセージが見える場合にのみ有効です)。 ここからの例。
悪意のある外部文書型定義(DTD)を使用して、/etc/passwd
ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます:
file
という名前のXMLパラメータエンティティが定義され、/etc/passwd
ファイルの内容が含まれます。eval
という名前のXMLパラメータエンティティが定義され、error
という別のXMLパラメータエンティティの動的宣言を組み込みます。このerror
エンティティは評価されると、存在しないファイルを読み込もうとし、その名前としてfile
エンティティの内容を組み込みます。eval
エンティティが呼び出され、error
エンティティの動的宣言が行われます。error
エンティティの呼び出しは、存在しないファイルを読み込もうとし、/etc/passwd
ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。
悪意のある外部DTDは、以下のXMLで呼び出すことができます:
実行時に、ウェブサーバーの応答には/etc/passwd
ファイルの内容を表示するエラーメッセージが含まれるべきです。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-16f008990fabf31453382bb97acbdea79101b0a2%252Fimage%2520%28809%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=eea50d38&sv=1)
外部DTDは、1つのエンティティを2番目のエンティティ(eval
)の中に含めることを許可しますが、内部DTDでは禁止されています。したがって、外部DTDを使用しない限り(通常)、エラーを強制することはできません。
エラーベース(システムDTD)
では、アウトオブバンドの相互作用がブロックされている場合の盲目的なXXE脆弱性はどうでしょうか?
XML言語仕様の抜け穴は、ドキュメントのDTDが内部および外部宣言を混合する際にエラーメッセージを通じて機密データを露出させることができます。この問題は、外部で宣言されたエンティティの内部再定義を可能にし、エラーに基づくXXE攻撃の実行を促進します。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを引き起こすことを目指します。
サーバーのファイルシステムに/usr/local/app/schema.dtd
にDTDファイルが含まれており、custom_entity
というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、/etc/passwd
ファイルの内容を明らかにするXML解析エラーを引き起こすことができます。
The outlined steps are executed by this DTD:
XMLパラメータエンティティ
local_dtd
の定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。外部DTDで元々定義されていた
custom_entity
XMLパラメータエンティティの再定義が行われ、エラーに基づくXXEエクスプロイトをカプセル化します。この再定義は、パースエラーを引き起こし、/etc/passwd
ファイルの内容を露出させることを目的としています。local_dtd
エンティティを使用することで、外部DTDが呼び出され、新たに定義されたcustom_entity
が含まれます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
実世界の例: GNOMEデスクトップ環境を使用しているシステムでは、/usr/share/yelp/dtd/docbookx.dtd
にISOamso
というエンティティを含むDTDがあることがよくあります。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-c6f396b9845c6148b132a7c53a20a7d5a11eec9f%252Fimage%2520%28625%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5a6385c5&sv=1)
この技術は内部DTDを使用するため、まず有効なものを見つける必要があります。これを行うには、サーバーが使用しているのと同じOS / ソフトウェアをインストールし、いくつかのデフォルトDTDを検索するか、システム内のデフォルトDTDのリストを取得し、それらの中に存在するものがあるかを確認することができます:
For more information check https://portswigger.net/web-security/xxe/blind
システム内のDTDを見つける
以下の素晴らしいGitHubリポジトリでは、システムに存在する可能性のあるDTDのパスを見つけることができます:
さらに、被害者システムのDockerイメージがある場合、同じリポジトリのツールを使用して、イメージをスキャンし、システム内に存在するDTDのパスを見つけることができます。方法についてはGitHubのReadmeをお読みください。
XXE via Office Open XML Parsers
この攻撃の詳細な説明については、**この素晴らしい投稿 の第二部を確認してください。
Microsoft Office文書のアップロード機能は多くのウェブアプリケーションで提供されており、これらの文書から特定の詳細を抽出します。たとえば、ウェブアプリケーションはユーザーがXLSX形式のスプレッドシートをアップロードすることでデータをインポートすることを許可する場合があります。パーサーがスプレッドシートからデータを抽出するためには、必然的に少なくとも1つのXMLファイルを解析する必要があります。
この脆弱性をテストするには、XXEペイロードを含むMicrosoft Officeファイルを作成する必要があります。最初のステップは、文書を解凍できる空のディレクトリを作成することです。
文書が解凍されたら、./unzipped/word/document.xml
にあるXMLファイルを開き、好みのテキストエディタ(例えばvim)で編集します。XMLは、HTTPリクエストで始まることが多い希望するXXEペイロードを含むように修正する必要があります。
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用のモニタ可能なURLに置き換えることが重要です。
最後に、ファイルを圧縮して悪意のあるpoc.docxファイルを作成できます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります:
今、作成したファイルを潜在的に脆弱なウェブアプリケーションにアップロードでき、Burp Collaboratorのログにリクエストが表示されることを期待できます。
Jar: protocol
jarプロトコルはJavaアプリケーション内でのみアクセス可能です。これは、PKZIPアーカイブ(例:.zip
、.jar
など)内のファイルアクセスを可能にするように設計されており、ローカルファイルとリモートファイルの両方に対応しています。
PKZIPファイル内のファイルにアクセスできることは、システムDTDファイルを介してXXEを悪用するのに非常に便利です。 このセクションを確認して、システムDTDファイルを悪用する方法を学んでください.
PKZIPアーカイブ内のファイルにアクセスするプロセスは、いくつかのステップを含みます:
指定された場所からzipアーカイブをダウンロードするためにHTTPリクエストが行われます。例えば、
https://download.website.com/archive.zip
のように。アーカイブを含むHTTPレスポンスは、通常
/tmp/...
のような場所に一時的に保存されます。アーカイブが抽出され、その内容にアクセスします。
アーカイブ内の特定のファイル、
file.zip
が読み取られます。操作後、このプロセス中に作成された一時ファイルは削除されます。
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限に開いたままにすることです。この目的のために、このリポジトリで利用可能なツールを使用できます。これには、Pythonサーバー(slow_http_server.py
)とJavaサーバー(slowserver.jar
)が含まれます。
一時ディレクトリにファイルを書き込むことは、パストラバーサルに関わる別の脆弱性をエスカレートするのに役立ちます(ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど)。
XSS
DoS
ビリオンラフ攻撃
Yaml攻撃
二次爆発攻撃
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F4226785378-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FpWAf1y9UWEMh8PEO1vPV%252Fuploads%252Fgit-blob-51a52746396e302eb6dac03462c3506ad0039527%252Fimage%2520%28527%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=81c47402&sv=1)
NTMLの取得
Windowsホストでは、responder.pyハンドラーを設定することで、ウェブサーバーユーザーのNTMLハッシュを取得することが可能です。
そして、次のリクエストを送信することによって
Then you can try to crack the hash using hashcat
隠れたXXEの出現
XInclude
サーバー側のXMLドキュメントにクライアントデータを統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、DOCTYPE
要素の変更に対する制約により従来のXXE攻撃が妨げられます。しかし、XInclude
攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
XInclude
攻撃を実行するには、XInclude
名前空間を宣言し、意図した外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
Check https://portswigger.net/web-security/xxe for more info!
SVG - ファイルアップロード
ユーザーが特定のアプリケーションにアップロードしたファイルは、サーバーで処理される際に、XMLまたはXMLを含むファイル形式の取り扱いにおける脆弱性を悪用する可能性があります。一般的なファイル形式であるオフィス文書(DOCX)や画像(SVG)は、XMLに基づいています。
ユーザーが画像をアップロードすると、これらの画像はサーバー側で処理または検証されます。PNGやJPEGなどの形式を期待するアプリケーションであっても、サーバーの画像処理ライブラリはSVG画像もサポートしている可能性があります。SVGはXMLベースの形式であるため、攻撃者が悪意のあるSVG画像を提出することで、サーバーをXXE(XML外部エンティティ)脆弱性にさらすことができます。
以下にそのような攻撃の例を示します。悪意のあるSVG画像がシステムファイルを読み取ろうとしています:
別の方法は、PHPの"expect"ラッパーを通じてコマンドを実行しようとすることです:
両方のケースで、SVGフォーマットはサーバーのソフトウェアのXML処理機能を悪用する攻撃を開始するために使用され、堅牢な入力検証とセキュリティ対策の必要性が強調されています。
詳細についてはhttps://portswigger.net/web-security/xxeを確認してください!
読み込まれたファイルの最初の行または実行結果は、作成された画像の中に表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。
PDF - ファイルアップロード
次の投稿を読んで、PDFファイルをアップロードしてXXEを悪用する方法を学んでください:
PDF Upload - XXE and CORS bypassContent-Type: x-www-urlencodedからXMLへ
POSTリクエストがXML形式のデータを受け入れる場合、そのリクエストでXXEを悪用しようとすることができます。たとえば、通常のリクエストに次のような内容が含まれている場合:
次に、同じ結果で以下のリクエストを送信できるかもしれません:
Content-Type: From JSON to XEE
リクエストを変更するには、「Content Type Converter」というBurp拡張機能を使用できます。こちらにこの例があります:
別の例はこちらで見つけることができます。
WAF & 保護のバイパス
Base64
これは、XMLサーバーが data://
プロトコルを受け入れる場合にのみ機能します。
UTF-7
ここで ["Encode Recipe" of cyberchef]を使用できます ([https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)をUTF-7に変換します。
File:/ プロトコルバイパス
ウェブがPHPを使用している場合、file:/
の代わりにphpラッパーphp://filter/convert.base64-encode/resource=
を使用して内部ファイルにアクセスできます。
ウェブがJavaを使用している場合は、jar: プロトコルを確認してください。
HTMLエンティティ
https://github.com/Ambrotd/XXE-Notesからのトリック エンティティの内部にエンティティを作成し、htmlエンティティでエンコードしてから、それを呼び出してdtdをロードできます。 使用するHTMLエンティティは数値である必要があります(この例のように)[(https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\。
DTDの例:
PHP Wrappers
Base64
抽出 index.php
外部リソースの抽出
リモートコード実行
PHPの"expect"モジュールがロードされている場合
SOAP - XEE
XLIFF - XXE
この例はhttps://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxeにインスパイアされています。
XLIFF(XMLローカリゼーションインターチェンジファイルフォーマット)は、ローカリゼーションプロセスにおけるデータ交換を標準化するために利用されます。これは、主にローカリゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースのフォーマットであり、CAT(コンピュータ支援翻訳)ツールの共通交換フォーマットとしても使用されます。
Blind Request Analysis
サーバーに次の内容でリクエストが送信されます:
しかし、このリクエストは内部サーバーエラーを引き起こし、特にマークアップ宣言に関する問題を示しています:
エラーにもかかわらず、Burp Collaboratorにヒットが記録され、外部エンティティとの何らかのインタラクションが示されています。
Out of Band Data Exfiltration データをエクスフィルトレートするために、修正されたリクエストが送信されます:
このアプローチは、User AgentがJava 1.8の使用を示していることを明らかにします。このバージョンのJavaの制限の一つは、Out of Band技術を使用して、改行文字を含むファイル(例:/etc/passwd)を取得できないことです。
Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプローチが採用されます。DTDファイルは、ターゲットファイルからのデータを含むエラーをトリガーするように次のように構成されています:
サーバーはエラーで応答し、重要なことに存在しないファイルを反映し、サーバーが指定されたファイルにアクセスしようとしていることを示しています:
エラーメッセージにファイルの内容を含めるために、DTDファイルが調整されます:
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXE(XML External Entity)攻撃を示しています。
RSS - XEE
XXE脆弱性を悪用するためのRSS形式の有効なXML。
Ping back
攻撃者のサーバーへのシンプルなHTTPリクエスト
ファイルを読む
ソースコードを読む
PHPのbase64フィルターを使用
Java XMLDecoder XEE to RCE
XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成するJavaクラスです。悪意のあるユーザーがアプリケーションに任意のデータをreadObjectメソッドへの呼び出しで使用させることができれば、彼は瞬時にサーバー上でコード実行を得ることができます。
Using Runtime().exec()
ProcessBuilder
ツール
参考文献
自分の外部DTDを使用してHTTP経由で情報を抽出: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/\
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fpentest.eu%2FRENDER_WebSec_10fps_21sec_9MB_29042024.gif&width=768&dpr=4&quality=100&sign=bc0743d1&sv=1)
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated