IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> NAVEX:为动态Web应用程序生成精确且可扩展的漏洞 -> 正文阅读

[网络协议]NAVEX:为动态Web应用程序生成精确且可扩展的漏洞

摘要

现代多层web应用程序由多个动态特性组成,这使得其漏洞分析从纯静态分析角度具有挑战性。我们描述了一种克服web应用程序动态特性带来的挑战的方法。我们的方法结合了静态分析技术指导下的动态分析,以便自动识别漏洞并构建有效的漏洞利用。我们的方法在NAVEX中实现和评估,NAVEX是一种工具,可以将自动漏洞分析和漏洞生成的过程扩展到大型应用程序和多类漏洞。在我们的实验中,我们能够在320万行PHP代码的代码库上使用NAVEX,并在所分析的代码中构建204个漏洞。

1.介绍

现代web应用程序通常设计为多层应用程序(即客户端、服务器和数据库)。它们包括许多动态特性,可以根据用户交互和其他输入“动态”生成内容。这种动态性有助于应用程序对用户的可用性和响应性。然而,这些特性增加了web应用程序的复杂性,并提高了分析其安全性的难度。

目前,有几种方法可用于分析现代web应用程序的安全性,如[9、15、18、29]。这些方法使用一系列分析技术来识别漏洞,如SQL注入(SQLI)和跨站点脚本(XSS)。然而,这些方法的一个缺点是,它们会产生错误警报,因此需要手动检查所报告的每一个漏洞是否确实可以利用。

其他方法采取了进一步的措施,并尝试通过生成具体的漏洞来自动验证漏洞是否属实的方法【7、25、27、32】。然而,这些方法主要使用静态分析方法。而静态分析方法可以提供由于应用程序的良好覆盖率,它们通常会由于处理复杂程序工件的技术挑战而牺牲精度,这是产生误报的主要原因之一。特别是,静态分析在web应用程序的动态特性方面具有挑战性,其中内容(例如表单、链接、JavaScript代码)通常是动态生成的,代码是在不同的层上执行的,其效果很难静态建模。

在本文中,我们的主要贡献是为具有动态特性的多层web应用程序提供了一种精确的漏洞分析方法。我们的方法没有遵循严格的静态分析策略,而是将web应用程序的动态分析与静态分析相结合,以自动识别漏洞并生成具体的漏洞攻击,作为这些漏洞的证据。动态和静态分析的结合提供了几个好处。首先,动态执行组件通过显示不需要静态建模的运行时工件,大大降低了静态分析所面临的复杂性。另一方面,静态分析组件通过分析应用程序路径并提供输入来练习这些路径,从而引导动态组件最大化应用程序的覆盖范围。其次,我们的方法可扩展到非常大的应用程序(例如965K LOC),大大超过了最新技术。可伸缩性提高的主要原因是动态执行组件能够降低静态分析组件面临的复杂性。

我们方法的另一个目标是以最小的分析设置开销为不同类别的漏洞自动生成漏洞。为了实现这一目标,我们的方法设计了几个分析模板和一个用于实例化每个模板的攻击字典。还有其他静态方法试图实现这种识别漏洞的通用性【9,15】。然而,我们的方法通过(a)应用精确的动态分析技术和(b)自动生成已识别的漏洞。

我们的方法是在一个名为NAVEX的工具中实现的。NAVEX的运营分为两个步骤。在第一步中,我们使用符号执行创建web应用程序各个模块的行为模型。为了应对可扩展性挑战,我们只对那些包含潜在易受攻击汇的模块进行优先排序,攻击者“可能”成功注入恶意值或利用其他类型的漏洞,并在后续搜索中进一步分析这些模块。

在第二步中,我们构建实际的漏洞。这需要对整个应用程序进行建模,并发现一系列HTTP请求,这些请求使应用程序执行易受攻击的接收器。为了解决此阶段的可扩展性挑战,我们对已部署的应用程序执行动态分析,并在服务器端使用web爬虫和concolic执行器来发现可能导致攻击者找到易受攻击接收器的HTTP导航路径。为了在动态分析期间最大化代码的覆盖范围,爬虫程序和concolic执行器由约束解算器辅助,约束解算器生成(利用漏洞)HTTP输入序列。

我们在NAVEX中的贡献包括一个漏洞生成框架,该框架可以轻松扩展到大型应用程序和多种漏洞,以及一种结合动态执行和静态分析的新方法,以解决影响以前工作的可扩展性问题,这主要是由于web应用程序的动态特性。

我们在总共有320万SLOC和22.7K PHP文件的26个应用程序上评估NAVEX。NAVEX能够在不到6.5小时的时间内分析应用程序并生成204个漏洞。在这些漏洞中,195个与SQLI和XSS相关,9个与逻辑漏洞相关,例如重定向后执行(EAR)漏洞。我们注意到,NAVEX是文献中首次报道的利用EAR漏洞进行攻击的工作。

本文的组织结构如下。第2节讨论了一个突出挑战的运行示例,并概述了NAVEX,第3节讨论了NAVEX的架构和算法细节。第4节包含有关实现的详细信息,第5节描述NAVEX的评估,第6节讨论相关工作。最后,第7节包含结论。

2.挑战和方法概述

在本节中,我们使用一个运行的示例来强调本文中解决的挑战。然后,我们对NAVEX进行了概述。

2.1运行示例

清单1-3展示了一个简单的图书借阅web应用程序,本文将使用该应用程序说明我们的方法。可以通过selectBooks中的web表单selectBooks.php模块(清单1中的第23-38行)。SelectBooks.php使用JavaScript验证一些用户输入(第31-36行)。通过服务器端代码进一步验证和清理用户输入(第4-12行)。接下来,模块查询数据库以检查书籍的可用性(第17行)。根据查询结果,初始化$ SESSION[’ISBN’],并保留HTTPhold.php打印在浏览器上。

在这里插入图片描述

