阅读:2201回复:0
fuzzing XSS filter
题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑
◆0 前言 这是一篇学习总结,首先对几位未曾谋面也不知道名字的老师表示感谢,通过对你们大作的学习,使我逐渐入门开始跨入XSSer的行列,虽然我现在的水平和大师们比起来还差得太远,脚本方面的基础也不不行,但我会继续努力学习。 ◆1 概述 曾经有一度,在N年前,我对网络安全对抗的总结就是“过滤与反过滤”,虽然现在看起来这种理解太狭隘了,不过在很大程度上过滤和突破过滤确实是很重要的手段。安全的目的就是过滤掉有害信息,保存安全的信息,而黑客的目的就是突破过滤把有害信息传递过去。无论是SQL注入、XSS、溢出等等,最最核心的东西就是突破过滤。本文主要讲针对存储型XSS过滤器的fuzz。 ◆2 XSS filter:安全域边界 随着XSS攻击越来越流行,对XSS的过滤也越来越成熟,尤其是存储型XSS,由于攻击更加灵活多变,应用更加广泛,所以过滤手段也更复杂,从最早的黑名单字符串过滤,发展到现在基于语法分析的黑白名单相结合的过滤器,对攻击的难度要求也越来越高。 由于对反射型XSS的过滤相对简单,所以本文只讨论存储型XSS过滤。现在的存储型XSS过滤大多是基于HTML语法进行过滤,为什么不用简单的字符串过滤呢?这是因为HTML支持的编码方式非常多,而且要区分哪些是HTML语言哪些是文本内容也很麻烦。例如: #!html 是要过滤的,而 #!html style=width:expression(alert(0)) 是正常的内容,所以必须进行HTML语法分析。 filter另一个要考虑的问题是用户体验,一些很严格的过滤器虽然相对安全,但是对正常内容的改变太大,页面都变样了,正常用户使用起来感觉不太好。其实大多数XSS filter的漏洞并不是不能发现XSS,而是发现以后不能完全清除,在某些方面看来也是为了考虑正常用户的使用感受。 基于HTML语法分析的filter会把输入内容划分成很多不同的安全域,例如HTML标签之外的内容不过滤,是最低安全级别,在HTML之内也要划分,样式表是容易出问题的地方,要重点扫描,甚至考虑用白名单,即使在样式表内部也要划分不同的区域使用不同的扫描级别。因为不同的安全域有不同的检测方法,所以容易出问题的地方就两个安全域之间的边界,一旦边界搞错了就有可能突破过滤。 ◆3 fuzzer的设计:突破边界 当一些普通的尝试无法成功突破filter,就要考虑用fuzzer。首先要设计测试模型,这也是最核心的问题。我经常想为什么fuzzing能够成功呢,一定是filter存在某些隐藏比较深的漏洞,例如前面谈过的安全域边界,所以我们设计fuzzing模型就重点对这些地方进行测试,举个例子说明一下安全域边界的问题: #!html <div style="width:expression(alert(9));"> 其中: expression(alert(9)) 是重点扫描区域也就是最高安全级别区域,对这个区域应该过滤/* */和expression等,filter怎么确定这个区域呢?首先在div标签内找到style属性,在=后面找到""之间的内容,根据:来划分样式名称和内容,以;分隔几个样式。那么在这里=":;这些都是关键字。如果XSSer提交以下内容: #!html |
|