论文部分内容阅读
摘要:本文旨在阐述SQL注入的攻击原理,并提出相应的防御建议,本文以示例代码说明SQL注入的基本原理,并简述其危害,最后提出了SQL注入攻击防御的基本方法,从而有效地避免SQL注入攻击。
关键词:SQL注入;字符过滤;SQL参数化查询
中图分类号:TP393.08文献标识码:A文章编号:1671-864X(2015)07-0129-02
一、概述
随着科学技术的不断发展以及互联网络的广泛应用,使用信息化处理技术来实现数据信息的数字化、网络化管理已经成为现代社会各个领域中的发展趋势。基于B/S架构的web系统以其方便、快捷、多平台支持的特性,已经成为目前流行的计算机系统。然而,互联网络的开放性与共享性,加上编码人员的安全编码意识较低或信息安全技术较为薄弱,当前的web系统出现了各种各样的安全漏洞,给网络黑客和恶意攻击人员以可乘之机。根据国际免费组中OWASP历年来统计的安全漏洞来看,SQL注入一直是位于应用安全漏洞top10 的榜首,时时刻刻威胁着各个信息化系统的广泛应用。如果一个信息系统存在SQL注入的安全漏洞,一旦被黑客恶意利用,将会为信息系统造成不可预估的损失,也会为系统运营商,无论是在对外形象上还是经济上,都会造成极大的影响。所以,对于SQL注入的基本攻击原理的研究以及对其防御技术的学习,对于提升信息系统的安全性、避免运营商的损失方面来说,具有非常重要的现实意义。
二、SQL注入的攻击原理
SQL注入(又被成为SQL Injection),是最常见的web系统或其他应用系统的安全漏洞,也是很容易被网络恶意攻击者利用,并且对应用系统的后台数据造成极大破坏的一种攻击方式。
大多数的应用系统,其核心思想是对后台数据库中存储的数据信息进行存储、读取、逻辑处理的过程,所有的原始数据或最终数据都是以格式化数据的形式,存储在特定的数据库中的数据表内。所以,在应用系统开发过程中,除了正常的按照业务逻辑和需求,对数据进行逻辑处理代码外,其他的一部分代码,就是对数据库数据进行存储、查询、修改的存储过程,一般为SQL语句形式的对数据库的数据表数据进行的处理过程。应用系统的开发,要求系统与最终用户之间有友好的交互,即应用系统按照用户的意愿,通过GUI界面或CLI命令行,读取用户的输入数据,然后通过相应的逻辑处理后,将用户数据传到后台的存储过程中,即将用户的 交互数据,形成SQL语句的一部分,最终构成完整的SQL语句传输到数据库管理系统完成数据表数据的操作。而SQL注入攻击,即是利用了这个正常的处理过程中存在的安全漏洞,实现对应用系统的安全攻击。
对于缺乏安全编码意识或技术的开发人员来说,在获取到用户数据后,一般都是不做任何安全处理,直接传给SQL语句后,这就造成了SQL注入的安全漏洞,很容易让网络黑客通过渗透技术或网络攻击技术,侦查到该漏洞实施安全攻击。
以基于GTK+编程为例,在以下代码中,就会存在SQL注入的安全漏洞。
//SQL语句拼接
strcpy(query,"select * from MyUsers where name = \"");
strcpy(string,gtk_entry_get_text(GTK_ENTRY(entry1)));
strcat(query,string);
strcat(query,"\" and password =\" ");
strcpy(string,gtk_entry_get_text(GTK_ENTRY(entry2)));
strcat(query,string);
strcat(query,,"\" ");
//SQL语句查询
if(mysql_query(mysql,query)){
printf("mysql_query wrong!");
mysql_close(mysql);
exit(0);
}
在这段代码中,主要分为两个部分,第一部分为SQL语句拼接部分,即对用户输入的数据,通过相应的手段或方法,将其拼接成完整的SQL语句,第二部分为SQL语句查询,即将完成的SQL语句通过相应API传输到数据库管理系统后进行数据查询。在SQL语句拼接中,首先将“select * from MyUsers where name = "”字符串赋值给query变量,然后通过gtk_entry_get_text()方法,从前端GUI输入框中获取用户输入数据,赋值给string变量,然后将string变量字符串拼接到query后面,然后再次将“" and password =”拼接到query变量之后,然后再次通过gtk_entry_get_text()方法从GUI上获取另外一个数据,并赋值给string变量,最后再次拼接到query变量后面,形成一个完成的SQL语句。假如,用户在entry1中输入admin,在entry2中输入password,那么最终形成的SQL语句如下:
select * from MyUsers where name = "admin" and password ="password"
该语句实现的功能为从MyUsers数据表中查询name字段为admin,password字段为password的数据信息。在正常情况下,如果数据表中存在该数据,查询成功,如果不存在该数据,查询失败。
而网络黑客如果检测到该系统存储SQL注入安全漏洞,就可以通过特定的攻击手段,来获取相应的信息。例如,在entry1中输入“test" or 1=1 —— ”,在entry2中输入任意值,如penetration,那么按照应用系统的正常处理过程,就形成了如下SQL语句: select * from MyUsers where name = "test" or 1=1 ——and password ="penetration"
在SQL语句中,“——”为注释符号,即该符号之后的代码全为注释代码,那么上述SQL语句变成如下语句:
select * from MyUsers where name = "test" or 1=1
该SQL语句的执行,是查询MyUsers表中在where条件下的所有数据信息,where条件中,name为test的可能不存在,信息为零,但or运算为或预算,后面的1=1是永远成立的,那么SQL语句执行时,where条件永远成立,那么查询的结果即是将MyUsers表中的所有信息全部查询出来。
如果MyUsers数据表即为存储用户名和密码的用户表,那么该攻击将会获取该表内所有的数据信息。即使密码字段的采用加密算法加密,网络黑客也可以通过彩虹表对比或MD5解密等暴力破解方式,解密密码字段信息,从而获取登录名密码信息完成后续攻击。此外,如果该应用系统使用的数据库管理系统允许多SQL语句同时执行,则可以在select语句之后跟着drop语句或delet语句,从而对数据库的数据完整性造成破坏。这都对应用系统的正常运营造成极大的损失。
三、SQL注入的防御建议
SQL注入攻击手段,对应用系统造成的危害是最直接的,破坏也是最大的,所以在应用系统开发过程中,必须做好SQL注入攻击的防御措施,从而提升开发系统的安全等级,使系统长期安全稳定地运行。
(一)字符过滤。
字符过滤是主动防御的一种方式,即对用户的输入数据进行特殊字符过滤,或限制用户输入某些特殊字符。常见的特殊字符包括“——”注释符,“;”多命令运行符,“ ”空格符等,当用户如果这些字符后,通过将其前面添加转移字符,将其变成SQL语句的数据部分,并非作为SQL语句代码对数据进行查询。例如针对上述SQL注入例子,可以使用strstr函数,对query变量查询,看是否存在特殊字符,或者使用mysql_real_escape_string()函数,对其特殊字符进行过滤即可。
(二)参数化查询。
根据SQL数据库管理系统运行机制,如果在访问数据库时,插入的查询数据是一个参数,那么SQL编译器会首先对SQL语句进行编译,然后再将参数带入到SQL语句,这样参数内的数据信息将不会最为SQL指令到数据库管理系统中去执行,从而有效地避免特殊字符的执行。
(三)安全数据加密。
对敏感数据必须采用数据加密的方式对其进行处理,这是必须的,对于信息系统的安全性来说也是非常重要的。但是考虑到简单的加密很容易被暴力破解,所以在选择加密算法或者加密机制时,尽量选择安全级别高的加密方式或加密机制,进而有效地减少加密数据被暴力破解的可能性。例如,可以采用AES的加密算法或者三重DES的加密算法,都是对存储数据加密的相对安全性较高的加密方式。同时,对于密钥存储的方式,也需要尽量采取安全性高的方案,来提升数据加密的安全性。
(四)强制增加密码复杂度。
对于安全要求较高的系统,可以通过强制增加密码复杂度的方式,来提升密码安全性,减少被暴力破解的可能性。众所周知,密码越复杂,被非法解密的时间越长,非法解密的可能性越小,所以增加密码复杂度也是减少SQL注入的一种方法。例如,强制要求用户密码设置时,必须含有大写字母、小写字母、数字和特殊字符,长度不能小于10等等,这些设置都提高安全级别,减少SQL注入攻击危害的辅助方式。
(五)渗透测试。
当前,测试工作越来越被更多的公司所看重,渗透测试作为应用安全处测试的方式,对于应用安全来说,是非常直接的。渗透测试是按照网络白客或者专门的渗透测试团队,按照黑客的攻击思路和方式,对应用系统进行渗透测试,最后给出测试报告,提出修复方案。所以渗透测试,是在黑客在发现SQL注入漏洞之前,有效地对应用系统进行测试,从而发现SQL漏洞并及时修复,进而避免损失。
四、总结
SQL注入是危害较大的一种应用安全漏洞,是安全编码人员在缺少安全编码意识或技术的情况下,引入的安全漏洞。对于SQL注入攻击,只有很好地了解其基本原理,根据防御措施积极做好防御,就会避免SQL注入的发生。
参考文献:
[1]吴潇璇.SQL注入式攻击防范研究[J].阴山学刊(自然科学版).2015(04)
[2]胡海斌.Web系统中SQL注入与攻击检测[J].福建电脑.2015(08)
关键词:SQL注入;字符过滤;SQL参数化查询
中图分类号:TP393.08文献标识码:A文章编号:1671-864X(2015)07-0129-02
一、概述
随着科学技术的不断发展以及互联网络的广泛应用,使用信息化处理技术来实现数据信息的数字化、网络化管理已经成为现代社会各个领域中的发展趋势。基于B/S架构的web系统以其方便、快捷、多平台支持的特性,已经成为目前流行的计算机系统。然而,互联网络的开放性与共享性,加上编码人员的安全编码意识较低或信息安全技术较为薄弱,当前的web系统出现了各种各样的安全漏洞,给网络黑客和恶意攻击人员以可乘之机。根据国际免费组中OWASP历年来统计的安全漏洞来看,SQL注入一直是位于应用安全漏洞top10 的榜首,时时刻刻威胁着各个信息化系统的广泛应用。如果一个信息系统存在SQL注入的安全漏洞,一旦被黑客恶意利用,将会为信息系统造成不可预估的损失,也会为系统运营商,无论是在对外形象上还是经济上,都会造成极大的影响。所以,对于SQL注入的基本攻击原理的研究以及对其防御技术的学习,对于提升信息系统的安全性、避免运营商的损失方面来说,具有非常重要的现实意义。
二、SQL注入的攻击原理
SQL注入(又被成为SQL Injection),是最常见的web系统或其他应用系统的安全漏洞,也是很容易被网络恶意攻击者利用,并且对应用系统的后台数据造成极大破坏的一种攻击方式。
大多数的应用系统,其核心思想是对后台数据库中存储的数据信息进行存储、读取、逻辑处理的过程,所有的原始数据或最终数据都是以格式化数据的形式,存储在特定的数据库中的数据表内。所以,在应用系统开发过程中,除了正常的按照业务逻辑和需求,对数据进行逻辑处理代码外,其他的一部分代码,就是对数据库数据进行存储、查询、修改的存储过程,一般为SQL语句形式的对数据库的数据表数据进行的处理过程。应用系统的开发,要求系统与最终用户之间有友好的交互,即应用系统按照用户的意愿,通过GUI界面或CLI命令行,读取用户的输入数据,然后通过相应的逻辑处理后,将用户数据传到后台的存储过程中,即将用户的 交互数据,形成SQL语句的一部分,最终构成完整的SQL语句传输到数据库管理系统完成数据表数据的操作。而SQL注入攻击,即是利用了这个正常的处理过程中存在的安全漏洞,实现对应用系统的安全攻击。
对于缺乏安全编码意识或技术的开发人员来说,在获取到用户数据后,一般都是不做任何安全处理,直接传给SQL语句后,这就造成了SQL注入的安全漏洞,很容易让网络黑客通过渗透技术或网络攻击技术,侦查到该漏洞实施安全攻击。
以基于GTK+编程为例,在以下代码中,就会存在SQL注入的安全漏洞。
//SQL语句拼接
strcpy(query,"select * from MyUsers where name = \"");
strcpy(string,gtk_entry_get_text(GTK_ENTRY(entry1)));
strcat(query,string);
strcat(query,"\" and password =\" ");
strcpy(string,gtk_entry_get_text(GTK_ENTRY(entry2)));
strcat(query,string);
strcat(query,,"\" ");
//SQL语句查询
if(mysql_query(mysql,query)){
printf("mysql_query wrong!");
mysql_close(mysql);
exit(0);
}
在这段代码中,主要分为两个部分,第一部分为SQL语句拼接部分,即对用户输入的数据,通过相应的手段或方法,将其拼接成完整的SQL语句,第二部分为SQL语句查询,即将完成的SQL语句通过相应API传输到数据库管理系统后进行数据查询。在SQL语句拼接中,首先将“select * from MyUsers where name = "”字符串赋值给query变量,然后通过gtk_entry_get_text()方法,从前端GUI输入框中获取用户输入数据,赋值给string变量,然后将string变量字符串拼接到query后面,然后再次将“" and password =”拼接到query变量之后,然后再次通过gtk_entry_get_text()方法从GUI上获取另外一个数据,并赋值给string变量,最后再次拼接到query变量后面,形成一个完成的SQL语句。假如,用户在entry1中输入admin,在entry2中输入password,那么最终形成的SQL语句如下:
select * from MyUsers where name = "admin" and password ="password"
该语句实现的功能为从MyUsers数据表中查询name字段为admin,password字段为password的数据信息。在正常情况下,如果数据表中存在该数据,查询成功,如果不存在该数据,查询失败。
而网络黑客如果检测到该系统存储SQL注入安全漏洞,就可以通过特定的攻击手段,来获取相应的信息。例如,在entry1中输入“test" or 1=1 —— ”,在entry2中输入任意值,如penetration,那么按照应用系统的正常处理过程,就形成了如下SQL语句: select * from MyUsers where name = "test" or 1=1 ——and password ="penetration"
在SQL语句中,“——”为注释符号,即该符号之后的代码全为注释代码,那么上述SQL语句变成如下语句:
select * from MyUsers where name = "test" or 1=1
该SQL语句的执行,是查询MyUsers表中在where条件下的所有数据信息,where条件中,name为test的可能不存在,信息为零,但or运算为或预算,后面的1=1是永远成立的,那么SQL语句执行时,where条件永远成立,那么查询的结果即是将MyUsers表中的所有信息全部查询出来。
如果MyUsers数据表即为存储用户名和密码的用户表,那么该攻击将会获取该表内所有的数据信息。即使密码字段的采用加密算法加密,网络黑客也可以通过彩虹表对比或MD5解密等暴力破解方式,解密密码字段信息,从而获取登录名密码信息完成后续攻击。此外,如果该应用系统使用的数据库管理系统允许多SQL语句同时执行,则可以在select语句之后跟着drop语句或delet语句,从而对数据库的数据完整性造成破坏。这都对应用系统的正常运营造成极大的损失。
三、SQL注入的防御建议
SQL注入攻击手段,对应用系统造成的危害是最直接的,破坏也是最大的,所以在应用系统开发过程中,必须做好SQL注入攻击的防御措施,从而提升开发系统的安全等级,使系统长期安全稳定地运行。
(一)字符过滤。
字符过滤是主动防御的一种方式,即对用户的输入数据进行特殊字符过滤,或限制用户输入某些特殊字符。常见的特殊字符包括“——”注释符,“;”多命令运行符,“ ”空格符等,当用户如果这些字符后,通过将其前面添加转移字符,将其变成SQL语句的数据部分,并非作为SQL语句代码对数据进行查询。例如针对上述SQL注入例子,可以使用strstr函数,对query变量查询,看是否存在特殊字符,或者使用mysql_real_escape_string()函数,对其特殊字符进行过滤即可。
(二)参数化查询。
根据SQL数据库管理系统运行机制,如果在访问数据库时,插入的查询数据是一个参数,那么SQL编译器会首先对SQL语句进行编译,然后再将参数带入到SQL语句,这样参数内的数据信息将不会最为SQL指令到数据库管理系统中去执行,从而有效地避免特殊字符的执行。
(三)安全数据加密。
对敏感数据必须采用数据加密的方式对其进行处理,这是必须的,对于信息系统的安全性来说也是非常重要的。但是考虑到简单的加密很容易被暴力破解,所以在选择加密算法或者加密机制时,尽量选择安全级别高的加密方式或加密机制,进而有效地减少加密数据被暴力破解的可能性。例如,可以采用AES的加密算法或者三重DES的加密算法,都是对存储数据加密的相对安全性较高的加密方式。同时,对于密钥存储的方式,也需要尽量采取安全性高的方案,来提升数据加密的安全性。
(四)强制增加密码复杂度。
对于安全要求较高的系统,可以通过强制增加密码复杂度的方式,来提升密码安全性,减少被暴力破解的可能性。众所周知,密码越复杂,被非法解密的时间越长,非法解密的可能性越小,所以增加密码复杂度也是减少SQL注入的一种方法。例如,强制要求用户密码设置时,必须含有大写字母、小写字母、数字和特殊字符,长度不能小于10等等,这些设置都提高安全级别,减少SQL注入攻击危害的辅助方式。
(五)渗透测试。
当前,测试工作越来越被更多的公司所看重,渗透测试作为应用安全处测试的方式,对于应用安全来说,是非常直接的。渗透测试是按照网络白客或者专门的渗透测试团队,按照黑客的攻击思路和方式,对应用系统进行渗透测试,最后给出测试报告,提出修复方案。所以渗透测试,是在黑客在发现SQL注入漏洞之前,有效地对应用系统进行测试,从而发现SQL漏洞并及时修复,进而避免损失。
四、总结
SQL注入是危害较大的一种应用安全漏洞,是安全编码人员在缺少安全编码意识或技术的情况下,引入的安全漏洞。对于SQL注入攻击,只有很好地了解其基本原理,根据防御措施积极做好防御,就会避免SQL注入的发生。
参考文献:
[1]吴潇璇.SQL注入式攻击防范研究[J].阴山学刊(自然科学版).2015(04)
[2]胡海斌.Web系统中SQL注入与攻击检测[J].福建电脑.2015(08)