본문 바로가기

웹해킹

웹해킹 #12 XXE(XML 외부 엔티티) 공격

- 접근 통제 취약점의 일부

 

1. XXE 공격 개요

- XML 타입의 데이터가 웹 요청을 통해 전송되고, 서버에서 XML 외부 엔티티를 처리할 수 있도록 설정된 경우 나타남
-
사용자가 웹 어플리케이션으로 전달되는 XML 데이터를 직접 업로드하거나 수정할 수 있는 경우, 공격자는 외부 엔티티를 참조하는 XML 데이터를 전송하여 파일과 같은 서버 내부의 정보를 탈취하거나 서비스 거부 공격, SSFR 등의 공격 수행 가능

 - XML 외부 엔티티 선언 형태

<!DOCTYPE foo [
<!ENTITY xxe SYSTEM “file:///etc/passwd”>
]>

- DOCTYPE 선언 후 ENTITY 태그를 이용하여 xxe라는 외부 엔티티 선언
-
선언된 외부 엔티티는 프로그래밍을 할 때 변수를 참조하는 것처럼 XML 내부에서 참조 가능
→ xxe
엔티티 참조하면, xxe의 값인 SYSTEM 키워드로 지정된 /etc/passwd 파일 참조함

- file:// 사용하면 호스트 내부 파일 참조, http:// 사용하면 외부 리소스 참조 가능

2. XXE 공격 실습

실습 : 버프 스위트의 리피터 기능을 이용하여 XXE 공격 수행 후 /etc/passwd/ 파일 내용 출력

 

- Any bugs? 버튼은 사용자의 시크릿이 버튼에 표시된 문자열로 초기화하는 기능
-
버프스위트로 웹 요청 메시지 확인 (/bWAPP/xxe-2.php 요청 메시지)

- Content-Type 헤더가 text/xml 타입으로 설정되어 있고, 바디 부분에 XML 형태의 데이터가 전송되고 있음 -> XXE 취약점 공격은 XML이 전송되는 부분을 통해 이루어짐

- XML 요청에 대한 응답 메시지 확인

- 요청 메시지 XML 데이터 중 <login></login> 사이에 전송된 bee 문자열이 bee’s secret has been reset! 형태로 나타남

→ XML 태그의 내용이 응답 페이지에서 발견되면 XXE 공격 시도 가능

- XML을 수정해가며 리피터로 해당 요청 전달

- bee 문자열을 임의로 변경하여 전송하면 응답 메시지도 bee 부분이 임의의 변경 문자로 바뀐 거 확인 가능
→ <login>
태그로 전달된 값이 응답 메시지에 나타나고 있으며, 이를 통해 서버가 XML 처리하고 있는 것 추측 가능

- 웹 애플리케이션이 외부 엔티티 사용을 허용하도록 설정되어 있으면, 웹 서버 내부의 /etc/passwd 파일을 지정하는 외부 엔티티를 선언하고 <login> 태그의 값으로 해당 외부 엔티티를 참조함으로써, /etc/passwd 파일 내용 확인 가능!

→ <login> 태그에서 참조한 외부 엔티티인 /etc/passwd 파일의 내용이 출력됨

3. XXE 공격 대응

- 외부 엔티티 참조 기능이 필요하지 않은 경우 DTDs나 외부 엔티티 관련 설정 비활성화
-
주요 언어별 설정법
: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

- 시스템 운영자나 보안 관리자 관점에서는, ENTITY 태그가 요청 메시지를 통해 전달되는 것이 확인되면 주의하고, 원래 의도된 요청인지 확인해야함
-
서비스 중인 웹 어플리케이션에서 XML 외부 엔티티 기능을 사용할 필요가 없으면, 웹 방화벽 등의 장비를 이용하여 해당 메시지 차단