XSS攻击防御篇

前言

 
上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响。那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全漏洞。
 
由于公司用的是 SpringMVC,因此,这次就主要基于 SpringMVC 来解决这些漏洞。当然,其实这些解决方案都是大同小异,对于什么环境来说根本无所谓。了解了原理,什么环境、什么语言都可以运用自如了。废话就不多说了,直接上解决方案。
 
 

解决方案

 
  • 方案一
 
方案一主要是利用了 SpringMVC 的特性,使用 SpringMVC 内置的方法 defaultHtmlEscape,在 web.xml 中配置上 context-param,然后在 Form 中加入 spring 的标签,具体配置如下。
 
[html] view plain copy
 
  1. <span style="font-family:Comic Sans MS;">web.xml  
  2.   
  3. <context-param>  
  4.    <param-name>defaultHtmlEscape</param-name>  
  5.    <param-value>true</param-value>  
  6. </context-param>  
  7.   
  8. Forms  
  9.   
  10. <spring:htmlEscape defaultHtmlEscape="true" /></span><span style="font-family:微软雅黑;">  
  11. </span>  

  • 方案二
 
第二种方案也是借助外力,主要是加入一个第三方的 jar 包,然后使用第三方组件给提供的 api,我们通过调用这些 api 可以避免 XSS 攻击带来的危险。具体步骤如下。
 
首先,添加第三方的组件包,commons-lang-2.5.jar,可以手动下载,也可以使用 maven 配置依赖,管理 jar,推荐使用后者。
 
然后,在后台调用这些函数,StringEscapeUtils.escapeHtml(string);StringEscapeUtils.escapeJavaScript(string);StringEscapeUtils.escapeSql(string);
 
最后,在前台的 js 调用 escape 即可。
 
 
  • 方案三
 
接下来,主要讲一下第三种方案,因为在第三种方案中,我们要自己写一个 Filter,使用 Filter 来过滤浏览器发出的请求。对每个 post 请求的参数过滤一些关键字,替换成安全的,例如:< > ' " \ / # & 。方法是实现一个自定义的 HttpServletRequestWrapper,然后在 Filter 里面调用它,替换掉 getParameter 函数即可,具体步骤如下。
 
首先,在后台添加一个 XssHttpServletRequestWrapper 类,代码如下。
 
[java] view plain copy
 
  1. <span style="font-family:Comic Sans MS;">package com.sic.web.beans;  
  2.   
  3. import java.util.Enumeration;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletRequestWrapper;  
  7.   
  8. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {    
  9.     public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {  
  10.         super(servletRequest);  
  11.     }  
  12.     public String[] getParameterValues(String parameter) {  
  13.       String[] values = super.getParameterValues(parameter);  
  14.       if (values==null)  {  
  15.                   return null;  
  16.           }  
  17.       int count = values.length;  
  18.       String[] encodedValues = new String[count];  
  19.       for (int i = 0; i < count; i++) {  
  20.                  encodedValues[i] = cleanXSS(values[i]);  
  21.        }  
  22.       return encodedValues;  
  23.     }  
  24.     public String getParameter(String parameter) {  
  25.           String value = super.getParameter(parameter);  
  26.           if (value == null) {  
  27.                  return null;  
  28.                   }  
  29.           return cleanXSS(value);  
  30.     }  
  31.     public String getHeader(String name) {  
  32.         String value = super.getHeader(name);  
  33.         if (value == null)  
  34.             return null;  
  35.         return cleanXSS(value);  
  36.     }  
  37.     private String cleanXSS(String value) {  
  38.         value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");  
  39.         value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");  
  40.         value = value.replaceAll("'", "& #39;");  
  41.         value = value.replaceAll("eval\\((.*)\\)", "");  
  42.         value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");  
  43.         value = value.replaceAll("script", "");  
  44.         return value;  
  45.     }  
  46.   
  47. } </span>  
 
然后,同样在后台添加一个过滤器 XssFilter,具体代码如下。
 
