XXE Injection

보안노트·2024년 1월 23일
0

XXE Injection이란?

(X)ML E(x)ternal (E)ntity (XXE) : XML 외부 개체 주입
XML을 통해 데이터를 주고받는 기능에 대해서 외부 개체를 주입하는 공격이다.
서버 내의 자원 설정 파일들, 소스 코드 등을 무단 열람하는 취약점이다.

  • json이 등장하여 XML의 사용 빈도가 많이 줄어드는 추세이지만 아직 XML 환경이 많은 상황이다. (레거시 프로젝트가 주로 사용)




공격 대상

  • XML Parser 기능이 있는 애플리케이션에 대해서 공격을 시도하게 된다.
    주로, 레거시 시스템이 XML로 주고받는 것들이 많기 때문에 이를 통해서 공격을 진행하게 된다.

  • XML 파싱을 하는지 알 수 있는 방법은? : 어플리케이션 이용 시 메세지 바디에 XML 형태로 데이터가 전송되는 경우 XXE 인젝션 공격을 시도할 수 있다.




XXE Injection 공격 원리

  • 정상적인 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>




대응 방안

  1. JSON 데이터 형식으로 기능 구현

  2. DTD 및 외부 엔티티 비활성화

DTD : Document Type Definition => 미리 정의된 문서 구조에 대해 XML 문서의 유효성을 검사할 수 있다.

0개의 댓글

관련 채용 정보