基于特征的电力信息系统注入漏洞检测方法
2021-08-23李永刚
陈 亮,李永刚,刘 磊,许 静,李 洁
(1.国网天津市电力公司 电力科学研究院,天津 300384; 2.国网信息通信产业集团有限公司,北京 102211;3.南开大学 人工智能学院,天津 300350)
0 引 言
在能源互联的背景下,电力Web信息网络得到了高速的发展,然而其安全性问题日趋严峻[1,2],其中SQL注入漏洞(SQL injection vulnerability,SQLIV)在电力业务信息系统中的危害愈加凸显[3,4]。攻击者可通过伪造发送给Web应用后台数据库的SQL查询,导致其被解析为非预期的查询[2,5]。因而,针对电力业务信息系统中SQL注入漏洞检测方法的研究具有重要的理论和现实意义[6,7]。
渗透测试是最为主要的电力Web应用漏洞动态检测技术[8,9]之一,但其在庞大复杂的电力信息系统应用中依然存在检测覆盖度和准确度不足的问题[10-12]。一个主要的原因是测试用例集和验证措施的不充分,以及难以在大规模测试的环境下满足效率需求[6,11]。以往许多方法集中于对信息收集和响应分析方面的研究,而对测试用例集和验证措施充分性方面的研究相对较少[6,7]。其大都将测试用例集作为外部因素,通过经验枚举获取测试用例[11-13]。面对如何提高测试覆盖度的问题,相继有研究提出基于模板组合和攻击变异的测试用例生成方法[12,13],以及基于攻击模型的攻击生成方法[14],但其大多仅从测试输入层面展开,缺乏对于测试整体各阶段要素和特征的研究,尤其是缺少对包括目标程序控制层面和后台数据库语法逻辑层面在内的整体特征和规律的探讨。
针对上述问题,本文提出了一种基于特征的电力业务信息系统的SQL注入漏洞自动化渗透测试方法。首先对电力业务信息系统内部和外部多个层面的注入漏洞特征进行抽象分析建模,并建立其特征矩阵模型FMM(feature matrix model),并基于FM特征组合的等价类划分和剪枝技术,提出了一种启发式的特征筛选算法HFS(heuristic feature selection),以提高整体测试的覆盖度和效率。最后,本文将所述方法在多个测试数据集上与两个渗透测试工具进行对比实验分析,验证了该方法的有效性。
1 SQL注入漏洞渗透测试特征模型
针对渗透测试用例的覆盖度问题,需要考虑到目标Web应用的状态和后台逻辑等内在的因素,才能在生成有限测试用例集的情况下,对电力Web信息系统内部复杂多变的系统环境进行有效的覆盖。然而更为充分的测试用例集和验证措施所产生的冗余和大量HTTP请求会造成整体检测效率的大幅度下降,从而严重影响了其在电力业务信息系统中的应用[14]。电力Web信息系统在技术架构上和规模上具有层次多和复杂性高的特点,同时其包含了大量的动态交互页面。如何有效地结合测试输入特征、应用控制特征和语法逻辑特征来指导测试,在保证测试全面性和充分性的条件下提高其整体效率,便成为提高电力信息网络SQL注入漏洞渗透测试能力的关键。因此,本文基于对电力Web信息程序内部和外部多种因素进行全面分析,结合电力业务信息系统特征,从灰盒测试的角度更为深入分析漏洞的内在规律,构建了针对电力业务信息系统渗透测试的特征矩阵模型,这里首先给出其基本定义和形式化的描述。
1.1 基本模型和相关定义
为了能够对电力业务信息系统实现全面的SQL注入漏洞渗透测试,并通过充分的验证机制保证其准确性,需要获得全面而有效的测试用例集,并保证该测试用例集适当的冗余性,即包含对于同一目标注入点产生的效果相同但表现形式不同的测试用例。这样便能够实现对电力信息系统渗透测试的高覆盖度,并利用冗余验证保证测试的准确度。为了获得充分而全面的测试用例集,我们从电力业务信息系统注入的内外部特征入手进行全面的分析,不仅要考虑到异常验证等因素,还需要在电力信息系统正常功能的范围内对漏洞特有的安全行为特征进行分析和检测。因而,我们将影响其渗透测试的相关因素归纳为3类,并将其整体定义为特征矩阵模型FMM。在本文所述模型中,特征(Feature)表示能够体现SQL注入测试语句、语法和控制相关特有规律和特点的标志。下面给出电力业务信息系统SQL注入特征矩阵的形式化定义。
定义1特征矩阵FM(feature matrix)为一个三元组FM={IF,GF,CF}。其中IF,GF和CF均为多元组,其中IF表示语句特征,GF表示语法特征,CF表示控制特征。
FM由3个多元组构成,实际表示了3种类型的子特征矩阵,包括电力业务信息系统的外部注入特征矩阵IF(injection feature)、其系统内部语法特征矩阵GF(grammar feature)、测试过程中的控制特征矩阵CF(controlling feature),在电力信息系统渗透测试过程中,通过对这些特征进行解析和操作,可以动态生成对当前电力业务信息系统具有针对性的测试用例、过程控制与结果分析。其3类子特征矩阵的形式化定义分别如下。
定义2注入特征IF为五元组,IF={KW,IM,PF,SF,SE};其中KW表示注入关键词 (KeyWord),且为IF的主特征元素;IM为注入模式(Injection Mode);PF为注入前缀(PreFix);SF为注入后缀(SufFix);SE表示注入终结符(SufEnd)。其矩阵表示如下
定义3语法特征GF为三元组,GF={IP,OL,IL};IP(injection point)表示目标查询子句中注入点位置的语法,且为GF的主特征;OL(original logic)表示原始查询子句的逻辑语义;IL(injection logic)表示注入后查询子句的逻辑语义。其矩阵表示如下
GF描述了电力业务信息系统中通用的SQL查询语句的语法特征信息。目标查询子句的注入点语法IP为主特征,对注入的语法起到决定性作用,决定了测试语句特征IF中对应的关键词KW的范围,如图1所示。OL则为原始查询子句的逻辑语义,包括真T、假F、响应时间正常TIME_OK和响应数据正常RESP_OK。IL为注入后查询子句的逻辑语义,包括真T(similarity-based injection)、假F(similarity-based injection)、响应时间延迟TIME_DL(time-based injection)和响应数据出错RESP_ERR(error-based injection)。
图1 SQL语法树与特征编码对应关系
定义4控制特征CF为四元组,CF={RP,VT,RT,KN};其中RP(response process)为响应处理方式,且为CF的主特征;VT(value type)为注入点参数类型;KN(keyword number)为是否包含关键词;RT(replace type)为注入参数替换方式。其矩阵表示为
CF描述了电力业务信息系统SQL注入漏洞渗透测试流程中参数和控制的抽象特征描述。其中响应处理方式RP为CF的主特征,SQL注入检测时的响应处理的方式决定测试用例语句特征IF中关于响应处理的具体内容,并且决定了响应分析时采用的具体方法。VT表示注入点的参数类型,包括数字类型NUM、字符串类型STR和无类型NULL。KN为判断是否包含关键词的参数,不包含关键词为F和包含关键词为T。RT为是否对注入点原始参数进行替换,包括两种参数值,进行替换REPLACE(replace)和不进行替换NOREPL(no replace)。
1.2 测试用例规则
为了能够对电力业务信息系统繁多复杂的动态页面环境进行全面有效的SQL注入漏洞测试,我们将电力信息系统注入特征、语法特征和控制特征进行组合,进而得到全局的特征模型FM。通过FM可进一步提取出测试用例规则TCR(test case rule),通过TCR可在对电力信息系统进行测试过程中实时生成针对当前业务系统的SQL注入测试用例,并对检测语法、判定规则和测试流程进行动态控制。对于给定子矩阵IF、GF和CF的FM模型,有FM={IF,GF,CF}=IF×GF×CF,其中符号×表示对矩阵进行笛卡尔积运算。初始的FM实际上是3个子矩阵所有行的组合,根据FM的矩阵表示,我们可以得到测试用例规则TCR,见定义5。
定义5测试用例规则TCR为十一元组,TCR=(KW,PF,IM,SF,IF,OL,IL,RP,VT,RT,KN),即特征矩阵FM的每一行(Row)即为一个测试用例规则TCR,TCR可简化记为TCR=(IF,GF,CF)。
基于TCR的外部注入语句特征IF,我们可以根据其进行动态的测试用例语句TCS(test case statement)拼接生成,例如TCS=R.PF+R.KW+R.SF+R.SE。通过动态拼接注入特征元素,并对其进行一定的编码转换便可实时生成该TCR所对应的测试语句。利用其内部语法特征GF的特征值可对检测结果进行对应的结果分析,如图1所所示。同时,在检测的过程中通过控制特征CF可对测试用例和注入方式进行相应的控制和调整,例如当响应处理方式特征RP为C103时,是基于时间(Time-Based)的响应处理方式,此时将测试用例语动态调整为TCS=TCS.Replace(″V2″,″SLEEP(30)″),也就是将测试语句加入时间延迟命令“SLEEP(30)”。
通过特征矩阵FM可以组合生成大量的TCR,进而生成大量的测试用例,从而提高渗透测试的覆盖度。然而在通过大量测试用例提高测试覆盖度的基础上,同时大量增加了测试规模,进而影响了渗透测试效率和在电力业务信息系统中的可用性。因而,为了在提高准确度的基础上,提升在电力业务信息系统中SQL注入漏洞渗透测试的效率,本文进一步提出了一种启发式特征筛选HFS(heuristic feature selection)算法。
2 启发式特征筛选算法
2.1 等价子矩阵的划分
通过大量实验发现,在具有决定作用的电力业务信息系统SQL注入渗透测试特征中,CF的子特征RP、VT、KN、RT均可在检测过程中通过检测的注入响应信息的收集和分析过程中,被逐步直接或间接地获取到,并应用于对TCR的有效性和语句形态进行判断和调整,同时CF可应用于渗透测试流程的控制。根据这些特点,我们可以确定矩阵特征的范围,从而筛选出最优的TCR进行测试。由于目前仅能根据CF特征确定特征值范围,因而最终所确定的是FM的子集。故我们根据CF子特征值的不同组合情况,将特征矩阵FM划分为数个子矩阵(Sub Matrix),这些子矩阵实际上可以理解为关于TCR的等价类。对FM子矩阵的划分依据是控制特征矩阵。
CF子矩阵的每一行即对应一个基本的FM子矩阵,这些子矩阵具有相同的CF特征值。即对于FM中所有CF四元组(RP,VT,KN,RT)的值相同的行即属于同一个子特征矩阵。例如,对于(RP,VT,KN,RT) =(C101,C202,C301,C402)的TCR组成了其CF子特征RP、VT、KN、RT值分别为“SIMI”、“STR”、“NONE”和“NOREPLACE”的子特征矩阵,而矩阵中TCR的IF和GF特征值则是由他们之间子特征的笛卡尔积运算的结果组成,如图2中所示。由此可知,FM子矩阵的数量与控制特征CF矩阵的行数相同,为T=|RP|×|VT|×|KN|×|RT|,则TCR集合也被划分为T个等价类。在实际应用过程中,我们用CF每行的值来分别代表一个TCR集合。例如,编码(C102,C202,C301,C402)表示在FM矩阵中与该值相对应的子矩阵,其所对应的TCR集合为{(IF,GF,CF)|CF(RP)=C102∧CF(VT)=C202∧CF(KN)=C301∧CF(RL)=C402}。该编码表示有效的TCR应符合以下条件:结果处理方式RP为“相似度比较方式SIMI”;注入点参数类型VT为“字符串类型STR”;测试用例包含关键词“Keyword”;并且注入参数替换方式RT为“不替换原始参数NOREPL”。
2.2 特征筛选
为能够在保障测试覆盖度的基础上,有效提高电力业务信息系统SQL注入漏洞渗透测试效率,提出一种启发式特征筛选HFS算法。HFS利用检测中收集到的信息动态划分和筛选符合检测条件的子特征矩阵,从而逐渐缩小用于检测的测试用例集合,并且对于当前的电力业务信息系统更具有针对性。首先,HFS随着检测的进行逐渐收集和分析之前的反馈信息,并分别获取CF子特征的目标值(Target Value),目标值描述了实际被测环境和TCR应该遵守的条件值。一旦HFS发现某个新的CF子特征目标值,它会根据该特征目标值重新筛选出与其对应的数个子矩阵,这些子矩阵共同构成了用于后续检测的当前矩阵Current Matrix。HFS通过多叉树实现对于有效子矩阵的筛选FST(feature selection tree),其每一个分支代表同一子特征一种值的可能性,每一个叶子节点代表了满足其相应条件的子矩阵集合,如图2所示。筛选出的子矩阵构成的当前矩阵被用于后续检测的TCR集合,每当检测过程中探测到新的CF子特征目标值,则程序会重新进行子矩阵筛选,并获得新的当前矩阵Current Matrix进行更加有针对性的检测。HFS可以在保证对于同一注入点较高的检测覆盖度和用于验证的必要冗余的情况下,过滤掉不必要的和不符合本次检测条件的测试用例,进而可以提高整体的检测效率。
图2 启发式特征筛选(HFS)方法实例
算法1与算法2描述的是算法及其在电力业务信息系统中的应用方法。算法1是关于调用HFS进行动态筛选的主函数,在当前特征集合Current FM不为空的前提下,循环调用矩阵中的测试规则GTR,并利用其进行SQL注入渗透测试;对测试的响应结果进行分析,一旦发现新的Status信息,就调用算法2对Current FM进行一轮重新的筛选;将每一条处理过的GTR从Current FM中删除避免重复测试;当Current FM变为空,即其中所有GTR被处理完毕后,算法1停止。算法2则是描述的每一轮HFS筛选的过程,循环对Current FM中的每一条GTR进行判断,当其符合Status的条件时将其加入新的Current FM,否则将其丢弃;循环结束后所剩下的Current FM即为之后检测时用于检测的GTR集合。
算法1:SQL注入漏洞渗透测试主函数
Input:LegalFM(Legal Feature Matrix)
IPI(Injection Point Information)
Status(GTR Status variable)
Output:Result(Testing Result)
(1)Initialisation:CurrentFM=LegalFM,Status=NULL;
(2)WHILE(CurrentFM≠NULL) {
(3)gtr=CurrentFM.FIRSTROW; /* 选择 Current FM的第一行并赋值给变量gtr*/
(4)Response= SQLIV Testing according toIPIandgtr;
(5) IF(Collect new Target F-V Pair from Response) {
(6)Status=Status.ADDNEW_TFVP (Response)
/*将检测过程中收集到的新键值对更新至Status状态变量*/
(7)CurrentFM= HFS (CurrentFM,Status);
(8) }
(9)Result= Result analysis according toIPIandgtr;
(10)CurrentFM.REMOVE_ROW(gtr); /* 从CurrentFM中移除与gtr值相等的一行*/
(11) }
(12) RETURNResult;
算法2:启发式特征筛选算法HFS
Input:CurrentFM(Current Feature Matrix)
Status(GTR Status variable)
Output:NCFM(New Current Feature Matrix)
(1)>Initialisation:CFM=CurrentFM,NCFM=NULL;
(2)WHILE(CFM≠NULL) {
(3)gtr=CFM.FIRSTROW;
(4) IF(gtr∈{GTR> | >Comply withStatus}) {
/* 如果gtr属于GTR集合*/
(5)NCFM.ADD_ROW(gtr);
(6) }
(7)CFM.REMOVE_ROW(gtr);
(8) }
(9)RETURNNCFM;
图2中描述了电力业务信息系统进行特征筛选的过程,在进行HFS之初,当前矩阵Current Matrix为整个原始的FM矩阵;在①检测阶段,HFS分析出结果分析模式RP值为“ERR”,对应的矩阵编码为“C101”,则通过FM Selection Tree的第一层筛选出了与其对应的子矩阵为满足{TCR|CF(RP)=C101}的子矩阵集合,图中4个子矩阵A、B、C、D均属于新的当前矩阵所包含的子矩阵;第②和第③阶段,子矩阵A和D被过滤掉;第④阶段结束后,HFS得到最终的当前矩阵,原来的4个子矩阵中仅有C保留下来进行后续的SQL注入渗透测试。通过上述方法进行多层特征筛选可获得精简优化过的测试用例集合,假设平均每个特征包含n个特征值,那么在效率方面的提升近似为nm倍,而m则是在动态测试过程中获取到有效信息并进行特征过滤的特征数量。
3 实验及结果分析
3.1 实验实现
为了能够验证本文所述方法在电力业务信息系统场景下的有效性,我们基于启发式的特征筛选算法HFS开发了自动化的SQL注入漏洞渗透测试工具SQLFinder,其开发环境为“Visual Studio 2010+.net 3.5+C#”,图3为SQLFinder的流程。
图3 SQLFinder流程
首先通过信息收集模块收集输入信息,包括FM信息文件、用户设置信息和注入点URL信息等;然后随着检测的进行,利用启发式特征筛选HFS获得CurrentMatrix,并逐行遍历获得TCR以生成测试用例和进行检测控制;之后发送测试请求并分析保存其响应结果。此时,若完成所有TCR的检测,则分析最终结果并结束检测;若是有未完成的TCR,则返回CurrentMatrix并对下一条TCR继续进行检测,从而形成总体循环A,使得程序可以自动化完成SQL注入渗透测试。另外,在选择下一条TCR之前,程序会对收集的信息进行判断。一旦发现新的目标特征值,程序会返回到信息收集和特征筛选阶段,根据当前测试的实时反馈信息动态更新TCR的特征值,并通过特征筛选算法重新筛选有效子矩阵,并替换当前测试矩阵CurrentMatrix,该矩阵会被用于后续的SQL注入漏洞检测,从而构成了循环B。循环B使HFS通过逐步缩小测试用例规则集合的范围来降低不必要的冗余,提高测试的针对性,从而提高对电力业务信息系统的SQL注入漏洞渗透测试的准确性和检测效率。
3.2 实验环境和测试数据集
在本文中,我们选择两个著名的SQL注入渗透测试工具进行对比,SQLMap[15]和WVS Acunetix[16]。其中SQLMap是一款知名的开源SQL注入测试工具,它也被誉为目前世界上最优秀的免费SQL注入工具。WVS Acunetix是一款著名的商用Web应用安全测试工具,它也是目前使用率较高的一款商用工具。这两款工具是自动化SQL注入渗透测试工具的代表。本文将这两款测试工具表示为工具A和工具B(没有特定的顺序),并且设置为最高级检测模式进行测试。
本文选取的测试数据集包括3个部分,如表1所示,其包括知名开源漏洞评估系统Wavsep[17]、模拟电力业务信息系统环境的漏洞评估系统VulWeb和共计约30 000条真实的动态页面URL(real internet websites,IW-R)。
表1 测试数据集信息
Wavsep(the web application vulnerability scanner eva-luation project)是在“PHP 5+MySQL 5”环境下开发的知名公开数据集,其包含1067条URL、1080个注入点,以及人工植入的135个不同的SQL注入漏洞页面,其可被用于评价Web应用漏洞检测工具的综合检测能力。VulWeb是模拟电力业务信息系统环境搭建的漏洞扫描工具评估系统,其中包含了电力业务信息系统中常见的多种用不同类型的SQL注入漏洞。IW-R分为两部分IW-R1和IW-R2,其中IW-R1是由10个存在安全漏洞风险的Web系统抓取出的1992条URL,而IW-R2是由10个经过严格的安全措施加固过的业务信息系统抓取出的28 513条URL,共有7983个注入点,IW-R可评测出扫描工具在真实环境下的扫描能力。
3.3 实验结果和分析
为了能够对本文所述方法进行评估,我们从以下两个方面对其进行实验:准确度(Accuracy)和效率(Efficiency)。检测的准确度可从覆盖度(Coverage)和误报FP(False-Positive)来进行评估;关于检测效率,在SQL注入渗透测试应用过程中,由于网络延迟的存在和Web应用负载能力的限制等方面原因,对整体检测效率和时间影响最大的是发送的HTTP请求数量,因而通过平均HTTP请求数量#AveRqst(average HTTP requests number)进行效率评估。本实验的最终结果数据见表2。
表2 实验数据详细信息
覆盖度(Coverage)描述了检测工具检出漏洞的能力,其可通过召回率RCR(re-call rate)表示,如式(1)所示
(1)
其中,#VDV是发现的有效漏洞数量(valid discovered vulnerabilities number),#REV是实际存在的漏洞数量(real existing vulnerabilities number)。误报(FP)则表述的是检测工具扫描出的虚假漏洞,即错误的扫描结果,误报可通过误报率FPR(false-positive rate)来描述,如式(2)所示
(2)
其中,#TDV为发现的漏洞总数(number of total disco-vered vulnerabilities),#TIP为注入点总数量(number of total injection point)。从表2我们可以看出,SQLFinder检测出的有效漏洞数量#VDV为187,高于工具A和工具B的157和153个。从图4可以看到SQLFinder在植入漏洞的数据集中具有更高的召回率RCR,并且具有更低的误报率FPR。
图4 召回率和误报率对比
对于检测工具的检测效率,可以通过平均请求数进行评价,SQLFinder的总体平均请求数分别为工具A和工具B的7/10和3/10。并且SQLFinder的平均请求数随着数据集变化逐渐变小并趋于平缓,其中VulWeb所包含的漏洞比例为100%,而SQLFinder对其检测的平均请求数高达203,而随着数据集中漏洞比例减小,正常页面比例的增加,其平均请求数逐渐平稳至86。由此可知,SQLFinder的检测效率随着正常页面的比例增加而提高,这更为符合电力业务信息系统的实际情况。其它两种工具的平均发送请求数比较平稳,保持在平均110和280左右浮动。SQLFinder的检测效率在整体上要优于工具A和工具B,并且更加适用于在电力信息系统中存在大量数据及页面的情况下进行SQL注入漏洞渗透测试。
4 结束语
本文提出了一种基于特征的电力业务信息系统SQL注入漏洞自动化检测方法,首先基于电力信息系统的特点建立了其注入漏洞安全特征矩阵模型FM,由FM可得到覆盖度更高的测试用例规则TCR集合,通过启发式的特征筛选HFS算法将TCR中相匹配的特征进行动态筛选,获得精简和优化的TCR集合,实现了一种基于特征的电力信息系统启发式渗透测试方法。最后为实验部分,阐述了基于本文所述方法所设计的原型系统SQLFinder,给出了其在包括模拟电力业务信息系统环境的多个安全漏洞测试数据集上的测试数据,并与其它知名渗透测试工具进行了比较和分析。实验结果表明,本文所述方法可在保证整体检测效率的前提下,有效提高对电力信息系统中SQL注入漏洞渗透测试的覆盖度和准确度。