TA的每日心情 | 慵懒 2017-4-9 19:10 |
---|
签到天数: 149 天 [LV.7]常住居民III
|
本帖最后由 人=族 于 2017-1-6 00:52 编辑
富文本跨站脚本的模糊测试之道
一、背景
通过分析大量互联网上的公开案例,跨站脚本漏洞(Cross-site Script)仍是不 少拥有大量 WEB 业务的互联网企业需要对抗的“大敌”。
(图:百度/腾讯/阿里巴巴乌云漏洞报告平台漏洞分布统计,XSS 占很大比重)
XSS 可以粗分为反射型 XSS 和存储型 XSS,当然再往下细分还有 DOM XSS, mXSS (突变 XSS), UXSS(浏览器内的通用跨站脚本)。其中一部分解决方法较为简便, 使用 htmlspecialchars()对 HTML 特殊符号做转义过滤,经过转义的输入内容在输 出时便无法再形成浏览器可以解析的 HTML 标签,也就不会形成 XSS 漏洞。
(图:htmlspecialchars 函数的转义规则)
但网站做大了,总有一些业务,比如邮件内容编辑、日志帖子类编辑发布等 功能时,需要授权给用户自定义链接、改变字体颜色,插入视频图片,这时就不 得不需要需要引入 HTML 富文本实现相应功能。之前提到,htmlspecialchars()这 样把所有特殊符号做转义处理的过滤办法,在这里,英雄无用武之地,因为 HTML 标签全部被过滤了,那之前提到的这些用户可以自定义功能又该如何实现?
一个问题总有它的解决办法,所以基于白/黑名单防御思想的富文本内容过滤 器应运而生,并很快被应用到了对抗富文本存储型 XSS 的前沿。它的任务就是根 据内置的正则表达式和一系列规则,自动分析过滤用户提交的内容,从中分离出 合法和被允许的 HTML,然后经过层层删除过滤和解析最终展示到网页前端用户界面来。这样既不影响网站的安全性,也不会妨碍到用户自定义富文本内容功能 的实现。
道高一尺魔高一丈,经过一些前期的手工测试和侧面从各种渠道公开的漏洞 报告中了解,大多数网站的富文本过滤器采用“黑名单”的设计思想。这也为我 们使用模糊测试来自动化挖掘富文本存储型 XSS 提供了可能性。
与此同时,本文的主角,“强制发掘漏洞的利器”-- 模糊测试(Fuzzing Test), 相信各位一定不会陌生。无论是在二进制还是在 WEB 端的黑盒测试中都有它立 功的身影,从客户端软件漏洞的挖掘到 WEB 端弱口令的爆破,本质上都可以认 为是一种模糊测试。
结合富文本过滤器“黑名单”的实现逻辑,接下来,本文将主要探讨这类富 文本存储型跨站脚本的模糊测试之道。将模糊测试这一强大的漏洞挖掘武器通过 精细的打磨,挖掘出大量的潜在缺陷,并同时给出修复此类漏洞的“防守”建议。有了模糊测试框架,就好比有了手枪,现在我们需要给它装上“子弹”--模
糊测试模板,这样我们才能对不同的富文本编辑器背后的过滤程序展开模糊测
试。
一个模糊测试模板的好坏,很大程度上决定了,之后我们是否能够高效的测
试出富文本编辑器中潜在的缺陷,从而发掘出大量的存储型 XSS构造姿势。而在
设计自己的模糊测试模板时,主要需要考虑三点:边界、进制编码和字符集。
先来说说边界问题。以下面简单的 HTML代码为例:
<span class=”yyy onmouseover=11111” style="width:expression(alert(9));"></span>
上述 HTML标记语言文本传给后端富文本编辑器的时候,程序会如何过滤和解
析?也许是这样的:首先匹配到<span,进入其属性值过滤的逻辑,首先是否含
有高危的 on开头的事件属性,发现存在 onmouseover但被”,”包裹,作为 class
属性的属性值,所以并不存在危险,于是放行;接着分析 style属性,其中有高
危关键词”expression()”,又有括弧特殊符号,所以直接清除过滤。
上述过滤流程的实现,很大程度依赖于后端通过正则匹配进行的 HTML标签
中的边界分析。通过对“边界”的判定,类似 class=”yyyy onmouserover=11111”的
属性及其值才会被放行,因为虽然 onmouserover=11111虽然是高危的事件属性,
但存在于=””中,没有独立成一个 HTML属性,也就不存在风险。所以在上面的
例子中,=””就是边界,<span中的尖括号也是边界,空格也可以说成一种边界。
所以,形象一点说,一段 HTML代码的边界位置很有可能是下面这样的:
[边界]<span[边界]class=[边界]yyy[边界]>[边界]</span[边界]>
所以如果是类似 style="width:expr/*”*/esion(alert(9));"属性和属性值呢?程序又该
如何确定边界?是 style="a:expr/*”还是 style="a:expr/*”*/ession(alert(9));"?
当后端富文本过滤程序遇到这样,略微复杂的选择题时,如果其后端规则设
计的过于简单,就很有可能导致把不该过滤的过滤掉,而把非法的内容放行,从
而我们可以构造出存储型 XSS。打乱 HTML边界,让后端富文本过滤器陷入选择
窘境,这是我们设计模糊测试模板的原则之一。有哪些内容可能会导致富文本内
容过滤器出现边界判断问题?
(1)特殊 HTML符号,通过这类明显的符号,过滤器就可以到 HTML标签及其属
性,但这些符号错误的时候出现在了错误的地点,往往会酿成大祸,如:
=,”,’,:,;,>,<,空格,/,
(2)过滤器会过滤删除的内容,我们在边界填充下面这些元素,过滤器盲目删除,
很有可能导致原本无害的属性值,挣脱牢笼,成为恶意的属性和属性值,如:
expression, alert, confirm, prompt, <script>,<iframe>
(3)不可打印字符,如:
\t、\r、\n、\0等不可打印字符
综上,现在我们已经可以用 Fuzzer生成一个下面这样的 Payload。幸运的话,
或许已经可以绕过一些后端逻辑简单的富文本过滤器了,示例如下:
<<<span/class=/yyyy onmouseover=11111/style="a:exp/*”>*/ression(1);"></span>
模糊测试脚本没找到 神器都是有一个 : XSS神器]XssEncode chrome插件
下载地址:
|
|