本文作者:国勇(信安之路特约作者)
静态扫描就是不运行程序,通过扫描源代码的方式检查漏洞,常见的方法也有多种,如把源代码生成 AST(抽象语法树)后对 AST 进行分析,找出用户可控变量的使用过程是否流入到了危险函数,从而定位出漏洞;或者通过正则规则来匹配源代码,根据平常容易产生漏洞的代码定制出规则,把这些规则代入到代码中进行验证来定位漏洞。当然静态扫描由于不运行程序也有好多事情处理不了,如程序通过运算得到的一个结果后,就没办法分析这个结果了,所以需要动态运行程序来解决这个问题,也就是动态扫描,动态扫描可以通过单元测试或人工扫描等方式,下面分别介绍一下 AST 扫描 与 正则匹配两种常见静态扫描方式。
AST(抽象语法树)扫描
此方式把源码生成 AST(抽象语法树),找出用户可控的 source (如 location.href
,document.url
,document.documentURI
) 是否流入到了敏感的 skin (如 evil
,new function
,setTImeout
,setInterval
) 中,常见的 source 与 skin 可参考这个文档:
https://docs.google.com/spreadsheets/d/1Mnuqkbs9L-s3QpQtUrOkPx6t5dR3QyQo24kCVYQy7YY/edit#gid=0。
扫描程序负责把所有的 source 与 skin 查找出来,并找出 source 已流入到了 skin 中的代码已及行号,并存入到结果中,举个例子:
document.getElement('girl').innerHTML = location.href.split(#)[1]
这句代码命中了 source 流入到了敏感 skin 中,从而产生了漏洞,也很明显能看出产生了 domXss,不过在实际情况中更加复杂,如把 source 当成了函数参数,经过了多个函数处理,扫描程序就需要跟踪这些这种流入到不同的函数中的情况。
正则匹配
这种方式比较简单,就是匹配程序中是否出现了哪些敏感字符,如 bodyParse()
或者敏感代码,当函数中的代码命中了设置的规则,则就产生了漏洞,举个例子
(.readFile()(.{0,40000})(req.|req.query|req.body|req.param)
上面是一条正则规则,当函数中有一行代码为 fs.readFile('/etc/'+req.param.path)
,则命中了规则并报出有漏洞。
Javascript 扫描工具介绍
下面分别介绍两款工具,jsprime
和 NodeJSScan
的介绍与实现原理,其中 jsprime
是通过分析 AST 扫描,NodeJSScan
是通过正则表达式扫描。
jsprime
效果图,左边是源码,右边是分析结果
jsprime 是一个静态代码分析工具,其核心是基于 Esprima ECMAScript 生成 AST 进行扫描,此工具有在 blackhat 上演讲过,他的主要功能有:
1、JS 库 source 与 skin 识别
2、JQuery 及 YUI 框架识别
3、变量与函数追踪(这项功能作为我们代码流分析算法的组成部分)。
4、变量与函数内容识别分析(这项功能作为我们代码流分析算法的组成部分)。
5、已知过滤器功能识别。
6、遵循面向对象程序与原型设计合规标准。
7、最大程度降低误报机率。
8、支持 JavaScript 代码精简。
9、极高运行速度。
10、只需点击即可操作.
JSPrime 是怎么工作的?
1、把源代
楼主残忍的关闭了评论