티스토리 뷰

study/web

[web] XXE Injection

hoppi 2022. 3. 6. 14:27

81번째 글.

 

 

 

1. XXE Injection이란?

XXE(XML eXternal Entity) Injection 취약점은 XML 데이터를 제대로 검증하지 않거나 안전하게 파싱하지 않고 

사용자가 제어하는 입력에서 XML 데이터를 가져올 때 발생하며 이를 통해 악의적인 작업을 수행할 수 있다.
민감한 파일 노출부터 백엔드 서버 다운 등을 통해서 웹 어플리케이션이나 백엔드 서버에 상당한 위협이 된다.

 

 

 

2. XML 이란?

그렇다면 XML은 무엇일까

XML(eXtensible Markup Language)은 HTML처럼 일반적인 마크업 언어로 다양한 유형의 응용프로그램에서

데이터와 문서를 유연하게 전송하고 저장하도록 설계되었다.

XML은 데이터를 표시하는데 포커스를 맞추지 않고 문서의 데이터를 저장, 데이터 구조를 표현하는데 초점을 맞춘다.

 

Key 설명 예시
Tag XML 문서의 구성요소로 (</>)로 감싸져있음 <date>
Entity XML 변수로 (&/;)로 감싸져 있음 &today;
Element 루트 또는 하위 요소이며 시작태그와 끝 태그 사이에 값이 저장되어있음 <date>2022-03-06</date>
Attribute 태그에 저장된 요소의 선택적 사양으로 XML parser에 의해서 사용됨 version="1.0"/encoding="UTF-8"
Declaration 주로 XML 문서의 첫번째 라인에 있고
XML의 버전과 인코딩 정보를 나타낸다.
<?xml version="1.0"/encoding="UTF-8"?>

 

 

 

3. XML DTD

XML DTD(Document Type Definition)을 사용하면 미리 정의된 문서 구조에 대해 XML 문서의 유효성을 검사할 수 있다.
미리 정의된 구조는 문서 자체로 정의될 수 있거나 외부파일형태도 가능하다.

 

<!DOCTYPE email [
  <!ELEMENT email (date, time, sender, recipients, body)>
  <!ELEMENT recipients (to, cc?)>
  <!ELEMENT cc (to*)>
  <!ELEMENT date (#PCDATA)>
  <!ELEMENT time (#PCDATA)>
  <!ELEMENT sender (#PCDATA)>
  <!ELEMENT to  (#PCDATA)>
  <!ELEMENT body (#PCDATA)>
]>

위처럼 DTD는 ELEMENT 타입 선언과 함께 root인 email 요소를 선언하고
child 요소를 나타낸다(denote). 그 후 각 자식 요소들이 선언되고 일부는 또 다른 자식 요소를 가지는 반면 

다른 것들은 원시 데이터만 포함할 수 있다. (Parsed Character DATA: 파서에 의해 분석될 문자 데이터)

DTD는 첫 번째 줄의 XML 선언 바로 뒤에 배치할 수 있다.
아니면 외부 파일의 형태로 저장하고 다음과 같이 XML 문서내에서 SYSTEM 키워드와 함께 참조될 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email SYSTEM "email.dtd">

 

 

 

4. XML Entity

또한 XML DTD에서 사용자 정의 엔티티를 정의하여 변수를 리팩토링하고 반복 데이터를 줄일 수 있다.

다음과 같이 엔티티 키워드 뒤에 엔티티 이름과 값이 나오는 방식으로 사용한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [
  <!ENTITY company "Security Company">
]>

 

엔티티가 선언되면 XML 문서에서 &와 ; 사이에서 참조될 수 있다.(e.g &company;) 

엔티티가 참조될 떄마다 해당 엔티티는 XML parser에 의해서 해당 값으로 바뀐다.
또한 다음과 같이 외부 XML 엔티티를 SYSTEM 키워드와 함께 참조할 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [
  <!ENTITY company SYSTEM "http://localhost/company.txt">
  <!ENTITY signature SYSTEM "file:///var/www/html/signature.txt">
]>

 

 

 

5. XXE Injection Example

사용자의 입력값들이 XML 포맷의 형태로 서버로 전달되는데 

입력한 값 중에서 email이 응답 값으로 나타난다.

만약 시스템이 사용자의 입력값 검증을 하지 않는다면 다음과 같이 LFI이 가능해진다.

 

 

 

Reference

'study > web' 카테고리의 다른 글

[web] XXE Injection Advanced  (0) 2022.03.09
[web] DOM Clobbering  (0) 2021.01.28
[web] About CSP  (2) 2021.01.14
[web] python pickle module(deserialize vulnerability)  (0) 2021.01.07