Hold.php(清单2)执行其他检查,如果满足这些检查,HTTP链接将引导用户进入下一步(第7行)。单击链接时,将设置superglobal G E T [ ′ s t e p ] , 并 进 行 模 块 签 出 。 因 此 , 包 含 在 h o l d . p h p 中 。 p h p 并 执 行 。 c h e c k o u t . p h p 通 过 向 用 户 提 供 一 个 链 接 ( 第 19 行 ) 进 行 确 认 来 完 成 借 用 过 程 。 该 链 接 设 置 了 两 个 超 全 局 变 量 ( GET['step],并进行模块签出。因此,包含在hold.php中。php并执行。checkout.php通过向用户提供一个链接(第19行)进行确认来完成借用过程。该链接设置了两个超全局变量( GET[step]hold.phpphpcheckout.php19GET[‘step’]和$GET['msg]),这将由模块检查(第6行)。最后,确认函数(第13行)是调用以通知用户已成功保留书本。

在这里插入图片描述
该示例包含易受注入和逻辑攻击的敏感接收器。例如,清单1(第17行)中的查询容易通过变量 p u b l i s h e r 受 到 S Q L I 的 攻 击 , 该 变 量 在 到 达 接 收 器 之 前 未 正 确 清 理 。 特 别 是 , s t r r e p l a c e 函 数 ( 第 13 行 ) 在 清 理 publisher受到SQLI的攻击,该变量在到达接收器之前未正确清理。特别是,str replace函数(第13行)在清理 publisherSQLIstrreplace13publisher方面做得很差,因为可能仍然会使用不包含双引号的SQLI攻击。此外,清单3中的echo调用易受XSS攻击,因为用户输入的$msg没有经过清理。最后,清单1第3行的接收器容易受到重定向后执行(Execution After Redirect,EAR)逻辑攻击,因为头调用后的执行(将执行重定向到另一个PHP模块)不会停止,因为之后没有调用执行终止函数。因此,无论第2行的检查结果如何,都将执行以下语句。这些语句包含易受攻击的SQL查询,这进一步加剧了问题的严重性。因此,攻击者无需先登录即可运行SQLI漏洞攻击。

2.2挑战

如示例所示,典型的web应用程序具有由表单、链接和JavaScript代码组成的客户端逻辑,这些代码可以动态生成通过服务器端代码以及频繁与客户端和数据库后端交互的复杂服务器端逻辑。因此,构建一个漏洞生成框架来揭示动态web应用程序的各种不同类型的漏洞是非常重要的。具体而言,我们确定了以下挑战:

接收器可达性。在web应用程序中,某些任务/功能需要一系列步骤,并且这些任务之间存在依赖关系。这些步骤通常使用不同的模块来完成,其中通过使用全局构造(例如PHP中的$GET[])来维护应用程序的状态,以反映步骤的完成/失败。如果敏感接收器位于这些相互关联的模块的深处,则面临的挑战是自动生成一个漏洞,该漏洞可在满足导航中每个连接处所需的约束的同时,通过应用程序模块之间的复杂依赖关系进行导航。例如,成功利用清单3中易受攻击的echo必须考虑通过模块selectBooks进行导航和满足约束。selectBooks.php, hold.php, index.php(示例中未显示)和checkout.php.

更广泛地说,我们必须考虑几个因素。首先,必须确定从源到敏感接收器的数据流路径。接下来,必须分析沿这些路径可能进行的数据清理。但是,清理有多种可用方式,包括内置清理(例如,htmlspecialchars())、隐式清理(例如,如运行示例中所示的cast操作符)、自定义清理(例如,自定义使用str replace())和由数据库约束(例如,非空约束)引起的清理。这里的实际挑战是准确地确定此类净化措施何时足够可靠,以消除所有可能的风险。

动态特性。完全基于web应用程序静态方面的自动漏洞生成方法很容易错过某些真正的漏洞。如前所述,现代web应用程序通常包含只有在执行应用程序时才会显示的功能。这些功能通常包括动态生成的表单和链接,这些表单和链接可能会驱动应用程序导航到易受攻击的接收器。除非部署和执行应用程序,否则静态分析方法很难推断出这些工件,因为这些工件可能包含有用的利用路径约束。例如,清单1的第23行,其中表单的操作由运行嵌入式PHP代码的结果设置。为了精确推断该操作的值,静态分析器必须能够处理该代码部分的PHP语义。其他情况(示例中未显示)包括动态生成的内容,包括JavaScript生成的内容。因此,这是必要的将动态分析作为漏洞生成框架的一部分,使这些运行时构件显式化。动态执行的另一个挑战是最大限度地扩大应用程序的覆盖范围。

可扩展性。为大型复杂的现代web应用程序生成跨多个模块并遍历每个模块内的执行路径的可执行漏洞是一项挑战。构建漏洞利用需要从整体上分析应用程序,包括其客户端、服务器端和数据库后端。为了应对这一挑战,必须在设计漏洞生成方法时仔细考虑修剪不可行的漏洞路径。为了证明对可伸缩方法的需要,让我们考虑一下我们正在运行的示例。对于这个简单的应用程序,为了利用清单3中易受攻击的接收器,我们必须在3个模块中处理总共44条执行路径(即selectBooks.php中的32条路径、hold.php中的4条路径和checkout.php中的8条路径),以找到指向接收器的候选可利用路径。

我们需要解决的另一个可扩展性挑战与为多类漏洞生成漏洞的目标有关。为了应对这一挑战,我们需要有效地支持对多类漏洞的抽象和分析,以产生尽可能多的不同类型的漏洞。

2.3方法概述

我们的目标是构建一个精确、可扩展且高效的漏洞生成框架,该框架考虑了web应用程序的动态特性以及客户端、服务器端和数据库后端之间的依赖关系所导致的导航复杂性。

我们的方法在名为NAVEX的系统中实现,如图1所示。为了解决可扩展性挑战,我们的方法分为两个步骤:(I)易受攻击的接收器识别和(II)具体的漏洞生成。

给定应用程序源代码,第一步确定应用程序和相应模块中易受攻击的接收器。该阶段分别分析每个模块,对于仅优先考虑具有漏洞的模块至关重要;从而大大减少了搜索空间并有助于提高可扩展性。为了解决接收器可达性问题,NAVEX构建了内置清理例程语义的精确表示。此外,对于自定义清理,它使用符号约束构建模型。这些约束由约束解算器使用,约束解算器确定清理是否足够健壮。

