xxe

agnusdei·2024년 7월 27일

XXE(XML External Entity) 공격은 XML 기반의 애플리케이션에서 발생할 수 있는 보안 취약점입니다. 이 공격은 XML 파서가 외부 엔티티를 처리할 때 발생하며, 악의적인 사용자가 XML 문서에 외부 엔티티를 포함시켜 서버의 파일 시스템에 접근하거나, 민감한 정보를 유출하거나, 서비스 거부(DoS) 공격을 수행할 수 있습니다.

XXE 공격의 예시

아래는 PHP와 libxml2를 사용하는 간단한 XXE 공격 예시입니다.

  1. 악의적인 XML 입력:
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>
  <bar>&xxe;</bar>
</foo>

위 XML 문서는 file:///etc/passwd 파일의 내용을 읽어오는 외부 엔티티 xxe를 정의합니다.

  1. PHP 코드:
<?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();
?>

분석

  1. 코드 설명:

    • libxml_disable_entity_loader(false)를 호출하여 외부 엔티티 로딩을 활성화합니다. 이는 XXE 공격을 가능하게 합니다.
    • loadXML() 메서드를 사용하여 XML 문서를 로드하고, 내부에 정의된 외부 엔티티를 처리합니다.
  2. 공격 시나리오:

    • 위의 XML을 서버에 전송하면, 서버는 file:///etc/passwd 파일의 내용을 읽어와 출력하게 됩니다. 이는 시스템의 민감한 정보를 노출할 수 있습니다.
  3. 방어 방법:

    • 외부 엔티티 로딩을 비활성화하는 것이 가장 효과적인 방어 방법입니다. libxml_disable_entity_loader(true)로 설정하면 외부 엔티티의 로딩이 차단됩니다.
    • 신뢰할 수 없는 XML 입력을 처리할 때는 입력 검증 및 필터링을 철저히 수행해야 합니다.

결론

XXE 공격은 XML 파서를 사용하는 애플리케이션에서 심각한 보안 위험을 초래할 수 있습니다. 이 공격을 방지하기 위해서는 외부 엔티티 로딩을 비활성화하고, 입력 검증을 철저히 해야 합니다. 이를 통해 시스템을 안전하게 보호할 수 있습니다.

참조에 참조를 반복하는 XXE 공격은 XML 내부에서 외부 엔티티를 재귀적으로 참조하여 서버에 과도한 부하를 일으키는 방식입니다. 이 기법을 통해 공격자는 서버의 자원을 소모시키거나 서비스 거부(DoS) 상태를 유발할 수 있습니다.

예시 설명

  1. 악의적인 XML 입력:
<?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를 참조하고, xxe2xxe1을 세 번 참조하며, xxe3xxe2를 세 번 참조합니다. 이렇게 되면 xxe3는 무한한 양의 데이터를 생성하게 됩니다.

  1. 공격의 작동 방식:
    • XML 파서가 &xxe3;를 처리할 때, xxe3xxe2를 참조하고, xxe2는 다시 xxe1을 참조합니다. 이 과정이 재귀적으로 계속되면서 서버는 무한히 데이터를 처리하려고 하게 됩니다.
    • 이로 인해 서버의 메모리, CPU 사용량이 급증하고, 결국 서비스가 중단될 수 있습니다.

분석

  1. 부하 유발:

    • 참조에 참조를 반복함으로써 XML 문서 내에서 생성되는 데이터의 양이 기하급수적으로 증가합니다. 이는 메모리 사용량을 폭발적으로 증가시키고, CPU 자원을 소모하여 서버의 성능 저하를 초래합니다.
  2. 공격 시나리오:

    • 공격자는 이 XML을 서버에 전송하여, 서버가 이를 처리하는 동안 다른 요청을 처리할 수 없도록 만들 수 있습니다. 결과적으로 서비스 거부 상태가 발생하게 됩니다.

방어 방법

  1. 외부 엔티티 로딩 비활성화:

    • XML 파서에서 외부 엔티티 로딩을 비활성화하는 것이 가장 효과적인 방어 방법입니다. 예를 들어, libxml_disable_entity_loader(true)로 설정하면 외부 엔티티의 로딩이 차단됩니다.
  2. 입력 검증 및 필터링:

    • XML 입력을 신뢰할 수 있는 소스에서만 받아들이고, 불필요한 엔티티 참조를 차단하는 필터링을 적용해야 합니다.
  3. 자원 제한 설정:

    • 서버의 메모리 및 CPU 사용량을 모니터링하고, 특정 임계치를 초과할 경우 요청을 차단하거나 경고를 발생시킬 수 있는 메커니즘을 구축하는 것이 중요합니다.

결론

XXE 공격에서 참조에 참조를 반복하는 방식은 서버에 심각한 부하를 유발할 수 있습니다. 따라서 외부 엔티티 로딩을 비활성화하고, 적절한 입력 검증을 수행하는 것이 이러한 공격을 예방하는 데 필수적입니다.

profile
DevSecOps Pentest🚩

0개의 댓글