본 포스팅은 XXE(XML External Entities) 공격기법을 공부하기 위한 선행지식을 습득하기 위함이며, 그러므로 필요한 내용만을 담고있다.
XML의 문법을 정의하기 위한 규격을 말한다.
이 규격을 설정하는 방법으로 DTD와 XML Schema가 존재한다.
다음으로 간단히 특징을 정리한다.
- Document Type Definition을 나타낸다.
- XML Schema와 동일한 기능을 수행하지만, 몇가지 문법과 지원되는 세부내용이 다르다.
문서의 시작에 다음과 같이 선언한다.
간단히 형태만 보고 넘어가자.
<!DOCTYPE 루트요소 DTD식별자 [ 선언1 선언2 ... ]>
http://tcpschool.com/xml/xml_dtd_intro
DTD는 <!DOCTYPE 으로 시작합니다.
루트(root) 요소는 XML 파서(parser)에 명시된 루트 요소부터 파싱(parsing)을 시작하라고 알려주는 역할을 합니다.DTD 식별자는 프로그램 외부에 존재하는 DTD 파일을 위한 식별자입니다.
만약에 DTD 식별자가 외부 주소를 가리키고 있으면, 그것을 외부 서브셋(subset)이라고 합니다.
괄호([]) 안에는 내부 서브셋(subset)이라 불리는 추가로 선언한 엔티티(entity)의 리스트가 존재합니다.
DTD는 외부에서 가져올 수도 있고 내부에서 지정할 수도 있다.
다음은 내부에서 선언할 때의 코드이다.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE food [
<!ELEMENT food (name,type,cost)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT cost (#PCDATA)>
]>
<food>
<name>상추</name>
<type>야채</type>
<cost>2000</cost>
</food>
요소를 선언문의 []
안에 정의했다는 것을 기억하자.
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)>
DTD는 다음과 같은 요소로 구성된다.
DTD 구성요소 :: http://tcpschool.com/xml/xml_dtd_component
1. 요소(elements)
2. 속성(attributes)
3. 엔티티(entities)
4. PCDATA
5. CDATA
이 중 XXE 공격에 사용되는 엔티티를 살펴보자
정의는 참조하는 페이지에 정리가 잘 되어있어서 이것을 참고하자.
DTD 엔티티 :: http://tcpschool.com/xml/xml_dtd_entityDeclaration
DTD에서 엔티티(entity)는 특정 문자열을 손쉽게 사용할 수 있도록 해주는 상용구와 같은 역할을 합니다.엔티티의 이름과 확장할 문자열을 미리 정의해 놓으면, XML 문서나 DTD에서 사용되는 엔티티의 이름은 모두 미리 정의한 문자열로 대체됩니다.
한 마디로 프로그래밍 언어의 Enum 과 유사하다고 보면 되겠다.
엔티티도 DTD 자체 선언과 마찬가지로 내부와 외부로 나뉜다.
먼저 내부에서는 다음처럼 사용된다.
.dtd
<!ENTITY css "Cascading Style Sheets">
.xml
<lecture>&css;</lecture> // <lecture>Cascading Style Sheets<lecture>
SYSTEM 키워드를 이용해 외부 DTD 파일의 엔티티를 가져올 수 있다.
*.dtd
<!ENTITY html SYSTEM "http://codingsam.com/xml/html.dtd">
*.xml
<lecture>&html;</lecture> // <lecture>HyperText Markup Language<lecture>
※이 외부의 엔티티를 포함시키는 기능은 XXE공격에 자주 사용되므로 기억하자※
다음에 관련된 공격을 다룰 때 정리하자.