본문 바로가기

InfoSec Log/WEB Hacking

[WEB Hacking] XXE (XML External Entity) 취약점

XML이란?

XML Extensible Markup Language로, 데이터의 저장 및 전송 시 사용하는 언어 중 하나이다. XML은 HTML과 같이 태그가 포함된 트리 형식으로 구조화되어 있다. 또한 XML은 HTML과 다르게 태그가 미리 정의되어 있지 않고, 개발자가 태그에 특정 데이터를 설명할 이름을 지정할 수 있다. 하지만 XML은 웹 역사 초창기에 주로 사용하였으나, 현재는 JSON format이 웹 애플리케이션에서의 데이터 저장 및 전송 방식에 주로 쓰이게 된다. 따라서 XML은 현재 개발되어지는 애플리케이션에서는 찾아보기 힘들고, 단지 현재 유지되고 있는 기존 시스템에서 확인할 수 있을 뿐이다.

source:  https://blog.hubspot.com/website/what-is-xml-file

 

XML Entity

XML Entity는 XML 문서 내에서 데이터 항목을 표현하는 방식을 말한다. 예를 들어, &lt; &gt; 엔티티는 < > 문자를 나타낸다. 이러한 문자는 메타문자로, XML 태그를 나타내는데 사용한다.

 

DTD

DTDDocument Type Definition으로, XML 문서의 구조, 포함할 수 있는 데이터 값의 유형 및 기타 항목을 정의한다. 이러한 DTD는 XML 문서의 시작 부분에 DOCTYPE 요소 내에 정의되어 있다. 이러한 DTD는 문서 자체에 포함되거나(Internal DTD), 외부에서 로드하거나(external DTD), 두 가지 방식이 혼용된 상태일 수 있다.

 

XMLDTD 내에 사용자 정의 엔티티를 사용할 수 있도록 한다. 즉 예를 들어,

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

위와 같은 DTD가 정의되어 있을 때, XML 문서에서 &myentity; 를 참조할 경우, 해당 엔티티는 정의된 값인, “my entity value”로 치환된다.

 

XML External Entity는 선언된 DTD 외부에서 사용자에 의해 정의된 XML Entity를 말한다. 이러한 외부에서 정의된 엔티티를 XML 문서에서 사용하기 위해서는 아래와 같이 SYSTEM 키워드를 사용해야 하며, 또한 엔티티가 로드될 URL을 지정해야만 한다.

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://website.com" > ]>

 

 

만약 아래와 같이 로드될 외부 엔티티의 URL에 file:// scheme을 사용할 수 있을 경우, HTTP 응답의 XML 문서 내에 /path/to/file이라는 지정한 경로의 파일 시스템의 내용을 반환받게 된다.

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>

 

 

보안 위협

  • 만약 외부 엔티티에 파일의 내용을 포함하도록 정의되어 있을 경우, XXE 취약점을 악용하여 애플리케이션의 응답을 통해 파일의 내용을 무단 열람할 수 있다.
  • 백엔드 시스템에 대한 URL이 외부 엔티티에 포함되어 있을 경우, XXE 취약점을 악용하여 SSRF 공격으로 이어질 수 있다.
  • blind XXE 취약점을 악용하여, 민감한 데이터를 애플리케이션 서버에서 공격자가 제어하고 있는 대역 외 서버로 유출될 수 있다.
  • blind XXE 취약점을 악용하여, 공격자는 에러 메시지 내에 민감한 데이터를 포함하여 출력되게 할 수 있다.



Examples

 

CASE 1 | Classic XXE

 

만약 웹 쇼핑몰에서 아래와 같이 Check Stock 버튼을 누르면 특정 지역에서 해당 물품의 재고가 얼마나 남았는지 알려주는 기능이 존재한다고 하자. 

 



그리고 해당 버튼을 누를 때의 요청 메시지를 프록시를 통해 가로채어 확인해보면 데이터의 전송이 XML을 통해서 이루어지는 것을 확인할 수 있다.

 