[java] view plain copy
 
  1. <span style="font-family:Comic Sans MS;">package com.sic.web.beans;  
  2.   
  3. import java.io.IOException;    
  4.   
  5. import javax.servlet.Filter;    
  6. import javax.servlet.FilterChain;    
  7. import javax.servlet.FilterConfig;    
  8. import javax.servlet.ServletException;    
  9. import javax.servlet.ServletRequest;    
  10. import javax.servlet.ServletResponse;    
  11. import javax.servlet.http.HttpServletRequest;    
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class XssFilter implements Filter {  
  15.     FilterConfig filterConfig = null;  
  16.   
  17.     public void init(FilterConfig filterConfig) throws ServletException {  
  18.         this.filterConfig = filterConfig;  
  19.     }  
  20.   
  21.     public void destroy() {  
  22.         this.filterConfig = null;  
  23.     }  
  24.   
  25.     public void doFilter(ServletRequest request, ServletResponse response,  
  26.             FilterChain chain) throws IOException, ServletException {  
  27.         chain.doFilter(new XssHttpServletRequestWrapper(  
  28.                 (HttpServletRequest) request), response);  
  29.     }  
  30. }</span>  
 
最后,在 web.xml 里面配置一下,所有请求的 getParameter 会被替换,如果参数里面含有敏感词会被替换掉。
 
[html] view plain copy
 
  1. <span style="font-family:Comic Sans MS;"><filter>  
  2.      <filter-name>XssSqlFilter</filter-name>  
  3.      <filter-class>com.ibm.web.beans.XssFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.      <filter-name>XssSqlFilter</filter-name>  
  7.      <url-pattern>/*</url-pattern>  
  8.      <dispatcher>REQUEST</dispatcher>  
  9. </filter-mapping></span>  

到这里,就基本完成了一个 XSS 攻击防御的隔离层。每一次请求中的危险字符、敏感信息都会被过滤掉,当然,如果你需要过滤的字符有很多,你还可以在 cleanXSS 方法中补充,直到你满意为止。当然,需要注意的是,一些必要的字符不能被过滤,否则就改变了用户的真实数据。
 
 

一个实例

 
下面提供了一个登录页面的攻击实例,你可以通过下面的方式进行简单的测试,看看你的网站是否有这样的问题,当然,这只是最简单的,那些测试工具肯定要比这样的例子专业的多。很多隐藏的漏洞都能够被测试出来。
 
假设登录页面有个输入用户名和密码的输入框,可以有很多 XSS / CSRF / 注入钓鱼网站 / SQL注入等的攻击手段,例如:
 
[html] view plain copy
 
  1. <span style="font-family:Comic Sans MS;">输入用户名 : >"'><script>alert(1779)</script>  
  2. 输入用户名: usera>"'><img src="javascript:alert(23664)">  
  3. 输入用户名: "'><IMG SRC="/WF_XSRF.html--end_hig--begin_highlight_tag--hlight_tag--">  
  4. 输入用户名: usera'"><iframe src=http://demo.testfire.net--en--begin_highlight_tag--d_highlight_tag-->  
  5.   
  6. 密码随意输入。</span>  


结束语

 
到这里,XSS 攻击的防御措施就写完了,而且,需要说明的一点是,这种使用 Filter 的方式,不仅仅可以防御 XSS 攻击,还可以防御 CSRF 攻击,SQL 注入等安全问题。
 
好了,就先到这吧,我也需要去充电了。明天继续修复我那未完的漏洞。Bugs!!!
posted @ 2018-06-13 14:52  西凤楼  阅读(320)  评论(0编辑  收藏  举报
如果,您认为阅读这篇博客让您有些收获, 如果,您希望更容易地发现我的新博客,不妨关注一下。因为,我的写作热情也离不开您的肯定支持。 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客。 因为有小孩,兼职卖书,路过的朋友有需要低价购买图书、点读笔、纸尿裤等资源的,可扫最上方二维码,质量有保证,价格很美丽,欢迎咨询!