간과하기 쉬운 보안 허점, XML 외부 개체(XML External Entity, XXE) 취약점

XML은 웹 상에서 규격화된 통신을 위해 오랫동안 사용되어 왔고 여전히 가장 많이 사용되는 문서 포맷 중 하나입니다. 웹 어플리케이션을 작성할 때 반드시 이용되는 포맷이기도 합니다. 이러한 XML 문서 내에는 외부 개체를 참조하는 내용이 포함될 수 있습니다. XML이 오래된 만큼 오래된 XML 파서나 취약한 설정을 가진 XML파서가 많기 때문에 이러한 외부 개체 참조가 문제가 될 수 있습니다. 공격자는 취약한 XML 파서에 외부 개체를 삽입한 XML을 주입하여 대상 서버로 하여금 외부 개체를 파싱하도록 합니다. 취약한 XML 파서는 XML 문서를 파싱하는 과정에서 외부 개체를 그대로 처리하게 되며 이 과정에서 공격자는 기밀 정보를 훔치거나 허가되지 않는 접근을 하는 등 공격을 할 수 있습니다.

 

XXE(XML External Entity) 공격과 대응방안

XXE(XML External Entity) 공격은 취약한 XML 파서에 XML을 주입(Injection)하는 Injection 공격의 일종입니다. 이 공격은 XML 문서를 Validate 하는 과정에서 DTD를 참고하는 점을 악용(Exploit) 합니다.

1. XML문서의 분류

XML 문서는 Well-formed 문서와 Valid 문서로 나누어집니다. Well-formed 문서란 XML 문법에 맞는 XML 문서를 뜻하고 Valid 문서란 Rule에 맞게 작성된 XML 문서를 뜻합니다.

1) Well-formed 문서

아래 XML 문법을 준수한 문서를 Well-formed 문서라고 합니다.

  1. 루트(root) 요소를 하나만 가져야 합니다.
  2. 모든 XML 요소는 종료 태그를 가져야 합니다.
  3. 시작 태그와 종료 태그에 사용된 태그 이름이 대소문자까지 완벽하게 일치해야 합니다.
  4. 모든 XML 요소의 여닫는 순서가 반드시 정확하게 지켜져야 합니다.
  5. 모든 속성의 속성값이 따옴표로 둘러싸여 있어야 합니다.

 

2) Valid 문서

여기서 Valid 란 Well-formed 문서보다 더 엄격한 규칙을 준수하는 문서입니다. 1)의 XML 작성 규칙을 준수할 뿐 아니라 해당 XML 문서가 지켜야 할 Rule에 맞게 작성된 문서를 의미합니다. XML 문서에는 이러한 Rule을 지정할 수 있는 DTD와 Namespace가 있습니다. DTD와 Namespace에는 XML 문서의 구조와 사용할 수 있는 요소(Element) 및 속성(Attribute)을 정의합니다.

 

2. XXE란

DTD에서는 특정 값에 대한 참조를 위해 엔티티를 사용할 수 있습니다. 이 때 참조하는 값은 문서 내부에 적을 수도 있고 외부 시스템을 지칭할 수도 있습니다.

1) 내부 엔티티

내부 엔티티는 문서 내에 값을 명시합니다.

DTD Example:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

XML example:

<author>&writer;&copyright;</author>

2) 외부 엔티티

외부 엔티티는 문서 외부의 URI를 명시하여 값을 제공합니다.

DTD Example:

<!ENTITY writer SYSTEM "https://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "https://www.w3schools.com/entities.dtd">

XML example:

<author>&writer;&copyright;</author>

바로 이 외부 엔티티에서 참조하는 URI 상에 Malicious Code를 작성해 XML 파서가 파싱하도록 하는 것입니다.

 

3. XXE 공격

공격자는 Malicious Code를 참조하는 외부개체를 주입하여 피해 서버로 하여금 해당 XML을 파싱하도록 합니다.

  1. 해커는 취약한 XML 파서를 가진 사이트를 특정한 후 XML문서를 주입합니다.
  2. XML 파서는 DTD(Document Type Declaration, XML의 형식을 규정하는 문서)에 포함된 외부 개체에 접근합니다.
  3. XML 파서는 주어진 XML이 DTD에 맞게 작성되었는지 확인하는 과정에서 DTD의 외부 개체를 읽어들입니다.
  4. 주입된 XML이 파싱됩니다.
  5. 민감 정보가 공격자의 손에 들어갑니다.

XXE공격

 

4. XXE 공격 대응방안

XML 문서는 외부 클라이언트와 통신할 수 있도록 만들어졌기 때문에 특정 개체만 불러오지 않도록 설정하는 것은 어렵습니다. 따라서 XML파서는 시스템 내부의 DTD만을 참조하도록 하고 XML내부에 선언된 DTD는 허용하지 않도록 설정해야 합니다. 즉 신뢰할 수 없는 외부의 DTD는 허용하지 않고 안전하게 구성된 내부의 DTD만을 사용해야 합니다. 신뢰할 수 있는 내부 DTD의 엔티티를 통해 참조할 외부 개체를 제한하는 것입니다.

 

 

참고 문서
TOPSCHOOL.COM, XML 문서의 종류
OWASP, XML External Entity (XXE) Processing
w3schools.com, DTD - Entities
OWASP, XML External Entity Prevention Cheat Sheet

 

 

다른 글 더 보기

인젝션(Injection), OWASP Top 10 2017 A1
취약한 인증(Broken Authentication), OWASP Top 10 2017 A2
민감한 데이터 노출(Sensitive Data Exposure), OWASP Top 10 2017 A3

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">