精细化扫描 XSS 漏洞 – 智能化场景分析

作者:长亭科技星期二, 一月 15, 20191

 

 

XSS 攻击简单、危害大

Web 应用的研发人员对用户的输入输出若不加以严格控制,会导致产生 XSS 漏洞。XSS 漏洞的利用方式也非常简单,普通的攻击者通过 XSS 漏洞发起攻击可以获取用户(甚至是管理员)的访问权限进行敏感操作。

传统扫描 XSS 的方式

多年来,XSS 泛滥成灾,在 OWASP TOP 10 中的地位居高不下,安全研究者提出了许多 XSS 漏洞的扫描方式,我们来回顾一下:

第一代 XSS 漏洞扫描

安全工作者通常喜欢用弹框(js 中的 alert 函数)来证明一个页面是否存在 XSS 漏洞,因此也诞生了一批流传非常广泛的 XSS Payload:

<script>alert(/xss/)</script>

<body onload=alert(/xss/)>

<img src=# onerror=alert(/xss/)>

 

带着以上 Payload 进行访问,如果看到一个类似这样的弹框,说明漏洞真实存在。

XSS漏洞扫描_转义

XSS漏洞扫描_HTML_02

第一代 XSS 漏洞扫描工具就是利用这个思路,在工具内部集成了大量 XSS Payload,在扫描时逐个进行尝试,自动将参数替换为 Payload,如果服务端的响应中包含相同的字符串就认为发现了 XSS 漏洞。

第一代 XSS 漏洞扫描工具填补了历史的空白,可以发现了大量初级 XSS 漏洞,但是随着 XSS 攻击的发展,衍生出了新的 XSS 攻击手段,此类工具也完成了它的历史使命,它解决不了的问题包括:

  • 原始 Payload 无法灵活变形,无法应对需要 DOM 渲染才能触发的 XSS 漏洞
  • 输出点的部位不一定可执行,会造成误报
  • 服务端有过滤逻辑时返回的字符串与原始 Payload 有差异,可能导致无法匹配响应中被过滤后的 Payload
  • 如果 Content-Type 不是 text/html,即使 Payload 能够输出也无法执行
  • 服务端有防护时,许多 Payload 会导致请求直接被拦截
  • 等等

第二代 XSS 漏洞扫描

当大量初级 XSS 漏洞被解决之后,攻击者对于 XSS 漏洞的利用方式也逐渐成熟,安全建设对于 XSS 漏洞的目标变成了“全面解决 XSS 攻击”。这个时期出现了许多思路新颖的 XSS 漏洞扫描工具,这些工具能覆盖许多第二代 XSS 漏洞扫描工具无法发现的问题,在当初的年代堪称神器,但是依然存在着或多或少的问题,因此始终无法推广到整个行业,成为可量产的 XSS 扫描基础算法。

第二代扫描中表现最出色的方式是调用真实浏览器来辅助判断,hook 浏览器的基础函数,累积更加庞大的 Payload 规则库,覆盖更多的输入输出场景,使浏览器告诉扫描器漏洞是否可实际被利用。这种扫描思路的特点是:

  • 几乎没有误报
  • 可以发现部分 DOM 型 XSS
  • 会发送大量 HTTP 请求
  • 每次请求都需要调用浏览器进行渲染,因此扫描速度奇慢无比
  • 扫描效果与 Payload 的覆盖量息息相关

传统方式的不足,为什么要精细化扫描 XSS 漏洞

无论是第一代还是第二代 XSS 漏洞扫描,都缺少了对于上下文的理解以及对于场景的分析,无法摆脱其 Fuzz 的本质,优化的方向也停留在“如何使猜测的结果更靠近真实结果”,而不是“如何正向推理得出正确答案”,因此依然由于多场景是无法解决的,问题在于:

  • Web 业务复杂,输出点的类型非常多,payload 不可能覆盖所有的情况
  • 依然无法解决 WAF 会拦截敏感 payload 的问题
  • 误报漏洞的问题依然严重

那么有没有一种可以快速、深度、精准的 XSS 漏洞探测方法呢?

智能化场景分析技术

从历史的行程来看,XSS 漏洞扫描需要解决根本的问题在于对于输入输出场景的识别,对于不同浏览器渲染方式的理解,以及对于服务器处理方式的灵活应对。

