《注入类漏洞检测方法研究.docx》由会员分享,可在线阅读,更多相关《注入类漏洞检测方法研究.docx(11页珍藏版)》请在优知文库上搜索。
1、注入类漏洞是软件漏洞中最为常见的一类,也是信息安全领域的一个研究热点。本文首先以SQL注入漏洞和命令注入漏洞为例,阐述注入类程序漏洞的原理、分类和危害,介绍注入类漏洞的起始点、爆发点、传递链等概念;其次从代码安全扫描的角度分析传统源代码扫描方法的弊端和局限性,提出复合扫描引擎的概念,并详细阐述其原理和优势,针对不同引擎漏洞库之间差异大的问题,从注入类漏洞的特点出发设计解决算法;最后对未来研究可能面临的挑战进行展望。一、注入类漏洞的原理所谓注入类漏洞,是指软件不加识别地运行了恶意用户(也称“黑客”)精心设计的输入内容,导致系统运行错误,或泄露客户信息的一种漏洞。这类漏洞主要是由系统对用户输入的盲
2、目信任引发的。注入类漏洞主要包括:SQL注入、命令注入、XSS注入、XML注入、XPATH等类型。下面以最典型的SQL注入和命令注入为例,列举两个注入类漏洞案例,并分析说明其原理。1.SQL注入漏洞SQL注入漏洞,简单地说就是利用程序代码漏洞,绕过程序的权限,将SQL命令插入用户请求的查询字符串或者输入域进行攻击,其结果轻则获得敏感信息和数据,重则能够控制服务器。SQL注入漏洞的利用方式有直接注入和二次注入两种,前者是直接将代码插入用户输入变量中,该变量与SQL命令串联在一起,故称之为直接注入;后者是将恶意代码注入字符串中,该字符串存储于数据库表中,待程序读取该库表字符串的值时,被连接成动态S
3、QL命令并执行恶意SQL。下面是一个直接注入SQL漏洞的例子。以下代码动态地构造并执行了一个SQL查询,该查询可以搜索与指定客户名称相匹配的交易记录。假设有如下C语言代码段:ReceiveJnput(&szCUSTOM_NAME);接收用户输入的查询条件一注入点sprintf(szSQL,sizeof(szSQL),“select*fromTABLE_TRANSACTIONwhereCUSTOM_AME=%sSZCUSTOMNAME);拼接SQL语句Execute(SZSQL);执行SQL语句爆发点上述代码的逻辑是:接收用户在界面输入的姓名,将其作为查询条件拼接到SQL语句中,再在数据库中完成
4、查询操作。正常情况下,当用户输入客户名称“David”时,拼接成的SQL语句为:select*fromTABLE_TRANSACTIONwhcreClJSToM_NAME=David;此时程序将产生正确的输出。但是当这段代码被黑客攻击时,如果黑客输入的内容为:,;select*fromTABLE_TRANSACTIONwheret=,1那么拼接成的SQL语句将变为:select*fromTABLE_TRANSACTIONWherCCUSToM_NAME=,;select*fromTABLE_TRANSACTIONwhere,=,;这样一来,将会有两条SQL语句被执行,虽然前一条SQL语句是安全
5、的,但后一条却可以查询出库表中的所有记录,从而导致严重的信息泄露。在这个例子中,程序从用户输入信息中获取了SZeS加忆,以啰字段,在未经过滤的情况下,将其值直接以字符串拼接的方式拼接到一个SQL语句中,造成了SQL注入漏洞。在这段程序中,直接从用户输入内容获取信息的代码行ReCeiVt(&szCUSTOM_NAME)称为这个SQL注入漏洞的注入点。执行危险SQL语句的代码行EXeCUte(SZSQD称为这个SQL注入漏洞的爆发点。从注入点到爆发点之间,所有涉及危险字符串SZaS微达M/信息赋值的语句,称为这个SQL注入漏洞的传递链。2 .命令注入漏洞命令注入漏洞是指通过提交恶意构造的参数破坏命
6、令语句的结构,达到非法执行命令的目的。命令注入漏洞常发生在有执行系统命令的Web应用中。下面举一个命令注入漏洞的例子。以下代码在服务器上动态地为用户建立专用目录,路径名是用户输入的客户名称。假设有如下PHP语言代码段:$customName=$POSTcustomName”;接收用户输入注入Scommand=mkdir/home/application/custom_Directory”.$customName;拼接命令system(Scommand);执行危险命令爆发点、其功能是接收用户输入的客户名称,然后在后台建立该客户专属的文件路径。正常情况下,当用户输入客户名称“David”时,执行命
7、令:mkdirhomeapplication/custom_Directory/David但是当被黑客攻击时,如果黑客输入的内容不是客户名称,而是如下字符串:那么拼接而成的命令变为:mkdirhomeapplication/custom_Directory;rm-rf/运行后将删除后台所有文件。如此看来上述代码存在很大风险。在本例中,同样涉及注入点、爆发点、数据流的概念。从用户输入信息获取CustomNamc的代码行$CUStomNamC=$POSTcustomNamc称为这个命令注入漏洞的注入点。执行这个危险命令的代码行SyStCn1($COmmand)称为这个命令注入漏洞的爆发点。从注入点
8、到爆发点之间,所有涉及危险字符串CUStOmNamC信息赋值的语句,称为这个命令注入漏洞的传递链。从以上两个例子可以看出,注入类漏洞的本质是黑客通过引号、分号、斜杠、点号等特殊字符,闭合了原有的程序逻辑,使得用户提交的参数和程序本来的逻辑相互干扰。这样一来,黑客提交的参数就不仅起到参数的作用,而且还进入程序逻辑中。黑客就是通过这样的方式,把恶意代码嵌入正常代码中。3 .漏洞分级根据注入类漏洞的可利用性和危害性,目前业界一般将其分为以下三类。(1)高危漏洞指可以直接被利用的漏洞,并且利用难度较低。这类漏洞被利用后可能对网站或服务器的正常运行造成严重影响,对用户财产及个人信息造成重大损失。(2)中
9、危漏洞指利用难度极高或需要满足严格要求才能实现攻击的漏洞,或漏洞本身无法被直接攻击,但能为进一步攻击起较大帮助作用的漏洞。(3)低危漏洞指无法直接实现攻击,但可能造成一些非重要信息泄露的漏洞,泄露的信息可能让攻击者更容易找到其他安全漏洞。二、传统的源代码扫描方法及弊端IT技术日新月异,各种新型开发技术中的注入类漏洞也随之发生变化,漏洞攻击的领域已经由传统的网络和系统层面上升到了应用层面,近期,越来越多的应用系统面临此类攻击威胁。为减少应用系统的风险隐患,避免软件代码编写中可能出现的安全漏洞,提高应用系统自身安全防护能力,软件开发者越来越依赖安全扫描工具去帮助快速查找、定位、修复和管理软件代码安
10、全问题。源代码安全扫描的主要价值在于能快速、准确地查找、定位代码中存在的安全风险,从而提高软件产品的安全性和可靠性。目前,源代码安全扫描主要包括抽象语法树(AST)扫描、正则匹配扫描、数据流路径扫描三种。市场上的源代码扫描工具多达数十种,主流的包括RIPS、VCG.FortifySCA等。源代码扫描的原理和工具不是本文的重点讨论内容,但可以明确的是,每种扫描原理和工具都有自己的侧重点,也都存在一定的误报率和漏报率,所以仅使用一种扫描工具难以保证检查结果的准确性和完整性。此外,由于目前市场上的软件应用系统规模日益庞大,源代码安全扫描的工作量持续增加、复杂度不断提高,通过手工执行扫描操作过程繁琐、
11、效率低下,非常不利于软件质量管理,因此迫切需要提高代码扫描的自动化程度,减少手工操作步骤,提高工作效率。三、注入类漏洞的检测方法1.复合扫描引擎为了解决上述问题,可将多种不同扫描工具集成起来对同一份代码进行扫描,即复合扫描引擎。这样做有两个好处:一是提高检查结果的质量。通过整合多个引擎的分析结果,实现互相验证,提升缺陷检出结果的准确性和完整性。二是提高工作效率。将不同的扫描工具实现集成,相比于先后操作多种工具,并对多份结果进行人工筛查,可以规避很多繁琐的操作,从而提升工作效率。通过复合扫描引擎系统进行源代码扫描的总体方案如图1所示。扫描引擎1扫描引擎2统一调度模块扫描引擎N-集成审计模块一结果
12、合并模块图1通过复合扫描引擎系统进行源代码扫描的总体方案2.集成方法搭建复合扫描引擎系统需要将多个单独的扫描工具集成起来,具体分为三个方面:一是将多个扫描工具的界面进行集成,实现统一调度界面、自由选择调起任一引擎发起扫描;二是漏洞库的集成,需要将不同扫描工具的漏洞库整合成统一的漏洞库;三是将多个引擎的扫描结果合并,实现缺陷的集成审计,减少登录多个引擎分别查看结果、分别排除误报等工作的工作量。这三方面集成工作的主要方法如下。(D界面的集成界面的集成本质上是开发一套界面来操作多个工具,主要涉及一些软件工程、应用界面设计方面的工作,在此不作赘述。(2)漏洞库的集成漏洞库的集成主要靠人工的方式开展。在
13、所有扫描工具中,扫描结果都会显示漏洞类型和规则,所以每种工具涵盖的漏洞库都是公开、可读的,并且每种工具能够扫描出的漏洞种类数量有限。因此,软件信息安全的研究人员可将每种扫描工具的漏洞规则对应起来。例如,在不同扫描工具的漏洞库中,SQL注入的漏洞命名通常是SQLInjection;命令注入漏洞在某些工具中被称为CommandInjection,而在另一些工具中被称为ReSOUrCeInjeCtion。可由精通信息安全的专业人员通过阅读漏洞说明将这些漏洞规则对应起来,将其形成一个漏洞库。(3)扫描结果的集成下面介绍一套可完成两个扫描结果集成的算法。如前所述,每个注入类漏洞在代码中均存在注入点、爆发
14、点两个代码位置。对于甲、乙两种扫描工具扫描出的结果一一漏洞A、漏洞B,如果A和B在每种扫描工具上识别出的注入点、爆发点相同,且识别出的漏洞类型也相同(这个判断依赖于漏洞库的集成),那么便可认定A和B为同一个漏洞,在集成结果中以一条漏洞结果显示。上述算法可用以下伪代码描述:获取源代码;用工具甲扫描源代码,得到扫描结果甲:result1;用工具乙扫描源代码,得到扫描结果乙:result2;遍历扫描result1中的所有漏洞条目获取resultl中,当前漏洞条目A;遍历扫描result2中的所有漏洞条目获取result2中,当前漏洞条目B;if(A.注入漏洞类型=B.注入漏洞类型&A.爆发点=B.爆
15、发点、&A.注入点=B.注入点)then将漏洞条目A写入集成扫描结果:result_final通过这种方式,所有集成扫描结果result_final中的漏洞条目,均为经过甲、乙两种扫描工具确认的漏洞,从而大幅降低了误报率。对于只被工具甲或乙中的一种工具扫描出来的漏洞,可以通过人工判读的方式,识别其到底是否为确定性的漏洞,避免漏报漏洞。四、总结与展望本文通过两个实例,介绍了注入类安全漏洞的原理、严重性和广泛性,从安全测试的角度提出基于复合引擎的自动化代码安全检查系统的构建方法,并阐述了其优势、原理和具体算法。笔者认为,未来,防范软件漏洞领域有七个研究方向:一是对软件进行二进制代码分析扫描;二是通过渗透测试发现漏洞;三是综合利用白盒和黑盒技术进行漏洞分析;四是结合人工智能算法进行分析;五是对laaS、云平台等业界的新技术、新架构进行漏洞分析;六是对开源软件进行漏洞分析;七是及时跟踪CVECWEOTyASP等主流信息安全组织发布的漏洞库。