第二步负责生成具体的漏洞利用。自动生成具体漏洞利用的主要问题是识别应用程序范围的导航路径,这些路径从面向公众的页面开始,将执行驱动到中识别的易受攻击的接收器通过一系列HTTP请求的第一步。动态执行的输出是一个导航图,表示web应用程序的导航结构。最后,对于第一步中确定的每个包含易受攻击接收器的模块,NAVEX使用此导航图查找从公共模块到该模块的路径,沿着该路径可以执行漏洞利用。NAVEX通过结合应用程序的动态分析和符号执行来解决动态特性挑战。为了最大化应用程序的覆盖率,NAVEX多次重复动态执行,每次都使用约束解算器生成的不同输入,以最大化应用程序中的路径覆盖率。在每次执行时,NAVEX收集派生应用程序导航结构所需的信息。

在这里插入图片描述

3体系结构和算法

3.1易受攻击的接收器识别

为了识别易受攻击的接收器,NAVEX分别分析每个模块。此步骤的一个隐含目标是从以下步骤中排除不包含易受攻击接收器的模块。特别是,如图2所示,NAVEX首先构建每个模块代码的图形模型,然后发现包含源和汇之间数据流的路径。最后,它使用符号执行生成一个执行模型作为公式,并通过约束求解来确定哪些路径可能被利用。下面将描述这些组件中的每一个。

3.1.1攻击字典
为了应对发现多类漏洞的挑战,NAVEX被设计为易于扩展到各种漏洞,如SQLI、XSS以及逻辑漏洞,如EAR【18】和命令注入。一个关键的观察结果是,几种类型的漏洞本质上是相似的。例如,SQLI和XSS都依赖于恶意数据从源到汇的流动以及恶意数据在这些汇中的注入。主要区别在于接收器和攻击有效载荷的性质。反过来,可以利用这种相似性来构建分析模板,这些模板可以通过最少的更改进行实例化,以发现不同类别的漏洞。为此,NAVEX构建了一个攻击字典,用于实例化针对每类漏洞的分析模板。特别是,它包含以下攻击规范:

在这里插入图片描述
接收器模块:这些是执行攻击的恶意内容的指令。例如,echo和print PHP函数是XSS攻击的接收器。

清理。其中包括PHP清理的广泛列表,包括内置清理函数和操作符,这些函数和操作符可以隐式清理输入(例如,cast操作符)。虽然此列表很广泛,但并不详尽,因此可能会丢失功能。然而,NAVEX使用约束求解捕获已知自定义清理功能(例如str replace)的语义。

遍历类型。它指定了图上所需的遍历类型(稍后将描述图表示)。我们目前支持源和汇之间的向前和向后遍历。具体而言,注入漏洞通常需要向后遍历,而EAR等漏洞则需要向前遍历。

攻击字符串。攻击字符串是可能出现在接收器上的(恶意)值的规范。虽然并非详尽无遗,但NAVEX使用的攻击字符串列表非常广泛。它包含从备忘单(例如,[6])和安全报告中收集的45种攻击模式。

目前,攻击字典包含SQLI、XSS、文件包含、命令注入、代码执行和EAR的条目。

3.1.2图形构造

这一步构建了一个图形模型来表示可能的执行路径,这些路径稍后在PHP模块中以符号方式执行。具体而言,我们的图模型基于代码属性图(CPG)[9,33],它将抽象语法树(AST)、控制流图(CFG)、调用图和数据依赖图(DDG)结合在一起,以唯一的表示形式发现漏洞,这些漏洞被建模为图查询。特别是,给定一条源指令和一条汇指令,可以使用CPG查找变量之间的数据依赖路径。

然而,我们的最终目标不仅是找到易受攻击的路径,而且是产生具体的利用。为此,我们使用清理和数据库约束标记扩展了CPG。这些标记是添加到CPG的属性,用于删减大量潜在的未开发路径,并间接应对路径爆炸的挑战。

消毒标签。清理标记存储有关节点中每个变量(如果有)的清理状态的信息。标记的可能值为unsan-X、san-X,其中X表示特定漏洞。例如,san sql和unsan sql分别表示SQLI清理的存在(或不存在)。

在构建图的过程中,将推断消毒标记的值并将其添加到图中。特别是,当一个节点添加到CPG时,将分析相应节点的AST以检测最终的清理。此分析以攻击字典中包含的针对每种类型漏洞的清理模式为指导。当在节点中的某个变量的清理模式之间找到匹配项时,将为该变量设置相应的san-X值。注意,我们添加了清理标记,用于解决不同类型PHP语句(如赋值、强制转换、二进制、一元语句、内置函数等)的清理状态。

为了演示NAVEX如何分配清理标记,让我们考虑一下清单1第9行的语句。NAVEX首先检查 e d i t i o n = ( i n t ) edition=(int) edition=intPOST[‘edition’]的AST,以便首先为 P O S T [ ′ e d i t i o n ′ ] 分 配 适 当 的 标 记 。 然 后 , 它 将 消 毒 状 态 传 播 到 POST['edition']分配适当的标记。然后,它将消毒状态传播到 POST[edition]edition。在这种情况下,分配给 P O S T [ ′ e d i t i o n ′ ] 的 标 记 是 s a n a l l , 因 为 转 换 为 整 数 操 作 符 会 清 除 攻 击 字 典 中 的 所 有 漏 洞 。 因 此 , 变 量 POST['edition']的标记是san all,因为转换为整数操作符会清除攻击字典中的所有漏洞。因此,变量 POST[edition]sanalledition在其sanitization标记中具有相同的值。

数据库约束标记。数据库通常会对流向数据库表的数据强制附加约束。例如,数据库表的列可以根据列的数据类型(例如,枚举或整数)隐式清理某些输入。我们增强了代码属性图以捕获数据库约束。特别是,对于每个web应用程序,NAVEX解析其模式以收集表名、列名、数据类型和值约束(例如,非NULL)。

