SQL注入漏洞检测技术综述

2020-05-12 12:02黄小丹
现代计算机 2020年10期
关键词:测试用例源代码漏洞

黄小丹

(四川大学计算机学院,成都610065)

0 引言

SQL注入常用于攻击Web应用程序,攻击者的输入值被传输到程序中的数据库中执行查询语句,从而形成SQL代码[2]。利用程序中存在的SQL注入漏洞并插入恶意SQL代码,可以绕开身份认证,窃取用户信息或篡改数据内容等,引发严重后果。OWASP(Open Web Application Security Project)在2017年发布的一份安全调查中,SQL注入类漏洞(SQLIV)仍被列为2017年十大Web应用程序漏洞之一,且位居榜首[3]。安全测试是Web应用程序生命周期的重要步骤,有效的测试技术可以尽早检测出程序的SQLIV,降低软件开发的相关成本。因此,人们提出了许多用于检测SQLIV的测试技术,包括静态测试、动态测试、渗透测试、模糊测试等。目前有关SQL注入的研究工作主要聚焦于SQL注入攻击的实时检测和防御技术。本文就SQL注入形成原因以及攻击的主要方式有哪些、SQL注入漏洞检测方法及一般检测流程是什么等问题进行调研,并按照测试技术和测试流程对近几年检测SQLIV的技术进行分析。本文采用系统文献综述方法,全面调研SQLIV检测相关研究,目的是从测试角度清晰划分用于检测SQLIV的技术,归纳现有的研究,并展望其未来发展趋势,以便安全测试人员根据不同测试目的和需解决问题,选择与研究相关检测技术。

1 研究方法

系统文献综述(Systematic Literature Review)是一种基于文献的系统化总结和分析方法,需要收集并综合某具体研究问题的成果。本文采用此方法分析和总结了近10年常用的SQL注入漏洞检测相关技术。

(1)研究问题的提出

问题1:SQL注入漏洞的产生原因及注入方式是什么?SQL注入漏洞的产生一般是由于代码编写不规范造成,具体而言,哪些编程实践容易造成SQL注入?另外,SQL注入方式多种多样,常见的方式有哪些?

问题2:用于SQL注入漏洞检测的技术有哪些?根据是否检测被测程序的源代码,可分为白盒方法和黑盒方法,分别分析白盒、黑盒中一些常用的SQL注入漏洞检测技术。

问题3:SQL注入漏洞的一般检测流程,以及流程各阶段常用的检测技术是什么?该问题主要分析SQL注入漏洞检测的流程,各阶段需要解决的问题,以及解决这些问题常用的检测技术。

(2)文献检索策略

本文文献调研的数据来源于Web of Science、IEEE、ACM、CNKI等数据库,检索工具采用百度和BING 等搜索器,检索词包括“SQL injection”、“Security testing”、“SQL 注入”、“安全测试”等关键字,检索发表时间从2008年到2019年的文献。对于检索结果,采用人工方式,根据文献题目和摘要等,确定其是否与SQL注入检测主题相关。在此基础上,进行人工检索,采用“滚雪球”方法,基于文献的参考文献进行进一步检索。

(3)文献筛选与分析

选取每个数据库检索结果的前200条记录,按照去重复、去短文、去海报等原则对文献进行筛选,最终从检索到的9911篇论文中筛选出内容相关性较强的471篇论文,用于文献计量分析。通过分析,图1(a)展示了2008年到2019年有关SQL注入相关文献的发表情况;图1(b)展示了SQL注入相关文献中SQL注入漏洞检测、攻击检测或预防、综述等类别文献的占比情况,其中SQL注入漏洞检测相关内容的文献共计181篇,占比38%,是SQL注入相关研究的关注热点。然后从内容、文章级别、引用量等方面考虑,入选了具有代表性的SQL注入漏洞检测相关文献共计40篇进行文献综述,其中包括SCI级别论文5篇、A类论文6篇、B类3篇、C类9篇、中文核心2篇等。按照SQL注入产生原因、方式,SQL注入漏洞检测流程及方法分别提取文献中的相关内容,回答提出的研究问题。