长亭洞鉴使用了一种全新的 XSS 漏洞分析算法,脱离了传统的对于 Payload 规则库的依赖,无需大量发送 HTTP 请求即可完成页面分析,定位存在的 XSS 漏洞,并智能化生成最终的复测 Payload。

看一个简单的例子,有以下 URL:

http://xx.chaitin.cn/test?p=866f268a344ba71fa4b0

用户访问后会得到如下的返回:

<html>
<body>
<a href=”./news/866f268a344ba71fa4b0/”>
<img src=”./xxx.png”>
</a>
</body>
</html>

这是一段可能存在 XSS 的代码,业务将用户输入的 p 参数输出到了 a 标签的 href 属性中。熟悉 XSS 的同学无需多想即可编写如下验证该漏洞的 Payload。

“><script>alert()</script>

自动化扫描工具只要覆盖这个 Payload 即可验证如上的漏洞。但是这个 Payload 真的能工作么?其实还需要考虑其他因素:

  1. 参数是否会被服务器编码或解码
  2. 参数中是否允许存在空格,是否有长度限制
  3. 会不会有 WAF 拦截 script 或 alert 等关键字
  4. ( 和 ) 有没有可能被过滤或转义
  5. ” 和 ‘ 有没有可能被过滤或转义
  6. < 和 > 有没有可能被过滤或转义
  7. 有没有其他可以利用的属性,是否可以使用 onXXX 事件,有没有可能被过滤或转义
  8. 有没有 CSP 策略
  9. 等等

如果是传统自动化黑盒扫描器,包含如上文“无需多想”的 Payload 已属不易,以上意外因素只要存在一点就可以使扫描铩羽而归,更难想想需要累积并尝试多少 Payload 才能实际验证一个这样的 XSS 漏洞。

想要精细化发现 XSS 漏洞,必须站在理解 DOM 结构的基础上,长亭洞鉴实现了兼容各种浏览器标准的 DOM 解析器,使可分析的参数输出点可以覆盖到包括但不限于以下范围:

  • 输出在标签外部
  • 输出在 HTML 注释中
  • 输出在标签的属性内部
  • 输出在标签的属性外部
  • 输出在标签的事件内部
  • 输出在地址的部位,如 a/href、form/action、iframe/src 等
  • 输出在标签的 style 属性内部
  • 输出在 style 标签内
  • 输出在 script 标签内的字符串中
  • 输出在 script 标签内的注释中
  • 输出在特殊标签内部
  • 输出在特殊标签的特殊属性内部

除此之外,自动化工具还需要理解参数传递方式与常见编码方式,考虑如何自动化识别服务器对参数的编码方式,如何定位 Payload 中的敏感字符,并对 Payload 关键部分进行编码。洞鉴内置的编码探测算法与自动编码算法可以解决该问题,可覆盖的编码类型包括但不限于:

  • HTML Entity
  • HTML Code
  • HTML Hex Code
  • URL Encode
  • js string literal
  • GBK
  • UTF-7
  • Base64

对于上文提到的漏洞,长亭洞鉴的发现过程会更加智能化,在理解业务的基础上进行深度分析,定位漏洞,并自动生成 Payload,简单模拟一遍,可以将发现过程简单理解如下:

  1. 访问原始页面,判断输入是否会出现在页面上
    结论:参数 p 的内容会出现在页面上
  2. 根据 HTML 的语义建立 DOM 结构,判断输出在 DOM 中的位置
    结论:输出位于 a 标签的 href 属性中
  3. 输出是否需要冲突破闭合
    结论:href 属性在双引号内,因此需要使用 ” 突破闭合,也可以进一步使用 > 突破标签闭合
  4. 是否能插入可执行的 js
    结论:不存在其他干扰标签,可以使用 ” 突破闭合后插入标签事件或插入新的标签
  5. 基本确定 XSS 漏洞存在,开始尝试自动生成 Payload,生成 Payload 时需要考虑

洞鉴扫描截图如下:

  1. 正在扫描的任务详情部分截取

XSS漏洞扫描_转义_03

2. XSS 漏洞详情部分截取

XSS漏洞扫描_转义_04

总结

传统的 XSS 扫描简单粗暴,无法实现“全面发现 XSS 漏洞”的目标。

长亭洞鉴集成了基于智能化场景分析算法的扫描引擎,可以精确定位参数的输出,覆盖不同场景的多种 XSS 漏洞,从而实现对 XSS 漏洞进行快速、深度、精准地探测。