在CPG构建过程中,NAVEX将一个名为DB的标记添加到每个应用程序的根节点。此标记包含从模式中收集的信息,稍后将在图形遍历和利用漏洞生成过程中使用(第3.1.3节和第3.1.4节)。

3.1.3图形遍历

此步骤的目标是通过检查增强的CPG来发现从源到敏感汇的易受攻击路径。

向后遍历。算法1中显示了用于发现漏洞注入路径的反向遍历示例。

在这里插入图片描述
该算法首先在图中搜索对攻击字典(第4行)中指定的敏感接收器的调用。对于表示接收器的每个节点,它使用函数AnalyzeNode向后跟踪该接收器中使用的所有变量的数据依赖关系边(第8行)。此函数调用FollowBackardEdge(第18行),以查找从接收器节点到源或函数参数(如果接收器位于函数内部)的所有数据依赖路径。如果路径以函数参数结尾,则在表示该函数调用站点的节点上递归调用AnalyzeNode(第15行)。FollowBackardEdge函数标识源和汇之间的过程内路径,并使用sanitization和DB标记来消除经过清理的路径。最后,getPathsTo(第24行)在图中查找指向源节点的所有已遍历和未初始化的路径。

例如,考虑清单3中易受攻击的接收回显到XSS(第15行)。从这个接收器开始,算法向后跟踪所有数据依赖边,同时检查 n a m e 和 name和 namemsg的清理标记。由于它们都未初始化,NAVEX存储变量的过程内路径,并遵循调用者函数中的数据依赖边,直到到达 m s g 的 源 ( 第 10 行 ) 。 注 意 , msg的源(第10行)。注意, msg10name不是用户输入(保存数据库中的值),因此该算法只将$msg的内部路径作为易受攻击的路径返回给XSS。

FilterSanNodes函数使用sanitization和DB标记来修剪出不可靠的路径以生成漏洞。特别是,在搜索SQLI漏洞期间使用DB标记。对于每个写查询,NAVEX使用SQL解析器解析查询,以查找必要的信息,如表和列名称。然后,它将提取的信息与DB标记匹配,以从列数据类型和值约束(Fdb)中派生约束。在下一步(第3.1.4节)中,这些约束将与路径约束(Fpath)一起使用。

正向遍历。作为另一个示例,为了检测EAR漏洞,NAVEX执行从源到汇的前向图遍历,其中源是重定向指令(例如,标头),汇是终止指令(例如,die)。特别是,我们区分了两种类型的EAR漏洞,即源和汇之间的代码不包含敏感操作(例如SQL查询)的良性漏洞和代码包含敏感操作的恶意EAR漏洞【18】。

此步骤的输出是一组可能易受攻击的路径。这组路径将作为输入发送到下一步。

3.1.4漏洞字符串生成

静态分析的最后一步是在图遍历期间发现的易受攻击路径上生成漏洞字符串。在此步骤中,将每个易受攻击的路径建模为逻辑公式Fpath。此外,从DB标记Fdb派生的约束将添加到公式中。接下来将在汇Fattack处对变量进行额外的约束,这些约束表示可能导致攻击的值。这些值是根据所考虑的漏洞类型从攻击字典中检索的。

增广公式(即Fpath ∧ Fdb ∧ Fattack)下一步发送到解算器,解算器针对输入变量的值提供解决方案(如果存在),即利用字符串。此解决方案包含输入变量的值,在执行路径和清理后,这些变量会导致攻击字符串出现在接收器上。然而,即使存在解决方案,相关的利用也不一定可行。为了确定其可行性,NAVEX需要揭示必须发送到应用程序以执行漏洞字符串描述的攻击的HTTP请求序列。此步骤将在本节的其余部分中公开。

3.2具体开发生成

为了生成具体的漏洞利用,NAVEX执行图3所示的几个步骤。首先,动态执行步骤创建一个导航图,该图捕获可以执行应用程序模块的可能序列。接下来,使用导航图来发现执行路径,这些路径仅指向那些包含易受攻击接收器标识步骤所覆盖的易受攻击接收器的模块。最后,生成最终的漏洞利用。接下来,我们将描述这些步骤中的每一步。

3.2.1动态执行

此步骤负责构建应用程序范围的导航图,该图表示模块执行的可能序列以及相关的约束。

之前的研究【7】已经认识到构建这样一个图表的重要性。然而,这项工作的一个关键区别是生成图形的方法。特别地,[7]的方法使用静态分析来发现链接和表单,而不处理web应用程序的动态特性,这些特性的语义很难静态捕获。

相反,NAVEX使用动态执行方法。它通过爬虫程序执行web应用程序,以便这些动态特性中的很大一部分变得具体,而不需要进行象征性的评估。然而,在执行动态分析时,一个常见的挑战是最大限度地扩大应用程序的覆盖范围。为了应对这一挑战,NAVEX使用约束求解和concolic执行来生成大量表单输入,以帮助爬虫最大限度地扩大应用程序的覆盖范围。

爬虫。爬虫负责发现应用程序的导航结构。对于每个应用程序,爬虫程序都会使用种子URL和有效的登录凭据启动。虽然大多数应用程序有两种类型的角色(管理员和普通用户),但为了最大限度地提高爬网覆盖率,爬网程序会对应用程序中的每种角色类型进行身份验证。爬虫从种子URL开始提取HTML链接、表单和JavaScript代码。这些链接被存储并用作下一个要爬网的URL。对于表单提交,爬虫需要构造符合表单限制(例如,输入长度)的值,并满足最终的JavaScript验证。由于web表单是影响导航结构的常见结构,因此具有自动生成有效表单输入的机制可以极大地提高web应用程序的爬行覆盖率。

为了解决这个问题,我们的爬虫程序使用HTML解析器提取表单的输入字段、按钮以及操作和方法属性(即GET或POST),并对表单属性隐含的表单值生成一组约束。此外,要处理验证表单输入的JavaScript代码,爬虫程序利用了[12]中使用的技术。具体来说,JavaScript代码是使用concretesymbolic执行来提取和分析的。首先具体执行代码,当执行到达具有符号变量的条件语句时,执行分叉。然后,具体恢复执行。在所有fork的执行停止后,将生成一组约束,这些约束表示返回true的每个执行路径。NAVEX将表单HTML约束Fhtml和JavaScript约束Fjs结合起来,生成最终的表单约束Ff orm。例如,在我们的运行示例(清单1)中,表单的约束是:
Fhtml: (book name==“Intro to CS by author1” ∨
book name==“Intro to Math by author2”)
Fjs: edition > 0
Ff orm: Fhtml ∧ Fjs

