간과하기 쉬운 보안 허점, 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 문서라고 합니다.
- 루트(root) 요소를 하나만 가져야 합니다.
- 모든 XML 요소는 종료 태그를 가져야 합니다.
- 시작 태그와 종료 태그에 사용된 태그 이름이 대소문자까지 완벽하게 일치해야 합니다.
- 모든 XML 요소의 여닫는 순서가 반드시 정확하게 지켜져야 합니다.
- 모든 속성의 속성값이 따옴표로 둘러싸여 있어야 합니다.
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;©right;</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;©right;</author>
바로 이 외부 엔티티에서 참조하는 URI 상에 Malicious Code를 작성해 XML 파서가 파싱하도록 하는 것입니다.
3. XXE 공격
공격자는 Malicious Code를 참조하는 외부개체를 주입하여 피해 서버로 하여금 해당 XML을 파싱하도록 합니다.
- 해커는 취약한 XML 파서를 가진 사이트를 특정한 후 XML문서를 주입합니다.
- XML 파서는 DTD(Document Type Declaration, XML의 형식을 규정하는 문서)에 포함된 외부 개체에 접근합니다.
- XML 파서는 주어진 XML이 DTD에 맞게 작성되었는지 확인하는 과정에서 DTD의 외부 개체를 읽어들입니다.
- 주입된 XML이 파싱됩니다.
- 민감 정보가 공격자의 손에 들어갑니다.
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
A09 - 2021 : Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패), OWASP Top 10
취약한 인증(Broken Authentication), OWASP Top 10 2017 A2
민감한 데이터 노출(Sensitive Data Exposure), OWASP Top 10 2017 A3
'IT Contents > IT Topic' 카테고리의 다른 글
취약한 인증(Broken Authentication), OWASP Top 10 2017 A2 (0) | 2023.02.13 |
---|---|
IT서비스 협약서, SLA(Service Level Agreement) (0) | 2023.02.13 |
학습데이터 부족현상 해결법, 전이학습(Transfer Learning) (1) | 2023.02.13 |
A09 - 2021 : Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패), OWASP Top 10 (0) | 2023.02.11 |
OWASP Top 10 2021, 무엇이 바꼈을까? (0) | 2023.02.11 |
최근댓글