김승현

XML EXTERNAL ENTITY 본문

book_summary

XML EXTERNAL ENTITY

kshind 2024. 8. 7. 17:46

XML이란?

Extensible Markup Language (XML)은 데이터를 저장하고 전송하기 위해 설계된 마크업 언어

개발자가 임의의 데이터 구조를 텍스트 형식으로 정의하고 표현할 수 있도록 하며, HTML과 유사한 트리 구조

 

<saml:AttributeStatement>
 <saml:Attribute Name="username">
 <saml:AttributeValue>
 vickieli
 </saml:AttributeValue>
 </saml:Attribute>
</saml:AttributeStatement>

 

XML은 사용자 정의 태그 이름을 사용하기 때문에 XML 문서를 자유롭게 구조화 가능

-> XML 형식은 웹 애플리케이션의 인증, 파일 전송, 이미지 업로드, HTTP 데이터를

    클라이언트와 서버 간에 전송하는 다양한 기능에서 널리 사용 

 

또한 XML은 문서 형식 정의(DTD)를 포함할 수 있음

이러한 DTD는 외부 소스에서 로드하거나 DOCTYPE 태그 내에 문서 자체에 선언 가능함

예시

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
 <!ENTITY file "Hello!">
]>
<example>&file;</example>

 

XML 엔터티는 프로그래밍 언어의 변수처럼 작동함

 

이 엔터티를 &file; 구문을 사용하여 참조할 때마다 XML 문서는 그 자리에 file의 값을 로드.

위 경우 XML 문서 내의 &file; 참조는 모두 "Hello!"로 대체됨

 

XML 문서는 URL을 사용하여 로컬 또는 원격 콘텐츠에 접근하는 외부 엔터티도 사용할 수 있음

엔터티의 값이 SYSTEM 키워드로 시작하면, 해당 엔터티는 외부 엔터티이며, 그 값은 URL에서 로드됨

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
 <!ENTITY file SYSTEM "file:///example.txt">
]>
<example>&file;</example>

 

 

예방법

XXE 공격을 예방하는 방법은  XML 파서의 기능을 제한하는 것에 달려있음.

  • XML 파서에서 DTD 처리를 비활성화해야 함
    • DTD 처리가 XXE 공격의 필수 조건이기 때문

만약 DTD를 완전히 비활성화하는 것이 불가능하다면?

외부 엔티티, 매개변수 엔티티, XML 문서에 포함된 인라인 DTD를 비활성화해야 함

 

+XXE 기반의 DoS를 방지하기 위해, XML 파서의 파싱 시간과 파싱 깊이 제한

+엔티티의 확장을 아예 비활성화

+입력 값 검증

+XML대신 JSON 사용

 

XXE 헌팅법

  1. XML 데이터 입력 지점을 찾기
    • base64로 인코딩된 XML 코드 블록은 'PD94bWw'
    • XML은 XML, HTML, DOCX, PPTX, XLSX, GPX, PDF, SVG, RSS 피드와 같은 문서 및 이미지 형식에 작성 가능
      또한, GIF, PNG, JPEG 파일과 같은 이미지 내에 포함된 메타데이터도 모두 XML 기반
    • 다른 형식의 입력을 받는 엔드포인트에서 요청의 Content-Type 헤더를 아래의
      • Content-Type: text/xml
      • Content-Type: application/xml
      헤더들로 바꿔본 다음 요청 본문에 XML 데이터를 포함시켜 입력 시도 해보기
  2. 전형적인 XXE 테스트
  3. 블라인드 XXE 테스트
  4. 다른 파일 형식에 XXE 페이로드 삽입

 

공격 확대

  1. SSRF 공격을 위한 기반 마련
  2. 파일 읽기