最后,将公式f形式发送给解算器以找到解决方案。NAVEX使用解算器解决方案、表单方法和操作字段向应用程序发出新的HTTP请求(i.e., http:…/selectBooks.php?action=borrow
POST[book name=Intro to CS by author1,
edition=2])

解决服务器端约束。服务器端代码通常会对输入变量的值引入额外的约束,这可能会影响应用程序的导航结构。最常见的是,这些约束包括对通过表单提交的值的约束。例如,在清单1中,服务器端代码引入了对$publisher字符串长度的额外检查,这在JavaScript验证中不存在。

通常,当服务器约束得到满足时,执行将继续并更改应用程序的状态,而在相反的情况下,应用程序拒绝表单输入,并且应用程序的状态不会更改。因此,为了最大化应用程序的覆盖范围,爬虫程序必须能够生成应用程序接受的表单输入。

虽然自动生成被拒绝的表单输入更容易,但生成被接受的输入更具挑战性。为了应对这个挑战,我们在服务器端代码上使用了一个执行跟踪引擎。NAVEX使用生成的跟踪信息,通过检查应用程序是否(i)更改其状态(即创建新会话、设置新变量和超全局值等)和(ii)执行敏感操作(如查询数据库),来确定请求是否成功。

当请求未成功时,NAVEX利用跟踪信息执行concolic执行。特别地,它首先检索已执行的语句,包括条件语句。然后,收集条件语句自动转换为解算器规范,并取反以发现新的执行路径。然后将新创建的规范发送到解算器以生成新的表单输入。此过程将不断重复,直到表单提交成功。作为一个示例,上述推理构造了以下约束,这些约束将导致成功的表单提交(book name==“intro to CS by author1” ∨
book name==“intro to Math by author2”) ∧
length(publisher)<=35 ∧ edition >0

最后,对于每个接受的表单,NAVEX存储导致成功提交的完整HTTP请求。

在这里插入图片描述

3.2.2导航图

动态执行步骤生成的导航图表示应用程序的导航行为。它是一个有向图G=(N,E),其中每个节点N∈ N表示一个HTTP请求,每个边缘e=(ni,nj)∈ E表示从ni到nj的导航,可以是link或form类型。特别是,对于每条边e=(ni,n j)∈ E ni表示发起请求的页面。图中的每个节点都有以下属性id、URL、角色和表单参数,用于表示表单提交生成的HTTP请求的节点。id属性存储节点的唯一标识符,URL属性是HTTP请求中的URL,该URL由请求的模块名称和HTTP参数组成,role属性保存用作爬虫输入的登录凭据,如图4所示。需要注意的是,导航图可以包含与同一PHP模块关联的多个节点。特别是,如果PHP模块可以接受输入变量的不同组合,则每个这样的组合都由NG中的对应节点表示。

与我们的运行示例相关的NG的部分实例如图4所示。例如,一个可能的表单提交,以及由解算器生成的表单输入值,由节点2和3之间的边表示,而其他边表示链接导航。请注意,hold.php与两个不同的节点(id-s 5和6)关联,每个节点具有不同的输入变量组合(即HTTP参数)。在下一步探索可利用模块的路径时,这种表示将至关重要。

3.2.3最终利用漏洞生成

为了产生最终的具体利用,NAVEX利用NG以及第3.1节中介绍的技术确定的易受攻击的汇。NAVEX在此步骤中必须解决的一个挑战是将脆弱汇识别步骤产生的结果与导航图相结合。特别是,当包含易受攻击接收器的模块被其他使用PHP包含的模块包含时,前者不会出现在NG中,因为没有显式导航到它们。例如,checkout.php没有出现在图4中的NG中。要执行这些易受攻击的模块,执行必须调用包含模块。

为了解决此问题,NAVEX执行预处理包含解析步骤,该步骤创建存储文件包含关系的包含映射。映射是通过执行遍历来构建的,遍历在增强的CPG中搜索表示对文件包含PHP函数(例如,require、include等)调用的节点。

完成包含解析步骤后,NAVEX使用NG和生成的包含映射在NG上搜索从公共模块到可利用模块(或其包含父模块)的路径。需要注意的是,之前对“可能”可利用的易受攻击汇的识别大大降低了此类搜索的成本,并增加了发现可执行漏洞的可能性。

算法2中总结了搜索方法。搜索的第一个输入是NAVEX步骤I中的对集{(模块,漏洞)}。模块表示易受攻击的模块,漏洞攻击表示将恶意值分配给解算器生成的输入。下一个输入是InclusionMap和seedurl,它们表示可公开访问的模块。对于每个易受攻击的模块,使用包含图和漏洞利用中的参数,该算法首先找到可能的目标节点,这将是图搜索的目标(第5行)。这些节点(DestURLs)表示易受攻击的模块或其父模块(如果父PHP模块包括易受攻击的模块)。GetDestURLs仅返回NG的那些节点,这些节点的参数名称与相应漏洞中出现的参数名称匹配。函数ExpSearch首先标识其URL与其中一个SEEDURL匹配的节点(即,与URL匹配属性)(第11行)。然后遍历探索每个检索到的SrcNodes的NG,以找到源节点和DestURLs之间的路径(第13行)。最后,对于每个找到的路径,它用解算器生成的恶意值替换最后一条边中的HTTP参数值。
在这里插入图片描述
在这里插入图片描述
将该算法应用到我们的运行示例中,可以考虑http://localhost/App/selectBooks。php作为SeedURL,图4中id为6的节点作为DestURL,因为该节点匹配易受攻击的模块,其相应的(XSS)漏洞包含对HTTP变量msg的恶意值赋值。由于msg的漏洞字符串是警报(“XSS”)</脚本>(由解算器生成并存储在漏洞中),GetPathsTo探索SeedURL和DestURL之间的以下导航路径:(1)id=2,id=3,id=4,id=5的节点;(2)id=2,id=3,id=4,id=5,id=6的节点。但是,它只返回第一个导航路径,因为节点5的URL不包含HTTP参数msg。最后,ReplaceVulnParams函数将msg的值替换为该漏洞的恶意值。因此,NAVEX生成以下HTTP请求集,作为对易受攻击接收器(第15行)的具体利用,如清单3所示:

  1. http://localhost/App/index.php
    1. http://localhost/App/selectBooks.php with
      POST params:[book name=intro to CS by
      author1, edition=2,publisher=aaaaaaa]
  2. http://localhost/App/selectBooks.php?action
    =borrow
  3. http://localhost/App/hold.php
  4. http://localhost/App/hold.php?step=checkout
  5. http://localhost/App/hold.php?step=checkout
    &msg=

