XXE Injection

Hacking/Web 2018. 2. 1. 15:56
반응형

0. 주제 선정 이유

- XXE 라는 것을 많이 들어보았고 패킷 내 어떤 형태일 때 공격을 시도할만한지는 알고 있었지만 정확한 개념이 잡혀있지 않아 정리하는 겸 적어본다.


1. 정의

 : XXE Injection이 무엇인지부터 짚고 넘어가자.


1.1 XXE Injection이란?

 - XXE Injection = XML External Entitiy Injection

 - 즉, 영어 그대로 해석하면 XML 외부 요소를 Injection한 공격이라고 해석할 수 있다. 그렇다면 XML이 무엇인지, XML 외부 요소는 무엇을 뜻하는 것일까?


1.2 XML 이란?

 - XML = Extensible Markup Language = 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어

 - 마크업 언어 = 태그 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한가지

 - 주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어진 언어


정의만 봐서는 이게 무엇을 하는 공격인지, 어떤 식으로 진행되는 것인지 알기가 어렵다. 좀 더 자세히 알아보도록 하자.

 

2. XML 핵심 요소 (참고 : http://tcpschool.com/xml/xml_basic_structure)

 : XXE 공격에 대해 알기 위해서는 먼저 XML이 무엇인지, 어떻게 구성되어있는지를 알아야 한다.

 : 여러 요소들이 있지만 일부만 소개하겠다. 더 자세한 사항은 ( https://ko.wikipedia.org/wiki/XML )를 참고하도록 하자.


2.1 프로세서(processor)와 애플리케이션(application)

 - 프로세서는 마크업을 분석하고 구조화된 정보를 애플리케이션에 넘긴다.

 - 프로세서는 흔히 XML parser라 불린다.


2.2 마크업(markup)과 내용(content)

 - XML 문서를 구성하는 문자들은 마크업내용으로 나뉜다.

 - 일반적으로 마크업을 구성하는 문자열 아래와 같다. (마크업이 아닌 문자열은 내용)

 (1) 문자 [ < ]로 시작하여 문자 [ > ]로 끝

 (2) 문자 [ & ]로 시작하여 문자 [ ; ]로 끝

 - CDATA 절에서 <![CDATA[ 와 ]]> 는 마크업으로 분류되고, 그들 사이의 텍스트는 내용으로 구분된다.

 - 가장 바깥 엘리먼트의 앞과 뒤의 공백(whitespace)은 마크업으로 분류


2.3 태그(tag) : [ < ] 로 시작하여 [ > ]로 끝나는 마크업 구조

 (1) 시작 태그 : <section>

 (2) 끝 태그 : </section>

 (3) 빈 엘리먼트 태그 : <line-break />


2.4 엘리먼트(element) : 문서의 논리 요소

 - 시작 태그로 시작하여 짝이 되는 끝 태그로 끝

 - 순서 : [시작태그] [내용(마크업 포함)] [종료태그]

 ex) <Greeting>Hello, World</Greeting> 

 - 빈 엘리먼트 태그

 ex) <line-break />


2.5 애트리뷰트(Attibute) : 이름/값 짝으로 이루어진 마크업 구조

 - 시작 태그 또는 빈 엘리먼트 태그 속에 위치

 - 아래의 경우 엘리먼트 img는 src와 alt의 두 애트리뷰트를 갖는다.

<img src="madonna.jpg" alt='Foligno Madonna, by Raphael' />


2.6 XML 선언 : XML 문서는 아래와 같이 자신에 대한 정보 일부를 선언하는 것으로 시작할 수 있다.

<?xml version="1.0" encoding="UTF-8" ?>


3. XXE 동작 방식

 - XXE(XML External Entity) 공격은 취약하게 설정된 XML parser에 의해 external entity를 참조하는 XML input을 처리하였을 때 발생한다.

 - XML 1.0 표준은 XML 문서의 구조를 정의하고 있다. 그 표준은 몇몇 타입의 저장 단위를 모아 entity라는 컨셉으로 정의한다. 여기에는 일부 다른 entity 타입이 있는데 선언된 시스템 identifier를 통해 로컬 혹은 원격지의 컨텐츠에 접근이 가능한 external entity라는 것이 있다.


4. XXE Injection 공격 예제 분석

<?xml version="1.0" encoding="UTF-8">

<!DOCTYPE rootable[

<!ENTITY xxe SYSTEM "file:///etc/passwd">

]>

<rootable>

<simple>&xxe;</simple>

</rootable>

① Xml 선언문을 작성해준다. 테스트결과 이는 없어도 잘 작동하였다,

② XXE는 DTD 내에 external entity를 선언하고 이를 불러오는 방식으로 작동하는 것이다. 따라서 DTD를 생성하기 위해 작성한다.

③ DTD 외부에 존재하는 /etc/passwd를 불러오기 위해 SYSTEM을 작성해주었다. 이를 통해 /etc/passwd를 불러오는 external entity를 선언한 것이다.

 ( 위의 코드는 <!ENTITY xxe SYSTEM "../../../../../etc/passwd"> 로도 가능하다 )

④ DTD에서 선언한 루트요소를 선언해준다.

⑤ XML 객체를 생성하고 그 내용으로는 우리가 생성한 external entity를 불러오도록 한다.

⑥ 루트요소를 닫아주는 태그를 생성해준다.


- 가장 기본적인 external entity를 예제로 들었고 이외에 더 많은 공격 형태를 보고 싶다면 

https://beistlab.files.wordpress.com/2015/01/grayhash_intro_xxe.pdf 를 참고하여라.


5. XXE Injection 한계

(1). DTD를 선언할 수 있어야 한다.

 - external entity를 선언해주어야 하므로 DTD를 선언할 수 없다면 당연히 원하는 공격이 힘들 것이다.

 - 따라서 파라미터에서 xml=<price>100</price> 같이 xml 객체만을 받는 형식이라면 XXE Injection은 불가하다.


(2) 불러오는 외부 리소스가 DTD 문법에 어긋나지 않아야 함.

 - DTD 문법에 어긋날 경우 xml parser에서 에러가 발생한다.

 - 대표적으로 jsp, php, asp같은 서버사이드 스크립트는 scriptlet 때문에 항상 DTD 문법 오류가 난다.

 

(3) Binary는 불러올 수 없다.

 - XML 문서에서 바이너리 형식의 리소스는 지원하지 않는다.


6. 대응방안

1. 근본적으로 entity 기능을 비활성화하면 XXE Injection은 불가할 것이다.

2. secure coding을 통해 막을 수 있다. (PHP 기준)

 - limxml_use_internal_errors(true) : XML 파싱 도중 오류가 발생하였을 경우, 오류 메시지를 출력하지 않게 해주는 함수

 - libxml_disable_entity_loader(true) : 외부 리소스를 불러오지 못하게 하는 함수


* 참고. 

CDATA : http://parkjuwan.tistory.com/156

https://beistlab.files.wordpress.com/2015/01/grayhash_intro_xxe.pdf

https://ko.wikipedia.org/wiki/XML

http://blog.naver.com/PostView.nhn?blogId=koromoon&logNo=120208853424

http://tcpschool.com/xml/xml_basic_structure

반응형

'Hacking > Web' 카테고리의 다른 글

Injection PHP Code  (0) 2018.03.24
Oracle 을 통해 JAVA 코드 사용  (0) 2018.02.05
SQL Injection With raw MD5 hash  (0) 2018.01.22
SQL Injection_V2.0  (0) 2018.01.17
SQL Injection  (0) 2018.01.16
블로그 이미지

rootable

,