一种基于C/S架构的SQL注入检测方法及其装置与流程

文档序号:22677731发布日期:2020-10-28 12:35阅读:284来源:国知局
一种基于C/S架构的SQL注入检测方法及其装置与流程

本发明涉及信息安全技术领域,具体涉及针对结构化查询语言sql的攻击检测。



背景技术:

结构化查询语言sql注入漏洞攻击是目前互联网最为流行最为热门的黑客攻击方法之一。攻击者通过把sql命令插入到web表单提交或者页面请求的查询字符串中欺骗服务器执行恶意的sql命令,从而获取数据库的管理用户权限,通过将数据库用户权限提升至操作系统管理权限,控制服务器才做系统,获取重要信息或者机密文件。

随着sql注入越来越普遍的发生,针对sql注入攻击的检测方法成为业内研究的热点。传统的sql注入检测和防范方法有对数据库或者服务器进行用户权限最小化的方式,或者利用验证器使用预定的规则校验用户输入数据。sql注入检测可以分为静态和动态两种方式,静态分析的重点是验证用户输入类型以便减少sql注入攻击的机会,但需要重写web应用程序。例如jdbc-checker使用java字符串分析库来验证用户输入类型并防止sql注入攻击,但如果恶意输入数据中均为正确的类型或语法则无法检测出异常。动态分析是在扫描web应用程序后进行的分析相应,它可以定位来自sql注入攻击的漏洞而不需要对web应用程序进行任何修改操作。例如paros开源程序,使用了预定的攻击代码扫描并确定http响应是否成功,它不仅可以发现sql注入攻击以及web应用程序中的其他漏洞,虽然动态分析方法相对于静态分析而言不需要修改web应用程序,但是对于发现的漏洞必须由开发人员手动修复,而且对于没有预定义的代码攻击漏洞类型不能有效检测。



技术实现要素:

针对现有静态分析和动态分析中存在的问题,本发明提出一种基于c/s架构的静态和动态分析相结合的sql注入检测方法和装置。

该sql注入检测方法具体如下:

接收客户端提交的数据;在webserver端对所述数据执行sql注入检测,查看webserver端存储的黑名单,判断用户端网页ip地址否在所述黑名单中;若是,则禁止访问所有请求的url地址;若否,则基于预设的sql注入检测算法检测客户端提交的数据,所述预设的sql注入检测算法为静态分析和动态分析相结合的检测算法;若检测结果为合法,则允许正常访问网站;若检测结果为非法,则禁止访问所有请求的url地址,并更新webserver端的黑名单,将所述ip地址添加至黑名单。

进一步地,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:定义函数f,用于删除数据中sql查询语句的属性值;令fq为一条sql查询语句,则fdq=f(fq),fdq为fq删除在‘=’之后或括号内的字符串值以后的sql查询语句。

进一步地,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:在web应用程序运行过程中,遍历该web应用程序中所有固定sql查询语句,对于每一条固定sql查询语句fix_sqli,有:dyn_sqli=f(fix_sqli),得到对应的动态sql查询语句dyn_sqli。

依据下述公式计算得到中间结果result:

result=fix_sqli⊕dyn_sqli

其中⊕是异或操作;判断所述中间结果result是否为零,若result=0,则说明数据正常,否则说明数据存在异常。

优选地,所述删除数据中sql查询语句的属性值进一步包括:定义函数deletfirst(),用于提取并删除输入sql查询语句中的第一个字符,并返回该字符;定义两个状态常量is_start和is_end,表示sql查询语句中“‘”符号的开始和结束状态;定义中间状态变量current_status,初始化值为is_end;如果初始sql查询语句sql不为空,则循环执行下述操作:

步骤s1、令临时变量char=deletfrist(sql);

步骤s2、判断char是否为“‘”符号,如果是,则将char添加到待输出变量output中并执行步骤s3,返回步骤s1,否则,执行步骤s4;

步骤s3、判断char前一个字符是否为反斜杠“\”,如果是,则令current_status=is_start,返回步骤s1;

步骤s4、判断current_status是否等于is_end,如果是,则将char添加到待输出变量output中,返回步骤s1,否则,执行步骤s5;

步骤s5、判断char前一个字符是否为反斜杠“\”,如果是,则将char添加到待输出变量output中;

结束循环后返回所述变量output,作为删除属性值后的sql查询语句。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是目前常见的sql注入攻击流程图;

图2是根据本发明实施例所述的sql注入检测流程图。

有益效果

针对sql查询语句的语法特点,总结发现在sql查询语句中的属性值一般由以下形式组成:name=‘abc’(变量=‘字符串值’)或者index=1(变量=数字值)。本申请提出的sql注入检测方法结合静态分析和动态分析两种方式,在静态分析中删除sql查询中的属性值,在web应用运行过程中动态分析每条sql查询语句,利用异或操作来判断是否存在异常,有效提高了检测结果的准确性和效率。此外,在进行上述静态分析和动态分析结合的sql查询语句检测步骤之前,首先利用黑名单机制筛查明显恶意网站,并动态更新该黑名单列表,当黑名单机制筛查通过后进一步利用sql注入检测算法进行检测,不仅减少了不必要的恶意检测步骤,也进一步提高了对sql注入检测的准确性。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。