(4)研究结果报告

对入选的相关文献进行分类、分析和总结,回答提出的研究问题,即SQL注入的漏洞产生原因和注入方式、检测流程及常用的检测方法,归纳本领域研究的主要问题,展望未来的研究方向,为领域研究学者提供参考。

2 SQL注入原因和方式

2.1 SQL 注入漏洞成因

SQL注入产生的实质是因为恶意代码被伪装成正常的输入数据,与输入命令拼接在一起,成为可执行命令,提交到服务器的数据库。其漏洞产生原因主要是由于编程人员Web安全知识不足或缺少安全编程经验,编写的代码不完善,

(1)不恰当地使用API操作数据库[9]:数据库API方法用于连接数据库,指定的数据库操作与URL或POST中的查询字符串可进行拼接,这就允许程序员在连接中执行合法或非法查询,可能造成SQL注入。

(2)缺乏有效的输入验证和过滤机制[36]:应用程序在没有适当地验证和过滤用户提交的数据的情况下,直接使用用户提交数据与数据库中常规SQL语句进行拼接,构造数据库查询或操作语句,从而引起SQL注入。

2.2 SQL 注入方式

对程序进行SQL注入攻击,以检测程序本身漏洞时,根据构造SQL语句的不同,可划分不同的注入方式[12,28]。

(1)同义反复:主要目标是将恶意代码插入到多个条件语句中,使SQL语句的条件子句部分总是为真,致使原条件失效,主要用于绕过身份验证。例:

图1

由于'1'='1'总是为真,将输出accounts表中所有记录。

(2)逻辑错误查询:向被测系统提交错误的SQL语句,致其返回错误信息,通过分析报错可获得系统内部信息。例:

从元数据表sysobjects中查询用户表xtype='u',并转换为一个整数,系统会因为非法的类型转换而抛出错误,根据错误信息可确定数据库类型为SQL Server。

(3)联合查询:通过在 SQL查询语句中加入“UNION”的求并集子句,可以获得额外信息。例:

由于不存在login等于''的记录,第一部分返回空集,而UNION部分将查询出卡号为003的人的重要信息。

(4)复合查询:使用分号“;”将不同的SQL查询、插入、删除等操作连接到原始查询,以执行数据。例:

执行分号后的语句会删除表users,从而破坏重要信息。

(5)存储过程:存储过程包含参数,在参数传递过程中可能存在SQL注入。例:

该存储过程返回值为true或false,当插入参数为'';SHUTDOWN;'',将导致数据库关闭。

(6)推理:构造条件互相对立的SQL语句,通过观察、收集系统在对立条件下的不同反应获得系统内部信息,可分为条件盲注和时间盲注。例如条件盲注:

提交第一个查询语句,应用程序会返回错误消息,但无法确定是因为应用程序验证输入后阻止了攻击,还是因为条件1=0导致了错误。然后提交第二个查询(恒为真),如果没有错误消息,即说明程序未阻止攻击,存在注入。

(7)编码替换:利用ASCII编码、十六进制编码、HTML编码等方式转化输入形式以躲过防御和过滤机制。例:

如果程序未识别ASCII码并过滤,数据库将执行SHUTDOWN命令。

3 SQL注入漏洞检测方法

在安全测试中,检测SQL注入漏洞指对被测程序进行测试,以发现程序本身的漏洞。按照是否分析被测程序源代码,可将检测方法分为白盒和黑盒两类。根据计量分析,图2表示了SQL注入漏洞检测相关文献中用到检测方法的占比情况。

图2 SQL注入漏洞检测方法分类占比

3.1 白盒方法

白盒技术通过分析被测程序源代码,采用静态或动态检测方式发掘程序代码中可能存在的SQL注入漏洞。静态分析技术是用于SQLIV检测的白盒方法之一,如,DEKANT工具[39]结合静态分析与机器学习,使用序列模型(源代码指令),学习一组带注释的源代码片的漏洞特征,可识别源代码中的漏洞。常用的白盒技术包括:数据流分析、污点分析、符号执行、约束生成和求解等。

