NAVEX & Web漏洞自动化挖掘介绍
2020-03-27 11:50:00 Author: www.4hou.com(查看原文) 阅读量:256 收藏

导语:这次介绍的是一篇发表在安全顶会2018 USENIX Security的paper,文章旨在自动化挖掘web漏洞,同时生成对应的exp,其比同类的工具拥有更高的准确度,由于其动静结合的特性,对代码也有更好的覆盖率。

前言

这次介绍的是一篇发表在安全顶会2018 USENIX Security的paper,文章旨在自动化挖掘web漏洞,同时生成对应的exp,其比同类的工具拥有更高的准确度,由于其动静结合的特性,对代码也有更好的覆盖率。

背景介绍

首先我们从如下这样一个例子切入,来简单介绍一下web漏洞自动挖掘和通常一些静态分析的工具的做法。

例如如下3个代码片段:

selectBooks.php用于选择你想要借的书,代码如下:

2020-03-22-17-48-21.png

hold.php用于额外的check输入,并引导用户到下一步操作,代码如下:

2020-03-22-17-48-59.png

checkout.php用于结算,代码如下:

2020-03-22-17-49-23.png

我们可以看到,在这样一个简单的功能实现上,其实出现了不少潜在的漏洞函数,例如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是如何设计,用于解决上述问题的。

首先作者定义了一个字典:

2020-03-25-17-55-55.png

其中记录一些关键的函数名,例如XSS,对应echo和print等,依次类推,作者一共记录了如下几类攻击的潜在漏洞函数:sql注入、XSS、文件包含、命令注入、代码注入和逻辑漏洞。

然后NAVEX一样会像平常的静态分析工具一样,对漏洞进行检测,其也会通过全局定位敏感函数,然后用上述思想,对关键变量进行PDG后向回溯,其伪代码如下:

2020-03-25-09-37-30.png

运行结束后,程序会返回路径集,即从攻击者可控变量source($_GET、$_POST等)到潜在漏洞函数调用之间的变量传递。

值得一提的是,作者这里不仅仅使用了PDG的后向分析,同时其为了发掘逻辑上的漏洞,也会进行正向寻找。

然后作者会将提取出的约束放入Z3求解器进行约束求解。以备后续生成exp使用。

待上述操作结束后,程序进入动态分析,或者称为前端约束生成阶段。在这一步中,作者使用爬虫,爬取html页面中的信息和属性名,例如提取form表单或者js的相关约束:

2020-03-25-10-00-34.png

然后同样会使用约束器求解,得到满足的input,并进行输入,但由于可能input也会受到后端的约束,因此为了防止爬虫由于未能正确input,不能到达下一步,作者对后端进行了监控,以探测在input后,后端是否会发生变化,例如进行数据库查询,或者改变了当前状态,例如全局变量的赋值(session,cookie等),或者新产生了变量等。以此断定爬虫的前段约束后得到的input是否生效,如果未生效,其会同时考虑后端约束,并再次求解,而后继续监控往复,直到成功input。

如我们最开始的例子中,此时会考虑到后端的约束,即$publisher的长度问题:

2020-03-25-10-08-45.png

同时作者也考虑过了角色问题,在web网站中,通常会分为管理员和普通用户,那么为了最大的代码覆盖率,作者会存储管理员用户的登录凭证,以方便探测到管理员用户可能存在的潜在漏洞。

为了存储这些关系,作者定义了Navigation Graph,其为有向图:G = (N , E ),它的边代表了下一步跳转的意义,例如下图:

2020-03-25-18-15-32.png

在我们第一步达到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,列表如下:

2020-03-25-18-21-01.png

对于sql注入,作者只关心了如下4种潜在的漏洞函数:mssql query, mysql query, mysqli query和sqlite query,并通过实验测试发现,在不到1小时的时间内,工具生成了105个sql注入exp:

2020-03-25-18-24-27.png

可以看到在获得的结果里,均为true positives,以此显现了 NAVEX的高精度和高效率。

同样的,对于XSS和逻辑漏洞,在较短的时间内,都有不错的表现:

2020-03-25-18-25-24.png

2020-03-25-18-25-38.png

后记

本篇文章的思路较为新颖,由于其动静态结合的方式,不仅可以一定程度上增加效率,并且能够有效的探测到一些普通静态分析工具不能检测出的漏洞。其贡献不仅在于学术上的创新,对我们cms审计也提供了不少的便利。

本文为 一叶飘零 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/jOEl
如有侵权请联系:admin#unsafe.sh