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,如下:
7. 6. RASP防御恶意文件上传攻击 - 图1
只需Hook FileItemStreamImpl类的构造方法就可以获取到Multipart的字段或者文件名称,RASP只需要检测传入的pName参数值cmd.jsp是否是一个合法的文件名称就可以实现文件上传校验了。
7. 6. RASP防御恶意文件上传攻击 - 图2
需要注意一点,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,然后调用getNamegetSubmittedFileName就可以获取到字段名称、文件名等信息。
7. 6. RASP防御恶意文件上传攻击 - 图3
7. 6. RASP防御恶意文件上传攻击 - 图4
需要特别注意的是Jakarta EE8修改了javax.servlet.http.Part的API包名为:jakarta.servlet.http.Part,为了能够适配高版本的Jakarta API。

6.3 Spring MVC文件名内置编码支持

RASP为了更好的防御文件上传类请求,需要支持RFC 2047的QP编码,还需要支持对Spring MVC内置的文件名编码处理处理。
7. 6. RASP防御恶意文件上传攻击 - 图5
Back