漏洞描述:攻击者可在漏洞处输入恶意代码保存到数据库,当展示到列表时,返回信息被浏览器当作html解析的情况下,XSS被触发。可造成Cookie泄露等问题。
例如在界面文本域输入<h2>12345</h2>、<script>alter(12345)</script>这样的值,如果程序未进行处理,会存储至数据库。下次回显会出现异常界面或弹出异常框,如果进行恶意攻击,可能后果不堪设想。
解决方案:
1、从客户端获取到的参数必须进行安全校验,过滤觉攻击字符。
2、将获取到的参数进行HTML转码再存入数据库或输出到页面
3、避免攻击者使用编码、大小写混用的方式绕过安全检查。
实现该功能,分三步:
- 第一步,编写过滤器,实现Filter接口;
- 第二步,继承HttpServletRequestWrapper,重写方法getParameterMap,替换非法字符;
- 第三步,web.xml注册过滤器.
第一步,编写过滤器,实现Filter接口,代码如下:
package com.pactera.xxx.core.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class XSSFilter implements Filter { @Override public void init(FilterConfig arg0) throws ServletException { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new XssRequestWrappers((HttpServletRequest) request), response); } }
第二步,继承HttpServletRequestWrapper,重写