(1)数据流分析

获取相关数据在应用程序中的执行路径,分析执行路径上的数据流动和可能取值。基于数据流分析,工具SQLInjectionGen使用AMNESIA和字符串参数检测,跟踪用户输入到应用程序代码中的一个脆弱点,从而发现SQL注入漏洞[20]。

(2)污点分析

动态污点分析通过标记污点数据并跟踪污染数据流传播,以发掘源数据与结果数据的关系,来检测漏洞。Kieyzun等人[31]使用污点分析来识别流入SQL语句的无效输入,以达到检测目的。文献[35]提出一种在Java虚拟机中的动态污点分析方法,结合静态分析技术,收集可访问的污染流,减少了运行时开销。

(3)符号执行

符号执行把程序执行时的具体变量替换成符号值,来模拟每个路径的执行情况,执行结果被整合成多条数学表达式,通过对表达式求解,就能获得到达该结果的路径。在漏洞检测中一般将漏洞产生条件设置为执行结果。SAFELI[10]是2008年基于Java Web应用程序的SQL注入扫描器,为早期将符号执行应用于Web安全提供了一个概念。文献[14]首先将代码转换为抽象语法树;然后使用符号执行技术模拟程序的实际执行,并进行程序间分析来检测漏洞,能够识别出PHP的Web应用程序中的SQL注入漏洞。

(4)约束生成和求解

许多程序的自动测试、分析和验证技术可以有效地简化为约束生成阶段,然后是约束求解阶段。这种关注点的分离通常会使测试更加有效。Hampi[41]通过使用正则表达式、上下文无关语法、字符串术语之间的等式以及典型的字符串操作(如连接和提取子字符串)来指定约束,查找Web应用程序中的SQL注入漏洞。

白盒技术的优势在于其基于源代码,覆盖率高;在程序的开发和编码阶段就能检测程序安全性,可以及时发现漏洞并进行修复,减少成本。但实际情况中可能无法获取到程序源代码,因此可用性不高;同时,覆盖源代码的复杂度高,路径不可达时白盒无法确认漏洞。

3.2 黑盒方法

黑盒技术无需了解目标系统源代码和数据库的结构,在提交测试用例后,通过直接分析返回的结果,判断是否存在漏洞,常用于SQL注入漏洞检测工具的研究[5,6,11]。在调研文献中,黑盒方法共92篇(53%),是最主要的SQL注入漏洞检测方法。文献[16]设计的黑盒检测工具,实现了三种不同的SQL注入漏洞检测技术:改进的渗透测试、攻击签名和接口监视、运行时异常检测。

渗透测试常使用黑盒技术,指在可控范围内采用非破坏性的方法,发现目标程序中存在的漏洞和威胁。通常采用爬虫方法收集页面信息,查找注入点,然后持续构造测试用例测试目标系统,逐步深入地挖掘出系统漏洞。通常渗透测试需要根据程序的安全级别(如有无防火墙)[40]、攻击类型(如盲SQL注入和基于错误信息的SQL注入等)[19]采取不同的策略。

模糊测试也属于黑盒方法,常用于安全测试,测试过程中向被测程序提交大量异常的、包含攻击向量的测试数据,并监测被测程序行为,判断是否存在安全漏洞。其本质是是向输入中加入噪音,以混淆目标程序判断力。它不需要关注被测系统的内部实现细节,具有较好的可复用性,但可能存在生成的有效测试数据不足、输入空间较大造成冗余、难以精确定位漏洞位置等问题。在SQL注入漏洞检测的应用上,文献[38]通过对Web服务漏洞采用优化分组的模糊测试技术,解决了异常数据生成效率低的问题,提高了漏洞检测的效率以及准确率,可用于检测SQL注入漏洞。文献[25]将模糊测试与进化算法结合,以基于词汇和语义结构的适应度度量为指导,减少了测试用例的搜索空间。

