본문 바로가기

wargame

[XXE]를 위한 속성 XML 공부


XXE (XML External Entity) injection

XML 문서에서 동적으로 외부 URI의 리소스를 포함시킬 수 있는 external entity를 사용하여
서버의 로컬파일 열람, DoS(denial of service) 등을 유발할 수 있는 취약점으로
XML Request를 파싱하는 페이지에서 발생한다.
+) URI : 인터넷에 있는 자원을 나타내는 유일한 주소로, URL과 URN으로 구성된다.

XML언어와 DTD에 포함된 exeternal entity를 공부해보자

XML

XML

XML(Extensible MArkup Language)은 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어이다.
다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어졌다.

XML 기본 문법

1. XML 프롤로그 문법

<? xml version="XML문서버전" encoding="문자셋" standalone="yes|no"?>

standalone 속성은 XML 문서가 외부 DTD와 같은 외부 소스의 데이터에 의존하고 있는 문서인지 XML 파서에게 알려준다.
기본 값은 no이며, yes로 설정하면 이 문서를 파싱할 때 참조해야 할 외부 소스가 없다는 것을 의미한다.
+) XML 파서(parser) : XML 문서의 평문(plain text) 데이터를 읽어, XML DOM 객체로 반환하는 것

2. XML 요소(element)
XML 요소 : XML 문서를 구성하는 하나의 구성 요소, 하나 이상의 다른 요소를 포함할 수 있다.

<!ELEMENT 요소이름 요소카테고리>
	또는
<!ELEMENT 요소이름 (요소내용)>

XML 속성 : XML 요소에 대한 추가적인 정보를 제공한다.

<요소이름 속성1="속성값" ...>내용</요소이름>
<요소이름 속성2="속성값"../><!--빈 요소(empty element)의 경우-->

예시

<?xml version="1.0" encoding="UTF-8"?>
<school>  <!--lector 요소를 포함함-->
    <lecture category="application"> <!--category 속성을 가진 lecture 속성-->
        <java>Java</java>  <!--java 요소-->
        <cpp>Cpp</cpp>  <!--cpp 요소-->
    </lecture>
    <lecture category="web">
        <php>PHP</php>
        <asp>ASP</asp>
    </lecture>
</school>

DTD

1. 스키마(schema)
XML 문서 타입에 대해 기술한 것이다.
XML에서는 DTD(Document Type Definition) 또는 XML 스키마(XSD)로 스키마를 작성한다.

2. 문서 타입 정의(DTD)
XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의한다.
이렇게 생성된 DTD는 새로운 문서 타입을 이용한 데이터의 교환에서 표준으로써 활용된다.

DTD 문법

<DOCTYPE 루트요소 DTD식별자 [선언1 선언2 ...]>

루트요소는 XML 파서에 명시된 루트 요소부터 파싱을 시작하라고 알려준다.
+) 루트요소 : XML은 HTML과 마찬가지로 트리 형태의 계층 구조를 가지는데 이 계층구조의 최상위 요소

DTD식별자는 프로그램 외부에 존재하는 DTD 파일을 위한 식별자이다.
식별자가 외부 주소를 가리키면 외부 서브셋(subset)이라 부르고, []괄호 안에는 내부 서브셋(subset)이라는 것이 존재한다.

DTD 내부 서브셋(subset)

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE food [ <!-- 이 문서의 루트 요소가 food 요소-->
<!ELEMENT food (name,type,cost)> <!--food 요소가 name, type, cost 세 요소를 반드시 포함함-->
<!ELEMENT name (#PCDATA)> <!--name 요소가 #PICDATA 타입의 요소임-->
<!ELEMENT type (#PCDATA)> <!--type 요소가 #PCDATA 타입의 요소임-->
<!ELEMENT cost (#PCDATA)>  <!--cost 요소가 #PCDATA 타입의 요소임-->
]>
<food>
    <name>상추</name>
    <type>야채</type>
    <cost>2000</cost>
</food>


DTD 외부 서브셋

data.xml<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE food SYSTEM "food.dtd">
<food>
    <name>상추</name>
    <type>야채</type>
    <cost>2000</cost>
</food>
food.dtd<!ELEMENT food (name,type,cost)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT cost (#PCDATA)>


엔티티(entities)

상용구 역할을 하는 문자셋으로 XML에서 예약된 5개의 엔티티가 있다.
DTD는 엔티티를 선언할 수 있다.

- 내부 엔티티
참조하는 XML 문서 내부에서 정의한다

<!ENTITY 엔티티이름 "엔티티값">


예시

<!ENTITY css "Cascading Style Sheets">
<lecture>&css;</lecture> // <lecture>Cascading Style Sheets<lecture>


- 외부 엔티티(external entities)
파일 등의 외부자원에서 가져온다. SYSTEM 키워드를 사용해서 정의한다.

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


예시

dtd<!ENTITY html SYSTEM "http://codingsam.com/xml/html.dtd">
XML<lecture>&html;</lecture> // <lecture>HyperText Markup Language<lecture>


PCDATA(Parsed Character DATA) : XML 파서에 의해 분석될 문자 데이터

<!ELEMENT 요소이름 (#PCDATA)>


CDATA (Character DATA) : XML 파서가 분석하지 않는 문자 데이터

<!ATTLIST 요소이름 속성이름 CDATA 속성값>

참고

XML 개요
DTD entities



'wargame' 카테고리의 다른 글

[메모리 보호기법]ASLR  (0) 2019.12.01
[메모리 보호기법]NX  (0) 2019.12.01
[BOF]simpleBOF  (0) 2019.11.27
[BOF]justBOF  (0) 2019.11.27
XXE 문제  (0) 2019.10.08