导语:这次介绍的是一篇发表在安全顶会2018 USENIX Security的paper,文章旨在自动化挖掘web漏洞,同时生成对应的exp,其比同类的工具拥有更高的准确度,由于其动静结合的特性,对代码也有更好的覆盖率。
前言
这次介绍的是一篇发表在安全顶会2018 USENIX Security的paper,文章旨在自动化挖掘web漏洞,同时生成对应的exp,其比同类的工具拥有更高的准确度,由于其动静结合的特性,对代码也有更好的覆盖率。
背景介绍
首先我们从如下这样一个例子切入,来简单介绍一下web漏洞自动挖掘和通常一些静态分析的工具的做法。
例如如下3个代码片段:
selectBooks.php用于选择你想要借的书,代码如下:
hold.php用于额外的check输入,并引导用户到下一步操作,代码如下:
checkout.php用于结算,代码如下:
我们可以看到,在这样一个简单的功能实现上,其实出现了不少潜在的漏洞函数,例如selectBooks.php中的mysql_query可能会导致sql注入,又如checkout.php中的echo可能会导致XSS漏洞。
那么对于一些常规的静态分析漏洞挖掘工具,他们会怎么做呢?一般情况下,其会首先全局定位到漏洞函数的位置,例如selectBooks.php的第17行,checkout.php的第15行,然后对其参数利用PDG(数据依赖)的关系进行backward反向回溯。
例如selectBooks.php的第17行,我们使用PDG关系回溯,可以发现其影响的关键参数有3个,分别是$book_name,$edition,$publisher。他们又分别来自第5行,第9行和第13行。此时我们又会继续对第5行,第9行和第13行继续进行PDG回溯,而后发现他们都会经过过滤函数,那么此时回溯结束,静态分析工具粗略的判断其为安全的flow,因为其参数都会经过过滤。
我们再看checkout.php的第15行,利用PDG进行回溯,我们可以关注到2个变量,分别是$name和$msg,而后找到第 9行和第10行,此时我们发现第10行是攻击者可控的$_GET变量,那么此时该flow会被输出,并交由运行者进行check,判断其是否为误报。而对于对9行,我们却不太那么容易找到其真实的数据依赖,因为$result实际上来自于数据库内的数据,而非直接显示在代码中。
那么此时一般的静态分析工具的缺点便暴露无遗,其会受到数据库查询的约束而不能准确进行分析,且由于其依赖于PDG的后向回溯,很难去发现逻辑上的漏洞。
同时还有一个关键的问题,仅从代码上来看,似乎$msg我们可以找到一条攻击路线,但实际上,这是需要前期铺垫的,我们必须拥有session才能到达这一步,这为人工check也增加了不少不便捷性。
因此,本篇paper就是旨在解决这些问题,而提出了动静结合的web漏洞挖掘工具:NAVEX。
工具设计
那么我们来简单看一下,NAVEX是如何设计,用于解决上述问题的。
首先作者定义了一个字典:
其中记录一些关键的函数名,例如XSS,对应echo和print等,依次类推,作者一共记录了如下几类攻击的潜在漏洞函数:sql注入、XSS、文件包含、命令注入、代码注入和逻辑漏洞。
然后NAVEX一样会像平常的静态分析工具一样,对漏洞进行检测,其也会通过全局定位敏感函数,然后用上述思想,对关键变量进行PDG后向回溯,其伪代码如下:
运行结束后,程序会返回路径集,即从攻击者可控变量source($_GET、$_POST等)到潜在漏洞函数调用之间的变量传递。
值得一提的是,作者这里不仅仅使用了PDG的后向分析,同时其为了发掘逻辑上的漏洞,也会进行正向寻找。
然后作者会将提取出的约束放入Z3求解器进行约束求解。以备后续生成exp使用。
待上述操作结束后,程序进入动态分析,或者称为前端约束生成阶段。在这一步中,作者使用爬虫,爬取html页面中的信息和属性名,例如提取form表单或者js的相关约束:
然后同样会使用约束器求解,得到满足的input,并进行输入,但由于可能input也会受到后端的约束,因此为了防止爬虫由于未能正确input,不能到达下一步,作者对后端进行了监控,以探测在input后,后端是否会发生变化,例如进行数据库查询,或者改变了当前状态,例如全局变量的赋值(session,cookie等),或者新产生了变量等。以此断定爬虫的前段约束后得到的input是否生效,如果未生效,其会同时考虑后端约束,并再次求解,而后继续监控往复,直到成功input。
如我们最开始的例子中,此时会考虑到后端的约束,即$publisher的长度问题:
同时作者也考虑过了角色问题,在web网站中,通常会分为管理员和普通用户,那么为了最大的代码覆盖率,作者会存储管理员用户的登录凭证,以方便探测到管理员用户可能存在的潜在漏洞。
为了存储这些关系,作者定义了Navigation Graph,其为有向图:G = (N , E ),它的边代表了下一步跳转的意义,例如下图:
在我们第一步达到selectBooks.php后,在html模拟用户input,会来到下一个url操作:selectBooks.php?action=borrow,而这2个node之间则会产生一条edge,又前者指向后者。
同时对于每一个Node,其拥有一些属性,例如id为每一个node的唯一标识符,url为当前node的链接,form_params为表单的input,role存放管理员用户的登录凭证。
如此一来,在找到漏洞点后,作者即可找到一条可到达,并触发该漏洞函数的链接,如下:
1. http://localhost/App/index.php 2. http://localhost/App/selectBooks.php with POST params:[book name=intro to CS by author1, edition=2,publisher=aaaaaaa] 3. http://localhost/App/selectBooks.php?action =borrow 4. http://localhost/App/hold.php 5. http://localhost/App/hold.php?step=checkout 6. http://localhost/App/hold.php?step=checkout &msg=
最终成功将exp带入到6条语句,成功进行xss攻击。
实验测试
作者对26个php cms进行了测试,php文件数量超过22.7k,列表如下:
对于sql注入,作者只关心了如下4种潜在的漏洞函数:mssql query, mysql query, mysqli query和sqlite query,并通过实验测试发现,在不到1小时的时间内,工具生成了105个sql注入exp:
可以看到在获得的结果里,均为true positives,以此显现了 NAVEX的高精度和高效率。
同样的,对于XSS和逻辑漏洞,在较短的时间内,都有不错的表现:
后记
本篇文章的思路较为新颖,由于其动静态结合的方式,不仅可以一定程度上增加效率,并且能够有效的探测到一些普通静态分析工具不能检测出的漏洞。其贡献不仅在于学术上的创新,对我们cms审计也提供了不少的便利。
本文为 一叶飘零 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址