黑盒技术无需获取源代码,相比白盒测试更为简单;在程序运行环境下,通过模拟攻击者行为实施漏洞利用,可提高准确性。但其有效性和准确性很大程度上又受限于测试用例生成与断言[27],同时,黑盒测试无法明确测试有效性程度和何时结束测试。

结合白盒与黑盒,即静态代码分析与动态运行时监测相结合的方法,能够在一定程度上改善漏洞误报率的问题,提高覆盖率,在系统可靠性上也有很大的改观。文献[7]采用动静结合,使用污点分析和模糊测试技术,实现了对二阶SQL注入高精度、低误报的检测效果。但动静结合方法的有效性依赖于测试中的输入值和对源代码的观察。为了提高分析的有效性,程序必须在有足够测试输入的情况下执行。

4 SQL注入漏洞检测流程

SQL注入漏洞检测的一般流程是:首先确定被测目标程序,在信息收集阶段,确定被测程序有哪些可注入点;然后,在测试用例生成阶段使用某些技术生成SQL注入测试用例;在执行阶段,执行生成的测试用例并监控目标程序;最后,结果分析阶段需要根据监测或被测程序响应来分析检测结果,确认被测程序是否存在SQL注入漏洞。检测流程如图3所示。

图3 SQL注入漏洞检测一般流程

根据检测流程划分,SQL注入漏洞检测的相关研究主要集中在信息收集、测试用例生成以及结果分析的方法提出和改进,主要目的是提高测试充分性、准确性以及测试效率。

4.1 信息收集

信息收集,指收集被测程序的各项信息,如脚本语言类型、服务器类型、数据库类型、链接页面、输入域等,以确定程序的可注入点。信息收集阶段是发现漏洞的第一阶段,其完备性对漏洞检测的精度有很大影响。在这一阶段,Web爬虫技术非常流行,能够快速提供关于Web应用程序的信息,但需要解决的主要问题是提高覆盖率、链接去重、提升效率等。例如,使用广度优先搜索(BFS)的爬虫算法提高覆盖率[1],隐式爬虫将身份验证与爬虫结合,以提高数据完整性[22]。除爬虫外,William等人[33]通过实验表明,基于源代码的信息收集方法,可以更彻底地运行主体应用程序和发现漏洞。

4.2 测试用例生成

良好的SQL注入测试用例生成技术能够提高覆盖率和检测速率。本文介绍以下几种常用于SQL注入的测试用例生成技术。

(1)机器学习

机器学习技术是研究和构建能够学习和预测数据的算法,通常需要提供大量数据,并进行分析,构建模型进行数据驱动的预测或决策,具有灵活性和可伸缩性。与SQL注入相关的机器学习技术,目前大量研究集中在SQL注入攻击的检测以及预防[4,23,32]。在测试用例的生成上,文献[37]根据自定义语法生成一套测试数据,采用机器学习技术学习可绕过和不可绕过防火墙的测试用例特征,并根据特征有效的选择测试用例或产生更多测试用例绕过防火墙,能够检测防火墙中的SQL注入漏洞。基于学习的漏洞检测技术在检测之前需要经过数据预处理和训练阶段,会导致计算开销。同时,缺乏自适应能力,不确定性和模糊性也是是机器学习应用中存在的问题。

(2)基于模型

基于模型的测试指为被测程序(SUT)建立高级模型,并自动派生出测试用例和预期结果,执行根据所建模型生成的测试用例并对比实际结果与模型指定结果,从而验证是否存在漏洞[15]。文献[30]提出的规划模型,使用规划域定义语言(PDDL)描述,将计划的调整添加到模型中,有助于生成更广泛的测试用例,提升XSS和SQL注入漏洞检测效果。链式攻击方法[18]是Alberto等人提出的一种基于模型测试的方法,其生成的抽象测试用例包含组成一系列链式攻击(即利用被测程序漏洞的一系列攻击)的操作,适用于不同的攻击规则,但可能产生误报。基于模型的方法,优势在于提高了测试自动化程度,但仅能覆盖模型中已指定的测试点,而没有建模的内容可能无法被测试到。

