RASP不但应该防御Apache commons-fileupload
库的文件上传请求,还应当支持Servlet 3.0新增的javax.servlet.http.Part
。当检测到请求的文件名称包含了动态脚本文件(如:.jsp/.jspx/.jspf/.jspa/.php/.asp/.aspx
等)的 时候需要立即拦截文件上传请求。
6.1 Apache commons fileupload 防御
Apache commons-fileupload
底层处理解析Multipart的类是org.apache.commons.fileupload.FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl
,如下:
只需Hook FileItemStreamImpl
类的构造方法就可以获取到Multipart
的字段或者文件名称,RASP只需要检测传入的pName
参数值cmd.jsp
是否是一个合法的文件名称就可以实现文件上传校验了。
需要注意一点,Tomcat封装了Apache commons fileupload
库,并修改了fileupload类的包名,如:org.apache.tomcat.util.http.fileupload.FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl#FileItemStreamImpl
,所以应当把这个类也放入检测范围内。
6.2 javax.servlet.http.Part防御
javax.servlet.http.Part
是一个接口,不同的容器实现可能都不一样,RASP可以对javax.servlet.http.Part
接口的getInputStream
方法进行Hook,然后调用getName
和getSubmittedFileName
就可以获取到字段名称、文件名等信息。
需要特别注意的是Jakarta EE8
修改了javax.servlet.http.Part
的API包名为:jakarta.servlet.http.Part
,为了能够适配高版本的Jakarta
API。
6.3 Spring MVC文件名内置编码支持
RASP为了更好的防御文件上传类请求,需要支持RFC 2047的QP编码,还需要支持对Spring MVC内置的文件名编码处理处理。
Back