sql注入(sqlinjection)漏洞攻击是目前网上最流行最热门的黑客攻击方法之一。攻击者通过把sql命令插入到web表单提交或页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令。为了获取数据库的管理用户权限,然后通过将数据库用户权限提升至操作系统管理权限,控制服务器操作系统,获取重要信息或机密文件。图1给出了目前常见的sql注入攻击流程。

如图2所示,根据本发明实施例所述的一种基于c/s架构的sql注入检测装置,包括接收模块、检测模块。

接收模块,用于接收客户端提交的数据;

检测模块,位于webserver端,用于在webserver端对所述数据执行sql注入检测;所述检测模块包括黑名单判断模块和sql注入检测算法模块;

其中黑名单判断模块用于查看webserver端存储的黑名单,判断用户端网页ip地址否在所述黑名单中,若是,则禁止访问所有请求的url地址;

若否,则由sql注入检测算法模块基于预设的sql注入检测算法检测客户端提交的数据,所述预设的sql注入检测算法为静态分析和动态分析相结合的检测算法;

若检测结果为合法,则允许正常访问网站;

若检测结果为非法,则禁止访问所有请求的url地址,并更新webserver端的黑名单,将所述ip地址添加至黑名单。

进一步地,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:定义函数f,用于删除数据中sql查询语句的属性值;令fq为一条sql查询语句,则fdq=f(fq),fdq为fq删除在‘=’之后或括号内的字符串值以后的sql查询语句。

进一步地,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:在web应用程序运行过程中,遍历该web应用程序中所有固定sql查询语句,对于每一条固定sql查询语句fix_sqli,有:dyn_sqli=f(fix_sqli),得到对应的动态sql查询语句dyn_sqli。

依据下述公式计算得到中间结果result:

其中是异或操作;判断所述中间结果result是否为零,若result=0,则说明数据正常,否则说明数据存在异常。

算法1是本发明提出的sql注入检测算法的伪代码示例:

定义n代表web应用程序中固定sql查询语句的总数量,fix_sqli代表其中第i条语句,dyn_sqli=f(fix_sqli)代表由第i条语句生成的动态sql查询语句,f()为用于删除sql查询语句中属性值的函数。

优选地,所述删除数据中sql查询语句的属性值进一步包括:定义函数deletfirst(),用于提取并删除输入sql查询语句中的第一个字符,并返回该字符;定义两个状态常量is_start和is_end,表示sql查询语句中“‘”符号的开始和结束状态;定义中间状态变量current_status,初始化值为is_end;如果初始sql查询语句sql不为空,则循环执行下述操作:

步骤s1、令临时变量char=deletfrist(sql);

步骤s2、判断char是否为“‘”符号,如果是,则将char添加到待输出变量output中并执行步骤s3,返回步骤s1,否则,执行步骤s4;

步骤s3、判断char前一个字符是否为反斜杠“\”,如果是,则令current_status=is_start,返回步骤s1;

步骤s4、判断current_status是否等于is_end,如果是,则将char添加到待输出变量output中,返回步骤s1,否则,执行步骤s5;

步骤s5、判断char前一个字符是否为反斜杠“\”,如果是,则将char添加到待输出变量output中;

结束循环后返回所述变量output,作为删除属性值后的sql查询语句。

算法2给出了函数f的执行代码:

以下作为示例显示执行上述函数f之后的结果,nomal_sql代表正常sql查询语句,abnomal_sql代表异常sql查询语句:

fix_sql=select*fromuserwhereuserid=’$id’andpass=’$password’dyn_sql=f(fix_sql)=f(select*fromuserwhereuserid=’$id’andpass=’$password’)=select*fromuserwhereuserid=”andpass=”

nomal_sql=select*fromuserwhereuserid=’root’and\pass=’admin’sql1=f(nomal_sql)=f(select*fromuserwhereuserid=’root’andpass=’admin’)=select*fromuserwhereuserid=”andpass=”

abnomal_sql=select*fromuserwhereuserid=’1’or‘1=1’—‘andpass=’admin’

sql2=f(abnomal_sql)=f(select*fromuserwhereid=’1’or‘1=1’—‘andpass=’admin’)=select*fromuserwhereid=”or“—‘’admin

无论是正常sql查询语句还是异常sql查询语句,都应用上述f()函数,对于正常sql查询语句而言,删除属性值前后的两条语句在逻辑上应当是相同的,因此采用逻辑异或操作符可以判断出该sql语句是否正常。

最后应说明的是:显然,上述实施例仅仅是为清楚地说明本申请所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引申出的显而易见的变化或变动仍处于本申请型的保护范围之中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1