(X)ML E(x)ternal (E)ntity (XXE) : XML 외부 개체 주입
XML을 통해 데이터를 주고받는 기능에 대해서 외부 개체를 주입하는 공격이다.
서버 내의 자원 설정 파일들, 소스 코드 등을 무단 열람하는 취약점이다.
XML Parser 기능이 있는 애플리케이션에 대해서 공격을 시도하게 된다.
주로, 레거시 시스템이 XML로 주고받는 것들이 많기 때문에 이를 통해서 공격을 진행하게 된다.
XML 파싱을 하는지 알 수 있는 방법은? : 어플리케이션 이용 시 메세지 바디에 XML 형태로 데이터가 전송되는 경우 XXE 인젝션 공격을 시도할 수 있다.
정상적인 XML Parser : 어플리케이션에서 XML Parser를 통해 XML 형식의 데이터를 정상적으로 받아와 Parser 처리를 한 후 어플리케이션에 반환하는 방식.
비정상적인 XML Parser : XML에서 외부 파일을 참조하고 파서 처리를 한 후에 어플리케이션에 반환하는 방식이다. 즉 XML에서 외부 개체를 참조하는 것이다.
비정상적인 XML Parser에서 외부 참조를 할 수 있는 이유 : DTD (Document Type Definition, 문서 타입 정의), Entity
Entity : 특정 문자를 사용할 수 있도록 해주는 역할이며 내부 엔티티와 외부 엔티티가 있다. XXE 인젝션이 발생하는 이유는 외부 엔티티로 인해서 외부 개체를 참조하기 때문이다.
외부 파일에 꺽쇠(<,>)또는 특수 문자가 포함되어 있다면 XML 파싱 오류가 발생하게 된다.
파싱 오류 없이 데이터를 확인하려면 아래와 같이 base64로 인코딩하여 인코딩된 데이터를 디코딩하여 확인하는 방법이 있다.
<!DOCTYPE test[
<!ENTITY str SYSTEM "php://filter/read=convert.base64-encode/resource=file:///경로/외부 파일.확장자">
]>
<result>&str;</result>
JSON 데이터 형식으로 기능 구현
DTD 및 외부 엔티티 비활성화
DTD : Document Type Definition => 미리 정의된 문서 구조에 대해 XML 문서의 유효성을 검사할 수 있다.