可以注意到,由于我们的动态执行和节点表示HTTP请求的导航图设计,查找执行漏洞攻击的HTTP请求序列的挑战性问题被转化为一个简单的图搜索问题,这是有效的。

4实施

NAVEX的实现是基于几个现有工具的,其中大部分都是为了解决我们的问题而扩展的。对于我们方法的第一步,代码属性图[33]的PHP扩展[9]通过额外的标记得到了增强,以实现精确的污染跟踪和数据库约束推理。然后将增强的CPG导入Neo4j[4]图形数据库,这是一个开源图形平台,用于创建和查询图形数据库。图遍历(如算法1)是用Gremlin[1]编写的。Neo4j和Gremlin也在步骤II中用于构建和搜索导航图。

对于约束求解,我们利用了Z3 solver[17]及其扩展Z3 str[35]。特别是,当图遍历报告到接收器的易受攻击路径时,NAVEX会分析返回的路径及其节点。根据每个节点类型,将自动创建表示节点的三地址代码(TAC)公式。TAC公式由右操作数(rightOp)、运算符和左操作数(leftOp)、节点类型和唯一节点id组成。然后,NAVEX开始根据每个TAC公式的类型分析它们。NAVEX基于运算符leftOp和rightOp生成:(1)适当的Z3变量声明,(2)一组重复Z3规范中PHP运算符语义的断言,以及(3)一个断言,该断言将攻击字典中的适当攻击字符串分配给公式中的每个接收器变量。NAVEX支持赋值、一元、二进制、条件、内置函数和强制转换语句类型。TAC公式分析和Z3翻译引擎代码是近似值3600 Java位置。

对于第二步,我们通过添加对收集表单和JavaScript代码的支持、从表单中提取约束以及生成Z3断言来扩展crawler4j[2]。为了处理JavaScript,我们使用了Narcissus JavaScript引擎的扩展[3],它增加了对JavaScript代码进行象征性评估的能力。然后,将从JavaScript中提取的与表单输入相关的约束进行转换,并与表单约束相结合,然后用Z3进行求解。

为了生成服务器端执行跟踪,我们利用了Xdebug[5],一个PHP代码的开源调试器。请注意,Xdebug与任何调试工具一样,会带来性能问题,例如由于跟踪生成而导致的HTTP响应延迟。因此,为了保持可接受的性能,NAVEX调用Xdebug并按需分析跟踪。

大体上,在NAVEX中实现的技术可以用于为非PHP web应用程序生成漏洞利用。在实现级别,如果目标源代码表示为CPG,目标语言功能(即内置函数、操作符等)的模型作为解算器规范可用,并且使用了合适的服务器端执行跟踪工具,则NAVEX适用于其他服务器端语言。

NAVEX是一款开源软件,可在https://github.com/aalhuz/navex

5评估

数据集。我们在26个真实PHP应用程序上评估了NAVEX,其代码库组合为320万SLOC和22.7K PHP文件,如表1所示。我们选择应用程序的标准包括:(i)评估Joomla、HotCRP和WordPress等流行、复杂和大型PHP应用程序的最新版本,以及(ii)比较NAVEX在漏洞生成(如链锯[7])和漏洞分析(如RIPS[15]、[16])中使用的最新测试应用程序。

设置。NAVEX部署在Ubuntu 12.04 LTS虚拟机上,每个虚拟机有2个2.4GHz的内核和40GB的RAM。我们首先生成增强的CPG,并使用它为所有26个应用程序找到可利用的路径。然后,我们部署了具有可利用路径的应用程序。部署过程包括:在服务器上安装每个应用程序,为每个角色创建登录凭据,并通过导航应用程序和在必要时提交表单来使用初始数据填充应用程序数据库。我们获取每个应用程序数据库的快照,并在每次爬网后使用它来恢复数据库的原始状态。请注意,由于每个应用程序都有特定的部署说明,我们无法利用自动化来包含更多要评估的应用程序。如果有足够的时间进行手动部署,NAVEX可用于分析和生成数百或数千个应用程序的漏洞利用。在这里插入图片描述
结果摘要。NAVEX总共构建了204个漏洞,其中195个是注入漏洞,9个是逻辑漏洞。消毒标签增强的CPG平均将误报率(FPs)降低87%。包含用于构建导航图的客户端代码分析平均将漏洞生成的精度提高了54%。在评估集上,NAVEX能够深入到6个HTTP请求,将漏洞拼接在一起。

增强的代码属性图统计信息。对于所有正在测试的应用,表2显示了增强的CPG施工时间和尺寸。注意,增强图表示所有26个测试应用程序的源代码,表明NAVEX的低运行时开销。
在这里插入图片描述

导航图统计信息。表3总结了NAVEX第二步中产生具体漏洞的总时间。表中的应用程序列表表示NAVEX找到可利用路径的应用程序。因此,如果应用程序没有任何可利用的路径,NAVEX将不会对其导航行为建模。角色的数量反映了每个应用程序的所有帐户类型(权限)的数量。NG大约有59K个节点和1M个边。

