刘 磊 许 静* 朱静雯 陈 亮 李 洁
1(南开大学人工智能学院 天津 300350) 2(南开大学软件学院 天津 300350) 3(国网天津市电力公司电力科学研究院 天津 300384)
SQL注入漏洞(SQLIV:SQL Injection Vulnerability)多年以来被列为危害最严重的Web安全漏洞之一[1],它可能会导致诸如信息泄露或认证绕过[2]等多种严重的Web安全问题。渗透测试由于其高效、易用等特点,已成为最为重要的SQLIV测试技术之一。它是一种黑盒动态测试技术,其是在实际攻击发生之前通过测试者的模拟攻击来检测Web应用漏洞[3]。
传统的SQL注入漏洞主要是将Web页面响应中显示的数据库或系统报错信息作为判定标志来进行识别的,然而近年来涌现出了多种新型的基于推断的SQL注入漏洞,其主要又包括基于反馈页面相似度分析和基于页面响应时间分析的SQL注入漏洞。它们须通过不同的模拟攻击策略及页面反馈信息推断的方法来进行识别,因此其测试的复杂性和难度随之急剧增加[3-4]。由于黑盒渗透测试是通过分析模拟攻击测试HTTP请求的响应反馈来检测漏洞,不同测试用例及其特定响应反馈之间具有较为复杂的攻击反馈规律,因而可能造成传统基于<测试用例(Test Case),预测结果(Test Oracle)>键值对及用例库枚举测试的渗透测试手段的覆盖度和准确性的不足,尤其体现在较高的漏报(FN:False Negative)和误报(FP:False Positive)方面[4]。
以往的研究多集中在通过提高对测试响应的分析能力来提高SQLIV渗透测试的覆盖率和准确度[3,5-6]。其中动静态检测相结合的技术可以通过白盒方式分析和修改源代码或后台服务器设置来增强对反馈响应的分析能力[6-7],但是其对于源代码的依赖极大地限制了它在许多不能访问到后台服务或源代码的实际场景中的应用。许多黑盒渗透测试方法采用经验错误模式或特征提取技术来进行反馈响应的分析,这些方法通常将测试用例或测试模式作为外部条件因素进行考虑,往往采用测试用例顺序枚举的方式进行测试[8-10]。然而这种传统的枚举式黑盒渗透测试方法已难以应对日益增加的测试响应反馈规律的复杂性。与此同时,随着测试用例和响应反馈之间对应规则模型的不断增多,极大地增加了测试整体的规模,也带来了覆盖度、准确性和测试效率之间的权衡问题[3,11]。
针对上文所述的基于推断的新型SQL注入漏洞以及传统渗透测试方法对其测试的准确度及效率不佳的问题,提出一种基于攻击树[12]及反馈分析的攻击反馈模型AFM(Attack Feedback Model)和渗透测试框架AFTF(Attacking Feedback Testing Framework)。该方法通过自底向上的反馈信息流以进行启发式的动态SQL注入漏洞渗透测试,从而解决攻击反馈推断分析过程中的攻击策略模拟和反馈时序分析的问题。该模型由多个基于反馈的测试阶段FT Stage(Feedback based Test Stage)所构成的攻击树,其每一阶段包含一系列基于攻击子树的反馈测试单元FT Unit(Feedback based Test Unit)。每个反馈测试单元是由模拟攻击测试及其反馈构成的攻击树模型,对应于某个具体类型的SQL注入漏洞渗透测试,其用于进行底层的HTTP测试请求和响应的执行和分析。
SQL注入漏洞是通过对基于数据库交互的Web应用程序的输入进行篡改而引发的,当经过攻击者恶意编辑过的SQL子句被注入到SQL查询并被传输到后台数据库时,就会造成SQL注入漏洞[5-6]。SQL注入漏洞可以存在于URL参数(GET方法)、网页表单输入(POST方法)、HTTP Cookie或Header参数中。
假设某网站页面链接中存在SQL注入漏洞“HTTP://www.URL.com/test?customer=Geng&id=123 AND 1=1--”,其注入点位于URL中的参数“id=123”中,测试用例(注入有效负载)为“AND 1=1--”,而其最终传输到后台数据库的SQL查询为:“ SELECT * FROM Costumers WHERE customer=Geng AND id=123 AND 1=1--”。原始的SQL查询没有包含测试用例“AND 1=1--”的部分。因为重言式子句“AND 1=1--”不能更改SQL语句的逻辑,显然注入的SQL查询逻辑与原始查询逻辑相同。如果我们将测试用例更改为“AND 1=2--”,HTTP响应将会因矛盾子句“AND 1=2--”引起的逻辑变化而发生变化。通过对HTTP响应相似性变化的观察,我们可以得知该注入点是否存在SQLIV。
渗透测试是在实际应用中最为常见的SQL注入漏洞黑盒动态测试技术之一,其主要是通过模拟攻击者的思路和输入来对SQL注入漏洞进行测试。由于缺少后台系统和数据库的详细信息,渗透测试通过分析模拟攻击测试的HTTP响应反馈来发现该注入点是否存在SQLIV。从测试反馈分析方法及手段的角度来看,主要可以将SQL注入漏洞的检测分为基于页面相似度、基于数据库错误和基于页面反馈时间这三种类型[5]:
1) 基于反馈页面相似度(Similarity-Based):分析目标SQL查询的逻辑变化导致测试反馈页面的相似度变化。
2) 基于反馈的数据库错误(Error-Based):分析渗透测试中由于违反SQL语法而导致测试反馈页面包含数据库报错。
3) 基于反馈时间延迟(Time-Based):分析由于注入的时间延迟指令或后台计算指令导致的页面反馈时间延迟。
上述三种类型主要是基于SQL注入漏洞攻击或测试过程中的反馈信息分析方式进行定义的。类型1)定义的是基于相似度分析的SQL注入漏洞,在对这种漏洞进行判断识别的时候一般以原始页面与测试反馈页面的相似度变化情况为参照进行分析。类型2)的SQL注入漏洞在进行漏洞判断的时候,是以反馈页面信息中的数据库错误为标志进行分析判断的。类型3)的漏洞在测试过程中通过发送时间延迟的SQL命令并分析测试反馈的返回时间的延迟情况来判断是否存在相应的漏洞。其中,类型2)是早期最为经典的SQL注入漏洞反馈分析方法,而类型1)和类型3)是基于推断的漏洞判定方法,其发生频率不断增加,且相应的漏洞种类也演变得越来越丰富和多样,因而给SQL注入漏洞的渗透测试带来了巨大的挑战。以上述三种反馈分析技术为基础,本文提出了基于攻击反馈模型AFM(Attacking Feedback Model)的SQL注入漏洞渗透测试方法,首先我们对基于攻击反馈的渗透测试策略进行了总结分析,引入了6个符号以描述基本的测试反馈状态,如表1所示。符号“EOR”(ERROR)和“NEOR”(NO ERROR)是基于数据库报错的反馈分析标志,例如对字符型注入点注入转义字符“′”可能造成形如“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ″Geng″”的数据库报错。这个错误不但暴露了该SQL注入漏洞,而且还泄露了数据库类型MySQL和关键词“Geng”。利用这些窃取到的敏感信息,攻击者可以进一步实施更为准确并且危害更大的攻击,因而其经常被作为信息收集和判断注入点的重要手段。
表1 SQLIV渗透测试响应反馈符号定义
符号“SIMI”(SIMILAR)和“CHG”(CHANGE)是基于响应页面相似性的反馈分析标志。基于页面相似度的SQL注入漏洞是根据注入后的反馈页面与原始页面是否相似来判断是否是一个漏洞。例如,当注入形如“AND 1=1”的重言式时,测试反馈响应与原始反馈响应相似,其反馈标志为“SIMI”;而当注入“AND 1=2”的矛盾式时,反馈页面分析结果为不相似,其反馈标志位“CHG”。基于反馈页面相似度的SQL注入漏洞也被称为“SQL盲注入漏洞”。
符号“DLY”和“NDLY”是基于响应时间的反馈分析标志。基于页面反馈时间的SQL注入漏洞是根据注入后的页面响应时间是否延迟来进行判断的。例如当注入形如“SLEEP(n)”的注入语句时,页面响应时间会有n秒的反馈延迟,该类型漏洞也被称为“时间延迟注入漏洞”。
本文还引入了两个符号“V”(Vulnerability)和“NV”(No Vulnerability)来表示测试单元和测试阶段的中间检测结果。“V”表示该测试单元或测阶段检测出SQL注入漏洞,“NV”表示无证据表明在这个测试单元或测试阶段存在SQL注入漏洞。
在SQLIV渗透测试中,可以通过使用一系列预先定义好的测试模式来识别漏洞,这些测试模式可能包括多个测试用例(有效载荷)及其对应反馈的组合,如“AND 1=1→SIMI”和“AND 1=2→CHG”的键值对模式。传统的SQLIV渗透测试模式多通过专家经验总结得来,采用基于顺序枚举的方式进行渗透测试,但这种测试往往并不充分,不适用于具有复杂测试序列或时序的情况。
在本文中,我们定义了基于攻击反馈的测试单元AFT-Unit来描述SQLIV渗透测试的不同种类和模式,其可以用于描述和分析测试用例及其反馈响应的复杂规律性,如图1所示。本文基于攻击树的攻击逻辑及反馈分析路径给出了六种通用的攻击反馈测试单元的示例,其包含了常见的SQL注入漏洞判定路径与三种反馈分析方式的组合信息。每个测试单元是一个基于攻击反馈决策的二叉攻击树,其中每个节点(除叶子节点之外)代表一个测试用例,树的每条边代表对于其父节点的某种反馈响应,叶节点代表该测试单元的中间检测结果。叶节点包括“V”和“NV”,其也作为整个攻击反馈模型AFM中的反馈响应符号。某个到叶节点的路径表示导致某种中间检测结果的所有测试用例及其反馈响应的组合,如图1中测试单元S2中的“S20→SIMI→S21→CHG→V”表示某个基于反馈页面相似度方式下基于数字计算的SQL注入漏洞检测过程路径。
图1给出了反馈测试单元的举例,包括基于报错的反馈测试单元(FT-Unit S0和FT-Unit S1),基于页面相似度的反馈测试单元(FT-Unit S2和FT-Unit S3)和基于时间延迟的反馈测试单元(FT-Unit S4和FT-Unit S5)。例如,FT-Unit S3表示基于相似性重言式的测试单元,其包括测试用例“AND 1=1--”(S30)和“AND 1=2--”(S31和S32),并且其有两条不同的测试路径可以检测出SQL注入漏洞,通过叶节点“V”(Vulnerability)来表示。并且本文在反馈测试单元FT-Unit的基础上引入了基于攻击反馈的测试阶段(FT-Stage:Feedback based Test Stage)来表示包含一系列同类型测试单元的某个测试阶段,如图2所示。每个反馈测试阶段都包含多个具有相似检测方式和测试用例变体的测试单元,这里规定测试阶段中的测试单元按照顺序来执行。
图2 基于攻击树的攻击反馈模型AFM(Attacking Feedback Model)
本文攻击反馈测试单元FT-Unit所组成的反馈测试阶段FT-Stage基础上,构建了SQLIV渗透测试整体的攻击反馈模型(AFM:Attacking Feedback Model),如图3所示。
图3 整体测试框架
本质上,攻击反馈模型是基于反馈测试阶段的攻击树模型,其包括每个测试阶段FT-Stage的执行和每阶段响应反馈结果构成的路径,及其最终的测试结果信息。在攻击树模型AFM中,每个节点(不包括叶节点)表示一个特定的测试阶段,每一条边表示前一个测试阶段得到的响应反馈,每个叶节点表示对于一个注入点进行渗透测试的最终测试结果。
对于该模型攻击树中的反馈边,我们将其分为两类:主动反馈(包括EOR、CHG、LAG和V)和被动反馈(包括NEOR、SIMI、NLAG和NV)。主动反馈对应的边意味着其父节点对应的阶段至少有一个特定的测试单元包含该测试反馈结果。被动反馈对应的边表示在前一个测试阶段没有发生该阶段对应的主动反馈。攻击反馈模型的每个测试阶段都包含一组具有相同特征或功能的反馈测试单元,这些测试单元顺序执行,当出现主动反馈结果,或执行完所有测试单元时结束该测试阶段(此时若未出现该阶段特定的主动反馈,则该测试阶段反馈结果为对应的被动反馈),如图2右上角子图所示。
攻击反馈模型有三个预测试阶段,包括“随机字符串预测试阶段”、“转义字符预测试阶段”和“基于相似度的预测试阶段”,其决定了该模型应该进行哪种类型反馈测试阶段。不同的测试阶段以及其特定的反馈会引发相应的测试策略。最终,每条路径均包含对于整个测试的最终测试结果的叶节点。我们可以对每个被测注入点采用该模型进行测试,从而在目标Web站点中有效地检测SQL注入漏洞。
基于攻击反馈模型,我们建立了其启发式的SQL注入漏洞测试框架,其可以通过收集和分析测试攻击反馈信息,并利用这些信息指导下阶段信息。基于攻击反馈模型的整体测试框架如图3所示,包括三个层次:基于攻击树的反馈测试框架(AFT-Framework:Attacking Feedback based Test Framework)、用于执行测试的攻击反馈测试阶段(FT-Stage:Feedback based Test Stage)和基于攻击子树的攻击反馈测试单元(FT-Unit:Feedback based Test Unit)。
基于攻击树的攻击反馈模型对应于最上层的测试框架AFT-Framework,其中攻击反馈测试模型决策模块用于控制整个框架的测试过程,基于攻击树模型和攻击反馈分析进行反馈测试阶段FT-Stage的筛选,调用测试阶段的执行模块,并进行每个测试阶段的反馈结果分析,并根据上一阶段的反馈结果对下一阶段采用的测试阶段和测试策略进行选择和控制。
从图3中各模块的整体关系来讲,攻击反馈测试框架三层之间是由左至右逐层循环调用执行更为细粒度的测试,并在获得细粒度的反馈信息后从右至左逐层反馈至上层模块进行综合运算和分析的过程。该测试框架利用攻击树模型选择出当前的反馈测试阶段FT-Stage,每个反馈测试阶段FT-Stage用于对某个测试阶段所包含的攻击反馈测试单元FT-Unit集合进行控制,其枚举执行集合中的测试单元。当某个测试单元执行后出现主动反馈结果时,或者集合中所有测试单元执行完毕,则停止该测试阶段的测试,如图2和图3所示。测试单元执行模块则是对每个反馈测试单元FT-Unit进行控制和实施,首先通过攻击反馈测试单元控制模块进行攻击子树的分析,筛选出当前的测试用例进行注入语句拼接合成,并发送HTTP请求和接收HTTP响应,最终进行响应反馈分析,其反馈分析结果返回至单元控制模块后用于指导下一次用于测试用例的筛选和执行。
该攻击反馈测试框架可对基于攻击树的攻击反馈模型进行具体的实施和应用,进行逐层次的攻击反馈信息和控制信息传递,从而实现一种反馈信息流自底向上的启发式动态渗透测试过程,在提交测试覆盖度和准确度的基础上降低了测试冗余度,从而提高整体的测试效率。
本文基于攻击反馈测试框架开发了其原型测试工具,该工具基于“Visual Studio 2010 +.net 3.5+C#”环境进行开发,对攻击反馈测试模型进行了实现。该原型工具可以对目标测试网站中的URL页面包含的注入点进行SQL注入漏洞检测,这些注入点在实验之前由第三方的爬虫工具进行抓取。我们同时选取了两种第三方SQL注入渗透测试工具进行比较实验,包括WVS Acunetix[13]和IBM Security Appscan[14]。Acunetix和Appscan是两款著名的商用Web应用安全测试工具,它们是目前具有代表性的两款商用渗透测试工具。本文将这两款测试工具表示为工具A和工具B(没有特定的顺序),并且设置为其最高级别检测模式进行测试。
为了进行实验对比分析,本文基于开源Web应用程序漏洞扫描器评估项目Wavsep(The Web Application Vulnerability Scanner Evaluation Project)[15]进行扩展,开发了用于实验的目标漏洞测试系统VulPoc(Vulnerability Proof of Concept)。VulPoc可被用于评价Web应用漏洞检测工具的综合检测能力,基于“PHP 5+MySQL 5”开发,包含7 215个URL,以及6种类型的158个植入的SQL注入漏洞,其中122个漏洞来源于Wavsep项目,另外36个漏洞由多名专业Web安全专家进行开发和植入,VulPoc的详细信息如表2所示。
表2 目标测试系统VulPoc详细信息
为了全面评价SQL注入漏洞的测试能力,本文从以下两个方面展开实验:准确度(Accuracy)和效率(Efficiency)。检测的准确度可从召回率R和误报FP情况来进行评估。对于测试效率,我们是采用测试过程中的HTTP请求数量(HTTP Requests)作为评估指标。之所以采用该指标,是由于在实际的SQL注入漏洞渗透测试过程中的网络延迟和Web应用负载限制等方面原因,对整体测试效率和时间影响最大的是其所发送的HTTP请求数量,因而可通过平均HTTP请求数(AHR:Average HTTP Requests)来进行测试效率的评估。
召回率R描述了SQL注入漏洞渗透测试工具的检测覆盖度情况,其可通过式(1)来表示。其中,RC是召回漏洞数量,VUL是被测系统中实际存在的漏洞。
(1)
误报FP(False Positives)表述的是检测工具扫描出的假阳性漏洞,即错误的扫描结果,其可通过误报率FPR(False Positive Rate)来描述,其表示在所有扫描结果中误报所占的比例,如式(2)所示。其中,FP为误报结果数。
(2)
对于检测工具误报水平的评估,还可通过检测每条URL的时候出现误报的概率FPP(False Positive Probability)来衡量。
(3)
表3给出了本文对照实验的详细结果数据,其中AFM表示本文所述方法所开发的原型系统,Tool A和Tool B分别表示的是WVS Acunetix和IBM Security Appscan(出于商业保护的目的,这里Tool A和Tool B与两个工具名称之间没有特定的对应顺序)。可以看到,本文提出的攻击反馈模型AFM检测出的有效召回漏洞数量RC_Num数量为153,高于工具A和工具B的132和126个,误报结果数为6,而工具A和工具B的误报数分别为37和22。
表3 实验结果数据详细信息
图4是在表2基础上得到的柱状分析图,其中包括召回率RCR、误报率FPR、误报概率FPP、平均HTTP请求数AHR(Average HTTP Requests)的对比分析信息。图4显示出本文所述方法在植入漏洞的被测目标系统中的测试召回率RCR为96.8%,误报率FPR为3.8%,相较对比工具而言具有更高的召回率、更低的误报率,更进一步说明了本文所述模型的准确性更高。
图4 实验对比分析结果图
同时,AFM模型具有更低的误报概率FPP=0.8‰及更低的平均HTTP请求数AHR=88,而这两项指标在对比工具中工具则最高达到了5.1‰和298。具有更低的误报概率和更低的HTTP请求数显示出在大数据量的URL测试环境下,AFM模型在测试每条URL的过程中产生的误报较低,同时其测试效率更高,更加适用于当前实际应用中Web应用系统规模和复杂度都越来越大的情况。
本文提出了一种基于攻击反馈模型AFM的Web应用系统SQL注入漏洞自动化渗透测试方法,通过自底向上的反馈信息流实现了一种启发式的动态渗透测试方法。在攻击反馈分析的基础上建立整个测试模型的反馈测试单元FT-Unit,同时设计了基于反馈测试单元枚举的反馈测试阶段FT-Stage,最终在此基础上提出了基于攻击树的攻击反馈模型AFM,并设计了整体应用的测试框架AFTF,从而实现了一种快速有效的Web应用系统启发式渗透测试模型。本文建立了基于攻击反馈测试框架AFTF的实验原型系统,并通过对比实验给出了其在目标测试系统上的实验对比分析结果。实验结果表明,本文所述方法可在保证较高的测试效率前提下,有效提高Web应用系统中SQL注入漏洞渗透测试的准确度,具有较高的召回率和较低的误报率。