이 때, 요청 메시지 내의 XML 요청값에 파일 시스템 내의 파일인 /etc/passwd 파일을 불러오도록 <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> 페이로드를 추가하여, 즉 DOCTYPE 요소 내에 외부 엔티티를 정의한 후, 정의한 값을 &xxe;를 통해 참조하도록 서버에 요청을 보내면, 애플리케이션의 응답으로 /etc/passwd 파일의 내용을 포함하여 반환하는 것을 아래 그림에서 확인할 수 있다.




 

CASE 2 | XInclude XXE

 

만약 애플리케이션이 클라이언트 측 데이터를 서버 측 XML 문서에 넣고, 그 후에 파싱할 경우, 공격자는 클라이언트 측에서 전체의 XML 문서를 조작할 수 없고, 따라서 DOCTYPE 요소의 변조를 통해 XXE 공격을 수행할 수 없다. 이럴 경우에는 공격자는 XInclude를 사용하여 XXE 공격을 수행할 수 있다. 이러한 XInclude는 XML 문서 내의 데이터 값에 삽입하여 공격을 수행한다.

 

해당 공격을 수행하기 위해서는 먼저 서버 측에서 XML을 파싱하는지 확인이 필요하다.

 

위 그림처럼 productId라는 파라미터의 값으로 &xxe;를 삽입하여 xxe 엔티티를 참조하도록 요청을 보낸후, 서버 측 응답을 보면, 보안 상의 이유로 엔티티가 허용되어 있지 않다는 메시지가 출력된다. 즉 이는 서버 측에서 XML의 파싱이 이루어진다는 것을 암시하고 있다. 따라서 XInclude를 이용한 아래의 페이로드를 삽입하여 출력 결과를 확인해본다.

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

 

XIclude를 이용하여 파일 시스템의 /etc/passwd 파일의 내용을 반환하도록 요청을 보내면 아래 그림에서와 같이 애플리케이션의 응답으로, /etc/passwd 파일의 내용이 출력되는 것을 확인할 수 있다.

 

 

 

CASE 3 | 파일 업로드

 

만약 애플리케이션에 파일 업로드 기능이 존재하고, 파일 확장자 및 MIME 타입 검증이 미흡하여 svg 파일의 업로드가 가능하다면, 이때 또한 Classic XXE 공격과 마찬가지의 페이로드를 주입하여 파일 시스템의 내용을 읽어올 수 있다. 즉 svg는 Scalable Vector Graphics로, XML에 기반한 벡터 이미지이다. 즉 아래 그림에서 보는 것과 같이 svg 파일은 XML 형식이므로, 해당 XML의 내용을 수정하여 파일 시스템의 내용을 읽어올 수 있다.



파일 시스템 내의 /etc/hostname 파일의 내용을 읽어오기 위해 기존 XML의 내용을 지우고 아래의 페이로드를 삽입한다.

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

 



XML에 페이로드를 삽입하여 서버에 요청을 보냈을 때, 파일 업로드가 성공하고, 업로드 한 파일의 경로를 알고 있거나, 아래 그림과 같이 브라우저에 파일의 내용이 출력이 된다면 업로드 한 파일의 경로로 들어가서 해당 내용을 확인해보면, /etc/hostname의 파일의 내용이 출력된 것을 확인할 수 있다.



 

대응방안

 

사실상 모든 XXE 취약점은 애플리케이션에서 사용하는 XML 파싱 라이브러리에서 잠재적으로 위험하지만 애플리케이션에서는 필요하지 않거나, 사용할 일이 없는 기능을 지원하기 때문에 발생한다. 따라서 가장 쉽고 효과적인 해당 취약점의 대응 방안은 이러한 기능들, 즉 애플리케이션에서 사용할 일이 없는 기능을 사용하지 못하도록 코드를 추가하거나 설정을 변경하여 비활성화하는 것이다. 이러한 방법은 각 XML 파싱 라이브러리 또는 API 관련 문서에 나열되어 있다.

 

그리고 전반적으로, DTD에 외부 엔티티를 참조할 수 없도록 해당 기능을 비활성화하고, XInclude를 지원하지 않도록 설정을 변경하거나 코드를 추가하여 해당 기능을 비활성화 함으로써 XXE 공격에 대응할 수 있다.

 

'InfoSec Log > WEB Hacking' 카테고리의 다른 글

OWASP Top 10 - 2021  (0) 2024.10.11
[WEB Hacking] CSRF Attack  (0) 2024.09.03