5.1漏洞利用
SQLI漏洞利用。NAVEX检查了mssql query, mysql query, mysqli query,
and sqlite query作为SQLI漏洞的接收器。据报道,总共有155个SQLI可利用接收器,运行时间为37m和45秒。从中,它在7m和76sec内生成了105个具体的SQLI漏洞,如表4所示。
在这里插入图片描述
NAVEX为除SchoolMate之外的所有具有SQLI可利用接收器(种子)的应用程序生成了SQLI利用。在SchoolMate中,爬虫程序只恢复了三个HTTP请求。此应用程序有5个不同的角色,对于每个角色,我们的爬虫都能够成功登录。但是,每次爬虫在登录后发送HTTP请求,应用程序都会将执行重定向到登录页面,这意味着应用程序无法正确维护用户会话。因此,爬虫程序没有继续,覆盖率很低。在我们的评估中选择此错误应用程序主要是为了将NAVEX的结果与其他相关工作进行比较,这些工作包括在测试应用程序中。然而,报告的可开采汇被证实为真阳性(TPs)。

已选择SQLI漏洞。NAVEX为其生成了大量SQLI漏洞的应用程序之一是WeBid。清单4显示了位于用户界面中的可利用接收器。经过身份验证的用户可以检查其他用户的消息(第3行),因此,消息将标记为已读(第6行)。清单5显示了为两个接收器生成的漏洞。

在这里插入图片描述
XSS漏洞利用。NAVEX检查了将PHP函数作为XSS漏洞的接收器进行回显和打印的调用。在1h和49m内,共发现133个XSS可利用汇,其中5个为假阳性。如表5所示,它在40米和12秒内成功为133个接收器生成了90个XSS漏洞。由于报告的问题,对于所有可利用的接收器,NAVEX生成了除SchoolMate之外的XSS漏洞利用。

注意,如果之前未报告活动应用程序中的漏洞,并且该漏洞具有显著影响,那么我们认为该漏洞为零,例如MediaWiki中的漏洞就不是这样。

选定的XSS漏洞。对于OSCommerc2.3.4,NAVEX生成了5个XSS漏洞。在下面,我们将演示其中一种利用漏洞的方法,这说明了我们的分析在捕获自定义和内置消毒功能对不同水槽路径的影响方面的准确性。

