XXE(XML외부 엔티티) 공격
서버에서 XML 외부 엔터티를 참조할 수 있을 때 발생하는 보안 취약점을 악용한 공격 기법이다.
XXE 공격을 통해 공격자는 서버 파일 시스템에 접근하거나 내부 네트워크를 스캔하는 등의 악의적인 행위를 할 수 있다.
XML 외부 엔티티는 아래와 같은 형태로 선언된다.
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
이러한 형태는 DOCTYPE 선언을 한 다음 ENTITY 태그를 사용하여 xxe라는 외부 엔티티를 선언하고 있다.
선언된 외부 엔티티는 프로그래밍에서 변수를 참조하는 것처럼 XML 내부에서 참조할 수 있다.
즉, xxe 엔티티를 참조하면 xxe의 값인 SYSTEM 키워드로 저장된 /etc/passwd 파일을 참조하게 된다.
XXE Attack 실습
-실습 목표-
burpsuite의 repeater기능을 사용해서 XML attack을 수행하고 /etc/passwd 파일의 내용을 출력해 보자.
실습 페이지에 접속해서 any bugs버튼을 누른 다음에 burpsuite에서 전송된 요청 정보를 확인해 보자.
bWAPP/xxe-2.php의 요청 메시지부터 확인해 보자.
요청 메시지의 Content-Type 헤더가 text/xml 타입이고 바디 부분은 XML형태의 데이터가 전송되는 것을 확인할 수 있다.
이번엔 응답 메시지 쪽을 확인해 보자.
XML데이터 중에서 <login></login> 사이에 있는 bee문자열이 응답 메시지에서 bee's secret has been reset형태로 나타난 것을 확인할 수 있다. 한번 bee문자열을 다른 문자열로 변경시켜 보자.
-웹 모의해킹 팁-
XML 태그의 내용이 응답 페이지에서 발견된다면 XXE attack 시도가 가능할 수 있다.
XML을 수정하기 위해서 repeater로 해당 요청을 전송하자.
기존에 있던 bee값을 yyss로 변경시켰더니 yyss로 되돌아오는 것을 확인할 수 있다.
이러한 사실을 통해서 서버가 XML을 처리하고 있다는 것을 추측할 수 있게 된다.
그렇다면 이번엔 /etc/passwd 파일을 지정하는 외부 엔티티를 선언해 보자.
요청 매시지의 바디 부분에 이렇게 외부 엔티티를 참조해서 /etc/passwd 파일의 내용을 확인할 수 있다.
XXE Attack 대응법
- 외부 엔티티 참조 기능이 필요하지 않은 경우 외부 엔티티 관련 설정을 비활성화하자.
- 시스템 운영자나 보안관리자의 관점에서 ENTITY 태그가 요청 메시지를 통해 전달되는 것이 확인된다면 원래 의도된 요청인지 확인하는 작업이 필요하다.
- 서비스 중인 웹 애플리케이션에서 XML 외부 엔티티 기능을 사용할 필요가 없다면 웹 방화벽 장비를 사용해서 해당 메시지를 차단하는 방법도 있다.