[JSP] 파일업로드 확장자 우회
1. 개요
파일업로드 취약점 발견 시 파일 확장자 필터링을 하는 경우가 많은데, 이를 우회하는 방법(화이트리스트가 아닐 경우)을 정리한다.
2. 우회방법
#1. 대소문자 치환 ; .jsp → .Jsp / .jSp / .jsP / .JsP 등.....
#2. Null byte ; .jsp%00.jpg / .jsp%00(URL Encoding).jpg 등...
#3. 2중 파라미터 ; filename=test.jpg, filename=test.jsp
#4. MIME Type만 검증하는 경우 ; ContentType=image/jpeg 등...
#5. 실행가능한 타 확장자 ; .jsp → .jspx / .jsv / .jsw
IBM 서버인 경우, jsp외 jspx, jsv, jsw 확장자를 디폴트로 실행 가능하게 설정하고 있다고 합니다.
[jsv] Hello World 출력
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
<% out.println("Hello World"); %> // jsp 문법과 같음
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
[jspx] Hello World 출력
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http"//java.sun.com/jsp/jstl/core" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
<jsp:directive.page import="java.util.*"/>
<jsp:directive.page import="java.io.*"/>
<jsp:directive.page import="sun.misc.BASE64Decoder"/>
<jsp:scriptlet><![CDATA[out.println("Hello World");]]>
</jsp:scriptlet>
</jsp:root> // jspx는 CDATA로 감싸줘야함
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
[jspx] Hello World 출력2 // import 삭제
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
<jsp:scriptlet>
out.println("Hello World!!");
</jsp:scriptlet>
</jsp:root>
3. 대응방안
#1. 화이트리스트 ; 허용된 확장자 파일만 업로드 가능하도록 함.
#2. 업로드경로 ; 업로드 디렉터리를 웹루트 이외로 설정. 혹은 웹루트 하위의 서버 사이드 스크립트 실행 권한 제거
#3. 랜덤 파일명 ; 업로드된 파일명을 난수화하여 유추 불가능하도록 한다.