清单6显示了易受攻击的接收器(echo),其中用户输入$HTTP GET VARS[‘page’]通过3个不同的函数,最终由htmlspecialchars或strtr PHP 函数。NAVEX没有报告通过htmlspecialchars的路径是可利用的,因为它是一个足够的XSS清理功能。另一方面,它报告了包含strtr的路径易受攻击,strtr不是XSS的典型清理功能。在本例中,strtr将双引号替换为“这不足以阻止XSS。NAVEX推断出该函数的语义(通过将许多PHP函数建模为解算器规范)并使用解算器从XSS攻击字典中查找不包含双引号的XSS攻击字符串。此外,要断开外部单引号,攻击字符串应该有一个单引号('HTML实体)编码(%26%2339%3B)。

因此,解算器选择%26%2339%3B警报(1)-%26%2339%3B作为满足路径约束的恶意用户输入。清单7显示了为该漏洞自动构建的漏洞。

在这里插入图片描述
EAR漏洞。NAVEX在17m和17sec内总共检查了246个对header函数(EAR源)的调用。它发现了19个良性EAR和3个恶意EAR漏洞。它成功地为22个EAR漏洞生成了9个漏洞,如表6所示。请注意,在EAR的情况下,漏洞利用是一系列HTTP请求导致执行重定向函数后的代码。

代码执行漏洞。NAVEX检查了对的所有调用PHP函数eval,在我们的数据集中总共有98个调用,分别为21m和20sec。所有调用都不易受攻击,因此,NAVEX确实报告了任何可利用的代码执行接收器,并且没有生成任何利用漏洞的行为。

在这里插入图片描述
命令注入漏洞利用。NAVEX检查了对exec、expect popen、Passthro、pcntl exec、popen、proc open、shell exec、system、mail和backtick operator的所有调用,总共350个调用,耗时22米32秒。NAVEX未发现任何易受攻击的汇。

文件包含漏洞利用。NAVEX在27m和58秒内总共检查了8063个调用,包括、包括一次、要求和要求一次。它在WeBid中将1个接收器标记为可利用。但是,无法生成攻击,因为未初始化的文件名(用户输入)以某些常量字符串作为前缀和后缀,恶意输入无法覆盖这些字符串。

5.2测量

性能和可扩展性。图5显示了NAVEX的性能,该性能通过查找可利用汇和生成每种漏洞类型的漏洞利用的总时间来衡量。注意,对于每种漏洞类型,蓝色条显示了所有受测应用程序分析步骤I的总时间。另一方面,橙色条记录了具有可利用接收器的应用程序在步骤II中花费的总时间。

动态分析覆盖率。我们将第一步静态识别的漏洞数量作为评估第二步覆盖率的基线。NAVEX成功构建了155个SQLI接收器的105次漏洞利用,128个XSS接收器的90次漏洞利用,以及19个EAR漏洞的9次漏洞利用。总体而言,与所有应用程序的总易受攻击接收器相比,步骤II的总覆盖率为68%。

清理标记对代码属性图的影响。图6显示了使用消毒和DB标签增强CPG对易受攻击汇总数的影响。橙色条显示了具有增强功能的易受攻击接收器的总数,显示了误报的减少。总体而言,报告的漏洞数量由于在CPG上实现了显著减少误报的增强,每种漏洞类型的接收器平均减少87%。

在这里插入图片描述
客户端代码分析的效果。我们工作的贡献之一是在NG构建期间精确处理客户端代码。表单是现代web应用程序中常见的构件。在我们的数据集中,我们统计了使用表单接收用户数据的频率。我们发现,所有应用程序中唯一表单的数量从3个(如geccbblite)到186个(如WeBid),平均为45个表单/应用程序。此外,图7验证了我们的说法,即为了提高覆盖率,从而在部署的应用程序中产生更多的漏洞,我们必须支持从表单和JavaScript代码中生成输入和提取约束。从图7可以看出,NAVEX的精度显著提高。

此外,我们还测量了通向所有可利用汇的所有导航路径的最大长度。对于SQLI和EAR攻击,我们发现最大攻击长度为5,而对于XSS,最大攻击长度为6。

5.3与相关工作的比较

我们将NAVEX的结果与其他相关工作进行了比较,其依据如下:(1)常见主题应用程序(和相同的版本号),(2)常见漏洞类型,以及(3)了解如何计算相关工作的结果。一些相关工作符合这些标准,如CRAXweb【22】、RIPS【15】、【16】、【31】、Ardilla【25】和链锯【7】。然而,由于链锯[7]是最新的相关工作,它提供了他们的工作与[22]、[31]之间的详细比较,和【25】,我们将NAVEX与链锯、RIPS和【16】进行了比较。

在这里插入图片描述
漏洞检测。在表7中,我们比较了RIPS、链锯和[16]与NAVEX报告的SQLI和XSS漏洞总数。与链锯相比,NAVEX在scarf和Eve中发现了相同数量的XSS和SQLI漏洞,尽管如此,它报告了myBloggie更易受攻击的接收器。此外,NAVEX在HotCRP、osCommerce和phpBB中发现了71个易受攻击的接收器,因为它可以处理链锯中不可用的面向对象PHP代码。与RIPS相比,NAVEX发现phpBB、osCommerce和myBloggie有19个更脆弱的汇。由于代码属性图中缺少表示动态函数调用的边,它在HotCRP中缺少了2个易受攻击的接收器。

利用漏洞生成。由于链锯支持为XSS和SQLI生成漏洞,我们将其与NAVEX在生成的SQLI和XSS漏洞总数以及一些性能度量方面进行比较(见表8)。NAVEX在WeBid、myBloggie、geccbblite、WebChess和FAQforge中又构建了19个漏洞,并在Eve、scarf和DNscript中实现了同样的效果。对于SchoolMate,由于与维护用户会话相关的问题,NAVEX没有生成漏洞利用(如前所述)。由于在链锯中,漏洞生成是静态完成的,因此它能够为该应用程序生成漏洞。

NAVEX在效率方面明显优于链锯。链锯在112分钟内产生了漏洞,而NAVEX则用了25分钟和2秒。此外,我们将在NAVEX中构建和搜索导航图的总时间(18m 26秒)与在链锯中构建和搜索优化工作流图(RWFG)(1day 13h 21m)的总时间进行了对比。这表明NAVEX中使用的技术在不损失精度的情况下提高了漏洞生成效率。

5.4限制和讨论不支持的功能。

web应用程序的某些功能还不受支持,因此限制了我们的覆盖范围。例如,具有file类型输入的表单要求用户从中选择并上载实际文件本地系统。在给定的测试设置中,这可以与我们的解算器一起工作,但要在所有平台上工作,需要更多的工程工作。另一个问题是从图节点自动导出TAC公式。这是一个具有挑战性的过程,需要分析每个AST节点并为每个节点类型支持不同的节点结构。例如,PHP中赋值语句的左侧可以是简单变量、常量、函数调用、嵌套函数调用等。我们仔细考虑了这些情况,NAVEX支持大多数此类节点类型和结构,但仍有一些实例在开发中。在我们的数据集中,NAVEX错误地将只有5个接收器标记为可在osCommerce2.3.3和WeBid中利用的XSS。在PHP中,静态处理对函数的动态调用是一项挑战。NAVEX使用CPG,而CPG不完全支持解析动态函数调用。然而,这对NAVEX报告的结果没有太大影响。例如,Joomla、OpenConf和MediaWiki中报告了3个耳朵漏洞误报。

在这里插入图片描述

6相关工作

利用web应用程序生成漏洞。利用漏洞的生成在二进制应用程序中引起了很大的兴趣[8、14、21]。对于web应用程序,与NAVEX最接近的工作是链锯(Chainsaw)[7],这是一个使用纯静态分析构建具体漏洞的系统。NAVEX在两个方面与链锯不同:(i)它执行动态和静态分析的组合,这使它能够更好地扩展到大型应用程序并发现更多漏洞;(ii)它支持发现多类漏洞的漏洞。其他相关工作包括Ardilla【25】,它使用concolic执行和污染跟踪来构建SQLI和XSS攻击向量;CRAXweb【22】,采用具体和符号化的执行支持通过约束解算器生成SQLI和XSS漏洞。QED[27]使用Java web应用程序的静态分析和模型检查生成一阶SQLI和XSS攻击。[32]使用PHP应用程序的concolic执行生成暴露SQLI漏洞的输入。EKHunter【19】将静态分析和约束求解相结合,以发现针对犯罪web应用程序的漏洞。WAPTEC[13]和NoTamper[12]利用参数篡改漏洞进行攻击。然而,这些工作仅限于单个PHP模块,不考虑整个应用程序路径。

使用代码属性图建模。Y amaguchi等人【33】引入了CPG的概念,用于C程序中的漏洞建模和发现。在后续工作[9]中,他们将CPG应用于PHP应用程序的漏洞发现。虽然我们的工作使用了CPG提供的灵活性和效率,但我们的问题更进一步,产生了实际的可执行漏洞。因此,我们使用附加属性增强了CPG。

脆弱性分析。有大量研究研究服务器端漏洞检测。大体上,有静态分析方法(如【11、15、16、18、23、24、26、29–31、34】)、动态分析方法(如【20、28】)和混合方法(如【10】)。尽管NAVEX采用了其中一些分析技术来发现漏洞,但NAVEX的目的与这些工作不同,因为它构建了对已识别漏洞的利用。我们的导航建模受到MiMoSA【11】的启发,MiMoSA是一个通过分析web应用程序模块来发现数据和工作流漏洞的系统。NAVEX通过将静态和动态分析结合起来,为大型web应用程序构建具体的漏洞利用来推进分析。

7结论

在本文中,我们介绍了NAVEX,这是一个自动漏洞生成系统,它考虑了现代web应用程序的动态特性和导航复杂性。在我们的数据集上,NAVEX共构建了204个漏洞,其中195个是污染型漏洞,9个是逻辑漏洞。我们证明,NAVEX在漏洞生成的精度、效率和可扩展性方面明显优于之前的工作。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:55:59  更:2022-06-14 22:56:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 14:16:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码