下面某子公司的官網被網警(雇的安全公司)掃描了,報告了一個跨站腳本漏洞。
簡單來說就是訪問的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的最前面。 問題解決。