基于Antisamy项目实现防XSS攻击

标签: antisamy 项目 xss | 发表时间:2014-11-07 01:23 | 作者:gavinloo
出处:http://blog.csdn.net

    最近项目上线,请第三方公司进行了一次渗透性测试,被发现存在多处XSS攻击。由于我们对于URL的Get请求已经通过URLFilter进行了特殊字符过滤,Get请求的漏洞已经被封堵,但是对于Post请求考虑到我们项目存在表单提交,富文本编辑等功能,不敢贸然的使用Filter对关键字进行过滤。

为了解决上述问题,我们采用了OWASP的一个开源的项目AntiSamy来彻底解决XSS攻击问题。AntiSamy是一个可以确保用户输入的HTML、CSS、JavaScript符合规范的API。它确保了用户无法在HTML中提交恶意代码,而这些恶意代码通常被输入到个人资料、评论等会被服务端存储的数据中。

AntiSamy的下载地址:

 官方网站:https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project

          项目地址: https://code.google.com/p/owaspantisamy/downloads/list

 我们项目使用的Java,除了antisamy-1.5.3.jar包外,还需要下述jar包。

AntiSamy的使用如下:

定义一个XssFilter的Class,该类必须实现Filter类,在XssFilter类中实现doFilter函数。将策略文件放到和pom.xml同级目录下,然后开始编写XssFilter。

    public class XssFilter implements Filter {
	@SuppressWarnings("unused")
	private FilterConfig filterConfig;
	public void destroy() {
		this.filterConfig = null;
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		chain.doFilter(new XssRequestWrapper((HttpServletRequest) request), response);
	}
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}	
    }
我们需要重写request,新建一个类XssRequestWrapper,继承HttpServletRequestWrapper,需要重写getParameter(String param), getParameterValues(String param)以及getHeader(String param)方法,以及过滤非法html方法xssClean()

public class XssRequestWrapper extends HttpServletRequestWrapper {
	
	private static Policy policy = null;
	
	static{
		//String path = URLUtility.getClassPath(XssRequestWrapper.class)+File.separator+"antisamy-anythinggoes-1.4.4.xml";
		String path =XssRequestWrapper.class.getClassLoader().getResource("antisamy-anythinggoes-1.4.4.xml").getFile();
		System.out.println("policy_filepath:"+path);
		if(path.startsWith("file")){
			path = path.substring(6);
		}
    	 try {
			policy = Policy.getInstance(path);
		} catch (PolicyException e) {
			e.printStackTrace();
		}
	}

	public XssRequestWrapper(HttpServletRequest request) {
		super(request);
	}
	
	@SuppressWarnings("rawtypes")
	public Map<String,String[]> getParameterMap(){
		Map<String,String[]> request_map = super.getParameterMap();
		Iterator iterator = request_map.entrySet().iterator();
		System.out.println("request_map"+request_map.size());
		while(iterator.hasNext()){
			Map.Entry me = (Map.Entry)iterator.next();
			//System.out.println(me.getKey()+":");
			String[] values = (String[])me.getValue();
			for(int i = 0 ; i < values.length ; i++){
				System.out.println(values[i]);
				values[i] = xssClean(values[i]);
			}
		}
		return request_map;
	}
	 public String[] getParameterValues(String paramString)
	  {
	    String[] arrayOfString1 = super.getParameterValues(paramString);
	    if (arrayOfString1 == null)
	      return null;
	    int i = arrayOfString1.length;
	    String[] arrayOfString2 = new String[i];
	    for (int j = 0; j < i; j++)
	      arrayOfString2[j] = xssClean(arrayOfString1[j]);
	    return arrayOfString2;
	  }

	  public String getParameter(String paramString)
	  {
	    String str = super.getParameter(paramString);
	    if (str == null)
	      return null;
	    return xssClean(str);
	  }

