XML ExternalEntity (XXE) Injection 취약점은 사용자 입력에서 XML 데이터를 적절하게 검증하거나 안전하게 파싱하지 않을 때 발생하며, 이를 악용해 XML의 기능을 사용해 악의적인 행위를 수행할 수 있다. XXE 취약점은 웹 애플리케이션과 백엔드 서버에 상당한 피해를 줄 수 있으며, 민감한 파일을 유출하거나 백엔드 서버를 중단시키는 등의 공격이 가능하다. 이러한 이유로 XXE는 OWASP에서 선정한 상위 10위 안에 드는 웹 보안 취약점에 속한다.
XML
Extensible Markup Language인 XML은 HTML과 SGML과 유사한 일반적인 마크업 언어로, 다양한 애플리케이션에서 데이터와 문서를 유연하게 전송하고 저장하는 데 사용된다. XML은 데이터를 표시하는 것이 아니라, 문서의 데이터를 저장하고 데이터 구조를 표현하는 데 중점을 둔다. XML 문서는 ELEMENT TREE로 구성되며, 각 요소는 태그로 표현된다. 첫 번째 요소는 root element라고 하며 하위 요소들은 child elements라고 한다.
다음은 이메일 문서 구조를 표현하는 XML 문서 예제이다.
<?xml version="1.0" encoding="UTF-8"?>
<email>
<date>01-01-2022</date>
<time>10:00 am UTC</time>
<sender>john@inlanefreight.com</sender>
<recipients>
<to>HR@inlanefreight.com</to>
<cc>
<to>billing@inlanefreight.com</to>
<to>payslips@inlanefreight.com</to>
</cc>
</recipients>
<body>
Hello,
Kindly share with me the invoice for the payment made on January 1, 2022.
Regards,
John
</body>
</email>
다음은 XML 문서의 주요 요소를 포함하고 있다.
Key Definition Example
Tag | XML의 문서 키로, 일반적으로 <,>로 둘러싸여 있음 | <date> |
Entity | XML 변수로, 일반적으로 &와 ;로 문자를 포함하고 있다. | < |
Element | 루트 요소 또는 자식 요소로, 값은 시작 태그와 종료 태그 사이에 저장된다. | <date>01-01-2022</date> |
Attribute | 태그 안에 추가로 넣을 수 있는 정보로, XML을 해석하는 프로그램이 이를 활용할 수 있음 | version="1.0"/encoding="UTF-8" |
Declaration | 일반적으로 XML 문서의 첫 번째 줄로, XML 버전 및 인코딩을 정의함 | <?xml version="1.0" encoding="UTF-8"?> |
- PCDATA : XML 파서에 의해 분석될 문제 데이터를 의미한다. 간단하게 말하면 XML 요소의 시작 태그와 종료 태그 사이에 위치한 텍스트를 PCDATA라고 생각하면 된다. PCDATA는 XML 파서가 엔티티와 마크업으로 나누어 분석한다. 이렇게 XML 파서에 의해 분석될 문자 데이터만을 가지는 요소는 요소의 내용을 #PCDATA 로 명시해 선언한다. <!ELEMENT 요소이름 (#PCDATA)>
- CDATA : XML 파서가 분석하지 않는 문자 데이터를 의미한다. DTD에서 요소의 컨텐츠에는 PCDATA만 올 수 있으며, 속성의 속성값으로는 CDATA만 올 수 있다. <!ATTLIST 요소이름 속성이름 CDATA 속성값>
또한 XML 문서 구조에서 < ,> ,&," 등의 특수 문자는 엔티티 참조로 대체해야 한다. (<,>,&,") XML 문서에서 주석은 <!-- 와 --> 사이에 작성할 수 있으며, 이는 HTML 주석과 유사하다.
XML 문서 유형 정의 [XML Document Type Definition, DTD]는 XML 문서를 사전 정의된 문서 구조에 따라 검증하는 역할을 한다. 이러한 사전 정의된 문서 구조는 문서 내부에 정의하거나 외부 파일에서 참조할 수 있다. 아래는 앞서 본 XML 문서의 DTD 예제이다.
<!DOCTYPE email [
<!ELEMENT email (date, time, sender, recipients, body)>
<!ELEMENT recipients (to, cc?)>
<!ELEMENT cc (to*)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT time (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
이 DTD에서는 루트 요소인 <email> 을 선언하고, 그 자식 요소들을 정의한다. 각 자식 요소도 개별적으로 선언되며, 일부 요소는 추가 자식 요소를 포함할 수도 있고, 일부 요소는 단순히 텍스트 데이터(#PCDATA)만을 포함할 수도 있다.
이러한 DTD는 XML 문서 내에서 XML 선언 다음에 직접 포함될 수도 있으며, 외부 파일email.dtd 로 저장한 후, 아래와 같이 SYSTEM 키워드를 사용해 참조할 수도 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email SYSTEM "email.dtd">
또한, URL을 사용해 원격 DTD를 참조하는 것도 가능하다.
http://inlanefreight.com/email.dtd>">
이는 HTML 문서에서 JavaScript 및 CSS 파일을 정의하고 참조하는 방식과 유사하다.
XML Entities
XML DTD에서는 사용자 정의 Entity를 정의해 변수 재사용을 가능하게 하고 중복 데이터를 줄일 수 있다. Entity는 ENTITY 키워드를 사용해 정의되며, Entity 이름과 값이 지정된다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [
<!ENTITY company "Inlane Freight">
]>
한 번 Entity를 정의하면, XML 문서 내에서 &company; 와 같이 참조할 수 있으며, XML 파서는 이를 해당 값으로 대체된다.
여기서 주목해야할 점은 External XML Entities를 SYSTESM 키워드를 사용해 참조할 수 있다. 이를 통해 외부 파일을 XML 문서 내에서 직접 불러올 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [
<!ENTITY company SYSTEM "<http://localhost/company.txt>">
<!ENTITY signature SYSTEM "file:///var/www/html/signature.txt">
]>
SYSTEM 대신 PUBLIC 키워드를 사용해 공용으로 선언된 Entity나 표준(Ex: lang="en" )을 로드할 수도 있다.
내부적으로 정의된 XML Entity와 마찬가지로, 외부 Entity를 참조할 때(Ex: &signature; ), XML 파서는 해당 Entity를 외부 파일(signature.txt) 의 내용으로 대체한다. 서버 측에서 SOAP(XML) API나 웹 폼을 처리하는 경우, Entity를 통해 백엔드 서버에 저장된 파일을 참조할 수 있으며, 이를 활용하면 파일을 유출하거나 더 심각한 악성 행위를 수행할 수 있다.
'Hack The Box CBBH' 카테고리의 다른 글
CBBH - Web Attacks[Local File Disclosure] (0) | 2025.02.10 |
---|---|
CBBH - Web Attacks[IDOR Prevention] (0) | 2025.02.10 |
CBBH - Web Attacks[Chaining IDOR Vulnerabilities] (0) | 2025.02.10 |
CBBH - Web Attacks[IDOR in Insecure APIs] (0) | 2025.02.10 |
CBBH - Web Attacks[Bypassing Encoded References] (0) | 2025.02.10 |