具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
参见图1,为本发明实施例提供的SQL注入攻击的识别方法流程图。该方法主要包括以下步骤。
S101:基于SQL词法语法分析,建立基于SQL语法元素及SQL语法字段的SQL注入特征库;
(1)词法分析
经过词法分析,可得到如下的SQL语法元素:
●标识符:诸如表、视图、列、数据库和服务器等对象的名称。
●数据类型:定义数据对象(如列、变量和参数)所包含的数据类型。大多数Transact-SQL语句并不显式引用数据类型,但是其结果由于语句中所引用的对象数据类型间的互相作用而受到影响。
●函数:语法元素,它可以有零个、一个或多个输入值,并返回一个标量值或表格形式的值的集合。函数示例包括将多个值相加的SUM函数、确定两个日期之间相差多少个时间单位的DATEDIFF函数、获取SQL ServerTM实例名称的@@SERVERNAME函数或在远程服务器上执行Transact-SQL语句和检索结果集的OPENQUERY函数。
●表达式:是Microsoft SQL Server可解析为单个值的语法单元。表达式的示例包括常量、返回单值的函数、列或变量的引用。
●运算符:与一个或多个简单表达式一起使用构造一个更为复杂的表达式。例如,将"-"(负号)运算符和常量12组合在一起得到常量-12。
●表达式:PriceColumn*1.1中的"*"(乘号)运算符使价格提高百分之十。
●注释:插入到Transact-SQL语句或脚本中解释语句作用的文本。SQL Server不执行注释。
●保留关键字:保留下来由SQL Server使用的词。数据库中的对象名不应使用这些字词。
(2)语法分析
经过语法分析,可得到如下SQL语法字段:
●字段:例如添加字段、修改字段、删除字段、查询字段等。
●命令:常用SQL命令非常多,例如,
(1)创建数据库命令:CREATE DATABASE database-name;
(2)删除数据库命令:drop database dbname;
(3)备份sql server:
创建备份数据:
device USE masterEXEC sp_addumpdevice'disk','testBack','c:mssql7backupMyNwind_1.da
开始备份:BACKUP DATABASE pubs TO testBack;
(4)创建新表:
create table tabname(col1type1[not null][primary key],col2type2[notnull],..);
(5)删除新表:drop table tabname;等等。
●表名:数据表的名称。
●条件:命令执行的条件。
上述步骤101是预先准备步骤。由于SQL语句不可能穷尽,因此对SQL语句的学习也不可能穷尽。为了后续匹配的准确性,SQL注入特征库的学习样本越多越好,并且优选可以定时更新,这样构建的SQL注入特征库足够丰富,且能应对最新的SQL注入变型。其中,SQL注入特征库是由多条SQL注入规则构成的,其中每条SQL注入规则都是基于学习的SQL语法元素及SQL语法字段设置的。
S102:获取目标数据,对目标数据进行SQL词法语法分析,获取目标数据中包含的所有SQL语法元素及SQL语法字段;
其中,目标数据可以是指http协议的get消息或post消息,本领域技术人员了解,Http连接包括GET请求和POST请求。创建的步骤分别是:1、创建HttpGet(或HttpPost)对象,将要请求的URL通过构造方法传入HttpGet(或HttpPost)对象中;2、使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象;3、通过HttpResponse接口的getEntity方法返回响应信息。除了get消息或post消息,另外目标数据还可以是指通过cookie方式获取的数据,此外,还可能是指http协议消息的字段,例如http协议消息的refer字段或X-Forwarded-For字段。其中,X-Forwarded-For是http协议自带的字段,X-Forwarded-For机制是通过一层代理后记录一个IP。
S103:将所获取的目标数据中包含的所有SQL语法元素及SQL语法字段与所述SQL注入特征库进行匹配,如果匹配成功,则确定存在SQL注入攻击。
为了使本发明改进之处明显突出,下面对比介绍现有基于正则表达式的SQL注入攻击检测方案。
SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变SQL语句的原有逻辑和影响服务器端正常业务的处理。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP(Active Server Page,动态服务器页面)中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。
(1)整型参数的判断
当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:
select*from表名where字段=YY,
(2)字符串型参数的判断
当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:
select*from表名where字段='YY',
(3)特殊情况的处理
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。
现有基于正则表达式的SQL注入检测的过程为:当拦截到http请求后首先对内容进行URL解码,防止攻击者以URL编码方式构造SQL注入语句;检测请求数据中是否含有SQL注入攻击常用的关键字以及分隔符,如“select”、“and”、“;”、“--”等,如果不含有,则可以排除注入攻击的可能,如果有,则提交至下一步进行详细的规则检测;对于包含注入关键字的web请求,则便利规则库对请求内容进行详细的正则匹配。如果匹配成功,则拦截请求,向客户端发送警告并记录日志,如果匹配失败,则将请求字符串记录入可疑的攻击代码库,提交网站管理员分析。本领域技术人员都理解,基于字符匹配的正则表达式检测方案效率低下,为了一定程度提高检测效率,常常在编写正则表达式规则时,会设置字符检测的偏移量,例如仅检测整个数据的某段(例如前50个字符),假如SQL注入语句恰好发生在未检测的字段,则会导致漏报。
针对现有检测的上述问题,本发明对待检测的数据(例如get消息、post消息或者http协议消息的字段)的所有字段都进行SQL词法语法分析,得到所有SQL语法元素及SQL语法字段,这样不会出现漏检的问题。而且,通过SQL词法语法分析,对得到的SQL语法元素及SQL语法字段进行后续匹配,比单纯的对整个数据进行字符匹配效率会提高很多。
特别地,为了减少用户自己提交包含SQL语句而引起的误报,本发明针对post请求消息的方式进行了特殊处理。具体地,为SQL注入特征库中针对所述post消息的每一条规则设置权重;当所述post消息中包含的SQL语法元素及SQL语法字段与SQL注入特征库中的规则匹配成功,且所匹配规则的权重等于或高于权重阈值时,确定存在SQL注入攻击。也就是,针对post消息,如果仅匹配规则成功但是所匹配规则的权重较低(权重越低,表明越安全),则不认为是一个SQL注入攻击。这样就可以避免上述用户自己发帖导致误导的情况。对于此种情况,SQL注入特征库所包含的规则是由SQL语法元素及SQL语法字段构成的关键字组成的,并且为每条规则设置权重,权重越高表明越危险(SQL注入攻击的可能性大),反之,权重越低表明越安全(SQL注入攻击的可能性小)。
除了上述post消息之外,对于其他目标数据的方式(例如get消息、cookie或者http协议消息的字段),SQL注入特征库所包含的规则仍可以采用正则表达式的方式,只是是基于SQL语法元素及SQL语法字段的正则表达式。
下面以两个具体例子对应用本发明进行SQL注入识别进行说明。
例子1(针对漏报)
对于用户提交的数据:
“Aaaaaaaaaaxxxxxxxxxxxbbbbbbbbbbbbcccc select money from your_packagegsssssssssssssssssssss”
传统的检测由于性能的原因,不是对上面的整个字串进行匹配,而是截取例如前30个字符进行匹配,就会发现没有找到完整的SQL语句,从而导致漏报。
本发明采用的是,将上面的整体字串进行SQL词法语法分析,会得到如下相关数据:
命令:select;
查询字段:money;
数据表:your_package;
可见,SQL语句的所有相关结果已经全部解析到了,因此,不会出现漏报。
例子2(针对误报)
用户输入:
“Haaaaaaaaaaaaaaaaaaaaaaaaaaselectbbbbbbbbbbbbbbbbfromccccccyourpacket”
传统的检测:只会从数据中查找是否有“select”、“from”等关键字。
如上的数据里面有这些关键字,但是却不是一条SQL语句,那么就导致了误报。
通过本发明的SQL词法语法分析,那么上面的字符串不会被当成SQL语句,不符合SQL语句,因此也不会产生误报。
可见,本发明目的是提高识别SQL注入的效率、减少误报和漏报。具体方式是,对请求进行SQL词法语义分析,得到SQL语法元素及SQL语法字段,再将这些SQL语句解析结果与特征库进行模式匹配。由于不是对数据进行字符比对,而是针对特定的SQL语句解析结果进行有针对性的比对,因此提高了效率。此外,对数据所包含的所有SQL语句都进行了分析提取,从而可尽量减少漏报。此外,针对http的post请求,特别建立了由统计得到的SQL语句构成的特征库,并给每个条post相关的特征赋予权重值,对于post请求,将解析的SQL语句与自定义特征库进行比对,即使匹配,如果权重值较低,则认为不是SQL注入攻击。
与上述方法相对应,本放还提供一种SQL注入攻击的识别装置。该装置可以通过软件、硬件、软硬件结合的方式实现。具体地,该装置可以是指服务节点设备本身,也可以是指服务节点内部的功能实体,只要具备相应功能即可。
该装置包括:
SQL注入特征库建立单元,用于基于SQL词法语法分析,建立基于SQL语法元素及SQL语法字段的SQL注入特征库;
SQL语句分析单元,用于针对目标数据,对目标数据进行SQL词法语法分析,获取目标数据中包含的所有SQL语法元素及SQL语法字段;
匹配单元,用于将所获取的目标数据中包含的所有SQL语法元素及SQL语法字段与所述SQL注入特征库进行匹配,如果匹配成功,则确定存在SQL注入攻击。
可见,由于不是对数据进行字符比对,而是针对特定的SQL语句解析结果进行有针对性的比对,因此提高了效率。此外,对数据所包含的所有SQL语句都进行了分析提取,从而可尽量减少漏报。
特别地,为了尽可能减少误报,针对post消息的SQL注入识别进行了特殊处理。针对http的post请求,特别建立了由统计得到的SQL语句构成的特征库,并给每个条post相关的特征赋予权重值,对于post请求,将解析的SQL语句与自定义特征库进行比对,即使匹配,如果权重值较低,则认为不是SQL注入攻击。具体地,当目标数据是指http协议的post消息时,该装置还包括:
权重设置单元,用于为SQL注入特征库中针对post消息的每一条规则设置权重;
判断单元,用于当post消息中包含的SQL语法元素及SQL语法字段与所述SQL注入特征库中的规则匹配成功,且所匹配规则的权重等于或高于权重阈值时,确定存在SQL注入攻击。
对于此种针对post消息的改进方案中,SQL注入特征库所包含的规则是由SQL语法元素及SQL语法字段构成的关键字组成的。
此外,目标数据还可以是指http协议的get消息、cookie、refer字段或X-Forward-For字段,此种情况下,SQL注入特征库所包含的规则是基于SQL语法元素及SQL语法字段的正则表达式。
其中,SQL语法元素包括标识符、数据类型、函数、表达式、运算符、注释、保留关键字;SQL语法字段包括字段、命令、表名、条件。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的SQL注入攻击的识别装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明公开了:A1、一种SQL注入攻击的识别方法,包括:
基于SQL词法语法分析,建立基于SQL语法元素及SQL语法字段的SQL注入特征库;
获取目标数据,对所述目标数据进行SQL词法语法分析,获取所述目标数据中包含的所有SQL语法元素及SQL语法字段;
将所获取的所述目标数据中包含的所有SQL语法元素及SQL语法字段与所述SQL注入特征库进行匹配,如果匹配成功,则确定存在SQL注入攻击。
A2、如A1所述的方法,所述目标数据是指http协议的post消息,所述方法还包括:
为所述SQL注入特征库中针对所述post消息的每一条规则设置权重;
当所述post消息中包含的SQL语法元素及SQL语法字段与所述SQL注入特征库中的规则匹配成功,且所匹配规则的权重等于或高于权重阈值时,确定存在SQL注入攻击。
A3、如A2所述的方法,所述SQL注入特征库所包含的规则是由SQL语法元素及SQL语法字段构成的关键字组成的。
A4、如A1所述的方法,所述目标数据为http协议的get消息、cookie、refer字段或X-Forward-For字段,所述SQL注入特征库所包含的规则是基于SQL语法元素及SQL语法字段的正则表达式。
A5、如A1至A4任一项所述方法,所述SQL语法元素包括标识符、数据类型、函数、表达式、运算符、注释、保留关键字。
A6、如A1至A4任一项所述方法,所述SQL语法字段包括字段、命令、表名、条件。
B7、一种SQL注入攻击的识别装置,包括:
SQL注入特征库建立单元,用于基于SQL词法语法分析,建立基于SQL语法元素及SQL语法字段的SQL注入特征库;
SQL语句分析单元,用于针对目标数据,对所述目标数据进行SQL词法语法分析,获取所述目标数据中包含的所有SQL语法元素及SQL语法字段;
匹配单元,用于将所获取的所述目标数据中包含的所有SQL语法元素及SQL语法字段与所述SQL注入特征库进行匹配,如果匹配成功,则确定存在SQL注入攻击。
B8、如B7所述的装置,所述目标数据是指http协议的post消息,所述装置还包括:
权重设置单元,用于为所述SQL注入特征库中针对所述post消息的每一条规则设置权重;
判断单元,用于当所述post消息中包含的SQL语法元素及SQL语法字段与所述SQL注入特征库中的规则匹配成功,且所匹配规则的权重等于或高于权重阈值时,确定存在SQL注入攻击。
B9、如权利要求8所述的装置,所述SQL注入特征库所包含的规则是由SQL语法元素及SQL语法字段构成的关键字组成的。
B10、如B7所述的装置,所述目标数据为http协议的get消息、cookie、refer字段或X-Forward-For字段,所述SQL注入特征库所包含的规则是基于SQL语法元素及SQL语法字段的正则表达式。
B11、如B7至B10任一项所述装置,所述SQL语法元素包括标识符、数据类型、函数、表达式、运算符、注释、保留关键字。
B12、如B7至B10任一项所述装置,所述SQL语法字段包括字段、命令、表名、条件。