본문 바로가기
Hack/Web

commons-fileupload Module WAF Filtering Bypass

by Becoming a Hacker 2020. 9. 21.
반응형

개요

JSP로 구현된 웹 서버에서 파일 업로드를 구현할 때 commons-fileupload 라는 Module을 이용하는 경우가 많습니다.

 

웹 서버들의 경우 보통 WAF(Web Application Firewall)를 거쳐 WAS(Web Application Server)로 Request를 전송하는 것이 대부분인데, 만약 파일 확장자 필터링을 WAF에서만 수행할 경우 필터링 우회 취약점이 발생하게 됩니다.


취약점

취약 환경

commons-fileupload (Version 1.3 ~)

 

테스트 환경

CCE 2019 Babyweb Docker (tomcat URL 변경 파일)

babyweb.zip
1.07MB

 

Docker 빌드 명령어

docker build -t babyweb .
docker run -p 80:80 babyweb

 

분석

해당 환경에서 통신은 Apache(80) -> WAF(12345) -> WAS(8080) 로 이뤄지며, 필터링 검사는 WAF에서만 하고 있습니다.

 

다음은 main.go 파일에서 필터링 검사를 수행하는 코드입니다.

match, _ := regexp.MatchString(".{1,50}\\.(jpg|png)$", part.FileName())
if match == false {
	r.Body.Close()
	wr.Write([]byte("WAF XD"))
	return
}

 

확장자가 jpg, png가 아니라면 WAF XD라는 응답을 보낸 후 종료되도록 작성되어 있는 것을 확인할 수 있습니다.

 

보통은 안전한 코드라고 볼 수 있겠지만, commons-fileupload Module 1.3 이상 버전을 사용할 경우 취약점이 발생하게 됩니다.

 

commons-fileupload Module은 1.3 버전부터 RFC2047을 지원하고 있으며, RFC2047은 Non Ascii Text에 대하여, 인코딩방식을 요청자가 인코딩하여 전송하고, 응답자는 이를 디코딩하여 해석한다는 내용이 포함되어있습니다.

 

바로 여기서 문제가 발생하게 되는데, 공격자가 파일 명을 인코딩하여 전송했을 경우 WAS에서 이를 디코딩하여 해석할 수 있다는 것입니다. 

 

인코딩 전송 구문은 아래과 같으며, encoding 형식은 평문(Q)과 Base64(B)를 지원하고 있습니다.

=?charset?encoding?encoded-text?=

 

아래 형식에 맞춰 인코딩 된 데이터를 전송할 경우 commons-fileupload Module은 다음과 같은 흐름을 타게됩니다.

public List<FileItem> parseRequest(HttpServletRequest req)
->	private String getFileName(String pContentDisposition)
-->		public Map<String, String> parse
--->			public static String decodeText(String text)
---->				public static String decodeWord(String word)

 

가장 마지막에 실행되는 decodeWord Method를 확인하게 되면  인코딩된 부분만을 파일 이름으로 사용하기 때문에 인코딩 형식에 맞춰 입력하게 되면 .jpg는 WAS의 파일 이름에서는 사용되지 않지만 WAF의 필터링 확장자는 우회할 수 있게됩니다.

=?UTF8?B?YWJjZC5qcGc=?=.jpg

 

평문(Q)을 이용하여 전송시에도 똑같은 취약점이 발생하지만, WAF에서 .jsp와 같은 문자열을 탐지한다면 필터링될 수 있기 때문에 Base64(B) 를 이용하는 것이 탐지될 가능성이 낮습니다.

=?UTF8?Q?webshell.jsp?=.jpg

 

테스트 환경에서 파일 이름을 인코딩 형식에 맞춰 입력한 결과 정상적으로 파일을 업로드 할 수 있었습니다.


Reference

https://github.com/apache/commons-fileupload/blob/ed6c3a405de8959db6dc3a35118ead31df07bfb2/src/main/java/org/apache/commons/fileupload2/util/mime/MimeUtility.java#L226

https://ar9ang3.tistory.com/56?category=666978

https://enki.co.kr/blog/2020/02/27/cce_writeup.html?fbclid=IwAR0ztC_wshd_DHvIA-HBMh_F99TdqkPiqyGyBu_WfP6Id-2TPTPPp_uPkZY

 

'Hack > Web' 카테고리의 다른 글

Reflected File Download  (0) 2020.09.22
Phar 파일을 이용한 PHP Unserialization  (0) 2020.09.22
CVE 2020-10487 (Ghostcat : Tomcat AJP)  (0) 2020.09.21
Nginx off by slash fail  (0) 2020.09.21
Host Split Attack  (0) 2020.09.21

댓글