(3)搜索技术

搜索技术应用于测试用例生成,即把生成问题转化为进化、搜索问题,采用进化算法使测试用例逐渐成为符合指定目标的用例。常用的搜索技术包括遗传算法、蚁群算法等。基于搜索的测试典型目的是最大化覆盖率,而在SQL注入漏洞检测中,其目的是找到漏洞[34]。文献[8]基于搜索技术,使用遗传编程,能够根据SQL语法生成多种类型的恶意SQL查询语句,但需要降低测试用例中的语法错误率。基于搜索技术生成测试用例,具有普遍适用性,但如何确定其适应度函数使进化效果更优是目前最主要的难点。

(4)变异技术

变异技术用于测试用例生成可分为两类,一类是对测试输入进行变异,使测试用例更充分,具有更好的检测能力。Appelt等人[29]设计了一组变异算子(包括行为改变、语法修复和混淆三类),然后使用不同变异算子的组合,生成包含攻击的输入,从而增加了检测出SQL注入漏洞的可能性。另一类是对源代码进行变异,通过杀死更多的代码突变体来使测试用例更有效。Shahriar等人[9]将变异应用于应用程序的源代码,提出使用9个注入操作符,将错误注入SQL查询条件和数据库API方法调用中,并通过使用包含SQLIAs的测试数据杀死突变体来检测SQL注入漏洞。文献[21]结合这两类变异技术,把能够有效杀死突变体的用例作为原始测试用例,再对用例进行变异,提高了其覆盖率和效率。

4.3 结果分析

测试用例执行后,需要对结果进行分析以判断是否存在SQL注入漏洞,结果分析的准确度直接决定了漏洞检测的准确度,因此,此阶段主要目的是提高结果分析精度。在结果分析阶段,一般通过分析程序响应判断是否存在漏洞。页面比对算法常用于结果分析[17],但当程序不返回错误信息时该方法并不适用,例如SQL盲注。文献[19]基于推理蜕变测试,提出一组逻辑表达式和逻辑运算符,可用于推导程序上下文,检测出SQL盲注,并有效降低了测试结果的假阳性。另外,Nuno Autunes等人[24]通过比较SQL/XPath命令in和out攻击的结构,提出了一种检测SQL注入和XPath注入漏洞的测试精度改进方法。文献[33]提供了一种新的SQL注入响应分析方法,在将查询发送给数据库之前对其进行解析,以检查它是否是成功的攻击,如果是,则意味着攻击突破了防御,系统存在漏洞。

5 结语

本文主要回顾了近10年的SQL注入漏洞检测技术。研究的主要发现可以概括为:各类SQL注入攻击方式、SQL注入漏洞形成原因、基于不同测试技术以及测试不同阶段常用的SQL注入漏洞检测方法的详细调查报告,通过提供目前常用的检测技术来感知SQL注入方面面临的主要威胁和主要解决的问题。通过调查和总结发现:

(1)目前SQL注入漏洞检测是安全测试的一大热门研究问题,主要想解决的问题集中在如何有效地检测出Web应用中的SQL注入漏洞,减少检测结果的假阳性和假阴性,降低误报率以及提高检测效率上;

(2)如何结合多种技术,提高漏洞注入点的发现能力、测试用例的生成能力等,实现更具针对性、自动化程度更高的检测技术也是目前的研究重点;

(3)面对层出不穷的新型SQL注入攻击,如何发现和选择新的可用于此类攻击的漏洞检测技术,也在持续的研究过程之中。本文调查结果有助于相关人员针对检测中想解决的具体问题选择具体的方案并进行下一步的研究。

猜你喜欢
测试用例源代码漏洞
漏洞
基于TXL的源代码插桩技术研究
Evosuite和Randoop单元测试用例生成工具覆盖率对比分析①
Randoop 和Evosuite 生成测试用例的变异检测能力分析
侦探推理游戏(二)
保护好自己的“源代码”
解密别克安全“源代码”
漏洞在哪儿
视频、Office漏洞相继爆发
测试用例集的优化技术分析与改进