记一次跨站脚本问题的解决过程
下面某子公司的官网被网警(雇的安全公司)扫描了,报告了一个跨站脚本漏洞。
简单来说就是访问的url后面跟的参数里,构造一些个js脚本来达到某些目的,比如弹出什么的。
了解到其网站web服务器用的apache2.2,故首先想到在apache上使用其mod_rewrite进行对危险字符(比如<、>、script等)的过滤。
在apache的httpd.conf配置文件里:
打开mod_rewrite功能的注释:
LoadModule rewrite_module modules/mod_rewrite.so
AllowOverride All None改成AllowOverride All
追加如下配置:
############### url filter ####################### <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} [\"\'\<] [OR] RewriteCond %{QUERY_STRING} (\")+ [OR] RewriteCond %{QUERY_STRING} (\')+ [OR] RewriteCond %{QUERY_STRING} (\>)+ [NC] RewriteRule ^.* [F,L] </IfModule>
然而,事情并未结束,问题仍存在。
进一步分析,其网站某些功能还要通过apache反向代理访问后面的一个tomcat,故还要之前的配置对这类请求不起作用,还要在tomcat上再过滤一下。
解决方法是在tomcat上的应用里配置一个filter,通过HttpServletRequestWrapper对url上request parameter进行替换:
public class XssFilter
implements Filter
{
public void init(FilterConfig filterConfig)
throws ServletException
{}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
chain.doFilter(new XssHttpRequestWrapper((HttpServletRequest)request), response);
}
}
public class XssHttpRequestWrapper
extends HttpServletRequestWrapper
{
。。。
}
程序打包部署到tomcat上,第一次,无效,分析,发现其web.xml上配置了其他filter,重新修改web.xml,把我们的filter放到filter的最前面。 问题解决。