XML 외부 엔티티 공격

XML external entity attack

XML 외부 엔터티 공격(XXE 공격)은 XML 입력을 구문 분석하는 응용프로그램에 대한 공격의 일종이다.이 공격은 외부 엔티티에 대한 참조를 포함하는 XML 입력이 약하게 구성된 XML 파서에 의해 처리될 때 발생한다.이 공격은 기밀 데이터의 공개, 서비스 거부, 서버 측 요청 위조, 파서가 위치한 기계의 관점에서 포트 스캐닝, 기타 시스템 영향 등으로 이어질 수 있다.[1]

설명

XML 1.0 표준은 XML 문서의 구조를 정의한다.이 표준은 엔티티라고 불리는 개념을 정의하는데, 이 개념은 어떤 유형의 저장 단위다.선언된 시스템 식별자를 통해 로컬 또는 원격 콘텐츠에 액세스할 수 있는 외부 일반/매개변수 파싱 엔터티가 종종 외부 엔티티로 단축되는 몇 가지 다른 유형의 엔티티가 있다.시스템 식별자는 엔티티를 처리할 때 XML 프로세서가 참조(액세스)할 수 있는 URI로 가정한다.그런 다음 XML 프로세서는 명명된 외부 엔티티의 발생을 시스템 식별자가 참조하지 않은 내용으로 대체한다.시스템 식별자가 오염된 데이터를 포함하고 XML 프로세서가 이 오염된 데이터를 참조하지 않는 경우, XML 프로세서는 응용프로그램에서 일반적으로 접근할 수 없는 기밀 정보를 공개할 수 있다.유사한 공격 벡터는 외부 DTD, 외부 스타일 시트, 외부 스키마 등의 사용을 적용하며, 포함된 경우 유사한 외부 리소스 포함 스타일 공격을 허용한다.

공격에는 암호나 개인 사용자 데이터와 같은 중요한 데이터를 포함할 수 있는 로컬 파일을 시스템 식별자의 구성표 또는 상대 경로를 사용하여 공개하는 것이 포함될 수 있다.XML 문서를 처리하는 응용프로그램과 관련하여 공격이 발생하므로 공격자는 이 신뢰할 수 있는 응용프로그램을 사용하여 다른 내부 시스템으로 피벗할 수 있으며, HTTP 요청을 통해 다른 내부 내용을 공개하거나 보호되지 않은 내부 서비스에 CSRF 공격을 시작할 수 있다.경우에 따라 클라이언트 쪽 메모리 손상 문제에 취약한 XML 프로세서 라이브러리를 악의적인 URI를 무시하여 악용하여 응용 프로그램 계정에서 임의 코드를 실행할 수 있다.다른 공격은 데이터 반환을 멈추지 않는 로컬 리소스에 액세스할 수 있으며, 너무 많은 스레드 또는 프로세스가 릴리스되지 않을 경우 애플리케이션 가용성에 영향을 미칠 수 있다.

응용 프로그램이 정보 공시에 취약하도록 공격자에게 응답을 명시적으로 반환할 필요는 없다는 점에 유의한다.공격자는 DNS 정보를 활용하여 하위 도메인 이름을 통해 자신의 통제 하에 있는 DNS 서버로 데이터를 유출할 수 있다.

위험요소

  • 응용프로그램은 XML 문서를 구문 분석한다.
  • 오염된 데이터는 기업의 시스템 식별자 부분, 문서 유형 정의(DTD) 내에서 허용된다.
  • XML 프로세서는 DTD를 검증하고 처리하도록 구성된다.
  • XML 프로세서는 DTD 내의 외부 엔티티를 해결하도록 구성된다.

아래의 예는 XML 주입 테스트(OWASP-DV-008)에서 볼 수 있다.[2]

반환되지 않을 수 있는 로컬 리소스 액세스

 <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!엔티티 xxe 시스템 "파일://dev/random" >><foo>&xe;</foo>

원격 코드 실행

PHP "예상" 모듈을 로드할 때 변경된 페이로드로 원격 코드 실행이 가능할 수 있다.

 <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!기업체 xxe SYSTEM "기대://id" >><creds> <user>&xe;</user> mypass </creds>.

/etc/passwd 또는 기타 대상 파일 공개

 <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!엔티티 xxe 시스템 "file://etc/passwd" >><foo>&xe;</foo> <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!엔티티 xxe 시스템 "file://etc/shadow" ><foo>&xe;</foo> <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!엔티티 xxe 시스템 "file://c:/boot.ini" >><foo>&xe;</foo> <?xml 버전="1.0" 인코딩="ISO-8859-1"?> <!DOCTYPE foo [!Element foo ANY > <!엔티티 xxe 시스템 "http://www.attacker.com/text.txt"><foo>&xe;</foo>

완화

전체 XML 문서는 신뢰할 수 없는 클라이언트로부터 전달되기 때문에, 일반적으로 DTD의 시스템 식별자 내의 오염된 데이터를 선택적으로 검증하거나 유출하는 것은 불가능하다.따라서 XML 프로세서는 로컬 정적 DTD를 사용하도록 구성되어야 하며 XML 문서에 포함된 모든 선언된 DTD를 허용하지 않아야 한다.

참고 항목

참조

  1. ^ "What Are XML External Entity (XXE) Attacks". Acunetix.
  2. ^ https://owasp.org/www-project-web-security-testing-guide/assets/archive/OWASP_Testing_Guide_v3.pdf

외부 링크