高效灵活地挖掘PHP应用程序漏洞

作者:{LIG}@ArkTeam

原文作者:Michael Backes, Konrad Rieck, Malte Skoruppa, Ben Stock and Fabian Yamaguchi

原文标题:Efficient and Flexible Discovery of PHP Application Vulnerabilities.

原文会议:2017 IEEE European Symposium on Security and Privacy.

网络的互通共赢使得Web应用程序的安全性变得至关重要。这些Web应用程序的头号编程语言是PHP,然而PHP语言的设计却并不考虑安全因素,通常会产生较大的攻击面,出现不同类型的漏洞,如SQL注入漏洞或XSS漏洞。因此,本文介绍了一种基于代码属性图的PHP应用程序间过程分析技术来对基于PHP语言的web应用程序进行检测,该技术具有扩展性,能够很好地扩展到大量代码,具有很强的适应性。

本文首先定义了代码属性图,它是由抽象语法树(AST)、控制流程图(CFG)、程序依赖图(PDG)以及调用图(CG)组合而成的。该图能很好地展示项目的结构、语义、控制流、数据依赖关系以及过程间调用关系。代码属性图的产生过程如图所示:


图1 代码属性图的生成过程

<1> 输入PHP项目文件。

<2> 递归地扫描目录中的PHP文件,对于每个被识别的文件,PHP内部解析器产生AST,文件名和目录节点被标记为系统节点。

<3> 将每个AST节点识别为CFG节点,将函数中的语句分为两类:结构化的控制语句和无结构话的语句来建立CFG 图。

<4> 对CFG图中的每个节点进行数据流分析建立PDG图。

<5> 将调用节点连接到相应的方法声明来产生调用图。

为了能大规模地进行检测,本文紧接着对web应用中的漏洞建模为模式,这些模式是从攻击者的可控输入到关键安全函数的调用(关键安全函数对应于某种类型漏洞的相关函数)。使用代码属性图检测出应用程序中的漏洞主要是通过图遍历来发现特定的模式。图遍历检测过程如下所示:

<1> 首先识别出攻击者的可控输入,如$_GET、$_POST、$_SERVER等。

<2> 索引出某种漏洞相关的关键函数调用,返回所有与给定关键函数调用相关的AST节点的标识符列表。

<3> 识别出关键数据流。关键数据流的最后一个节点是关键函数所在的节点。

最后,本文通过对Github上爬取的1854个使用PHP语言的项目进行实验。其中这1854个项目分为两部分:集合P(代表1850个未知是否存在漏洞的项目)和集合C(已知存在漏洞的项目)。在这里以对服务端的SQL注入漏洞检测为例,检测结果如下所示:


图2 SQL注入漏洞的检测结果

表中主要是针对MYSQL_QUERY这个函数进行检测,该函数即为监测过程中的关键函数,其中sink值代表着可利用的流个数,可利用的流主要是指从攻击者的可控输入到MYSQL_QUERY这个关键函数的路径。由于很多可利用流指的是一个漏洞,所以漏洞的个数少于sink值。

该研究表明,本文所设计的工具可以进行大规模数量的PHP项目检测,通过建立不同的图遍历方式可以监测出其他类型的漏洞,具有扩展性。

发表评论

电子邮件地址不会被公开。 必填项已用*标注