	  public String getHeader(String paramString)
	  {
	    String str = super.getHeader(paramString);
	    if (str == null)
	      return null;
	    return xssClean(str);
	  }
	  
	  
	private String xssClean(String value) {
        AntiSamy antiSamy = new AntiSamy();
        try {
        	//CleanResults cr = antiSamy.scan(dirtyInput, policyFilePath); 
            final CleanResults cr = antiSamy.scan(value, policy);
            //安全的HTML输出
            return cr.getCleanHTML();
        } catch (ScanException e) {
            e.printStackTrace();
        } catch (PolicyException e) {
            e.printStackTrace();
        }
        return value;
	}
}
在我们使用AntiSamy进行测试时,发现确实能够有效的控制xss攻击,用户的非法输入全部被删除或替换了,但是也发现会把“&nbsp;”转换成乱码,把双引号转换成"&quot;"

为了解决这两个错误转换,我们修改了xssClean(String value)方法。

<p align="left">
</p>



作者:gavinloo 发表于2014-11-6 17:23:53 原文链接
阅读:71 评论:0 查看评论

相关 [antisamy 项目 xss] 推荐:

基于Antisamy项目实现防XSS攻击

- - CSDN博客互联网推荐文章
    最近项目上线,请第三方公司进行了一次渗透性测试,被发现存在多处XSS攻击. 由于我们对于URL的Get请求已经通过URLFilter进行了特殊字符过滤,Get请求的漏洞已经被封堵,但是对于Post请求考虑到我们项目存在表单提交,富文本编辑等功能,不敢贸然的使用Filter对关键字进行过滤. 为了解决上述问题,我们采用了OWASP的一个开源的项目AntiSamy来彻底解决XSS攻击问题.

深掘XSS漏洞场景之XSS Rootkit

- jyf1987 - 80sec
深掘XSS漏洞场景之XSS Rootkit[完整修订版]. 众所周知XSS漏洞的风险定义一直比较模糊,XSS漏洞属于高危漏洞还是低风险漏洞一直以来都有所争议. XSS漏洞类型主要分为持久型和非持久型两种:. 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞. 持久型XSS漏洞一般存在于富文本等交互功能,如发帖留言等,黑客使用的XSS内容经正常功能进入数据库持久保存.

XSS 探索 - big-brother

- - 博客园_首页
正常的页面被渗出了攻击者的js脚本,这些脚本可以非法地获取用户信息,然后将信息发送到attacked的服务端. XSS是需要充分利用输出环境来构造攻击脚本的. 非法获取用户cookie、ip等内容. 劫持浏览器,形成DDOS攻击. Reflected XSS:可以理解为参数型XSS攻击,攻击的切入点是url后面的参数.

前端xss攻击

- - SegmentFault 最新的文章
实习的时候在项目中有接触过关于xss攻击的内容,并且使用了项目组中推荐的一些常用的防xss攻击的方法对项目进行了防攻击的完善. 但一直没有时间深入了解这东西,在此,做一个简单的梳理. xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊目的.

百度知道XSS漏洞

- - 博客园_首页
事情的起因是我一同学在百度知道上看到一个很奇怪的,正文带有连接的提问( 这里),正常来说,这种情况是不可能出现的. 我条件反射的想到了:XSS漏洞. 通过查看源代码,我马上发现了问题的根源:未结束的标签.
帮我写一个能提取

pentesterlab xss漏洞分析

- - JavaScript - Web前端 - ITeye博客
pentesterlab简介. pentesterlab官方定义自己是一个简单又十分有效学习渗透测试的演练平台. pentesterlab环境搭建. 官方提供了一个基于debian6的镜像,官网下载镜像,使用vmware建立一个虚拟机,启动即可. ps:官方文档建议做一个host绑定,方便后面使用.

XSS攻击及防御

- - BlogJava-qileilove
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性. 其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.

XSS攻击技术详解

- - BlogJava-qileilove
  XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆. web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 比如这些代码包括HTML代码和客户端脚本. 攻击者利用XSS漏洞旁路掉访问控制--例如同源策略(same origin policy).

XSS攻击及防御

- - 互联网 - ITeye博客
       本文来自: 高爽|Coder,原文地址: http://blog.csdn.net/ghsau/article/details/17027893,转载请注明.         XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.

[xss学习]xss基础内容之抛砖引玉篇

- - 神刀网
1、最基本的xss漏洞成因  . XSS测试代码:   xss.php?name= xss.php?name= xss.php?name=