SQL注入攻击原理及其防范措施

2012-10-30 05:21丁允超范小花
关键词:注入式用户名攻击者

丁允超 范小花

(1.重庆正大软件职业技术学院,重庆 400056;2.重庆科技学院,重庆 401331)

SQL注入攻击原理及其防范措施

丁允超1范小花2

(1.重庆正大软件职业技术学院,重庆 400056;2.重庆科技学院,重庆 401331)

SQL注入是一种常用且易于实现的入侵手段,是目前中小企业网站及应用系统最主要的威胁之一。介绍SQL注入攻击的方式,分析防止SQL注入攻击的各种措施,给出防止SQL注入的相关程序代码(用C#语言实现)。

SQL注入;安全性;攻击;ASP.NET

近年来,随着信息化的普及,各单位和机构都构建了自己的网站和应用系统。但由于很多软件开发人员在实现系统功能的同时,往往忽略了系统的安全性,在系统中留有Bug(漏洞),给系统留下了很大的安全隐患[1]。由于大量的软件系统都使用了数据库,所以SQL注入攻击成了众多攻击中最常用的且易于实现的入侵手段,是目前中小企业网站及应用系统最主要的威胁之一。虽然现在的集成化开发平台(.NET、JAVA等)本身具备较高的安全性,但如果开发人员不注意,也有可能留下安全隐患。所以我们有必要深入了解SQL注入攻击的原理及其实现过程。本文介绍了SQL注入攻击的方式,重点分析防止SQL注入攻击的各种措施,给出了防止SQL注入的相关程序代码(用C#语言实现)。

1 SQL注入攻击原理

“SQL注入”是一种源于SQL语句的漏洞,它是利用程序对输入数据的检验不足或程序自身对变量处理不当,把想要执行的SQL语句插入到实际的SQL语句中发送到服务器去执行,但是执行过程不是按照软件开发人员的预期方式进行的。其后果轻则导致敏感信息的泄露,重则会导致整个服务器受攻击者的控制[2]。

在ASP.NET中的“SQL注入”主要是用户在网页上的各种文本输入框内输入一定的SQL语句代码,将其传递到应用程序,致使客户端的数据显示或者执行结果不是软件开发人员的预期效果[3]。这样攻击者就可以有目的的查看网站的一些内部信息及各种业务数据,从而造成大量有用数据的泄露。

下面举几个常见的“SQL注入”攻击的实例。

(1)用户登录

一般用户在进入系统和网站之前,系统和网站的后台都会对用户进行合法性验证,验证方式如图1所示。

图1 用户登录

假设后台验证用户名和密码的SQL语句为“select* from [usres] where username='” +txtUserName.Text+“'and password='” +txtPwd.Text+“'”,当我们正常输入图1所示的用户名(“admin”)和密码(“123456”)时,SQL 语句即为“select*from[usres]where username='admin'and password='123456'”,当用户表(users)中的用户数据如图2所示时,此时用户登录成功,如果用户名或者密码错误,则用户登录失败,这是软件开发者的预期效果。

图2 用户表数据

但是,如果客户输入的资料如图3所示,即用户名文本框输入的内容为“'or 1=1or'1'='1”,密码为任意值时,后台SQL语句就变成了 “select*from[users] where username=''or 1=1or'1'='1'and password='xxxx'”①,此时不管输入任何密码,此SQL语句都会查询出用户资料,因为“or 1=1”语句永远为“真(True)”。但是系统数据库中并不存在名为“'or 1=1or'1'='1”的用户,此时,就形成了“SQL 注入”攻击。即“客户”在没有合法用户名和密码的情况下,仍然可以进入我们的系统,这就造成很大的安全隐患。

图3 特殊用户名

登录功能函数代码如下:

(2)网站(系统)数据查询

我们在系统或者网站中,有如图4所示的搜索功能,假设我们后台的SQL语句为"select*from news where title like'%"+txtKeyWord.Text+"%'";当按照图4输入关键字“注胶虾”,点击搜索按钮时,搜索结果如图5所示。此时的SQL语句为“select*from news where title like'%注胶虾%'”。

图4 正常搜索

图5 正常搜索结果

当我们输入关键字 “注胶虾%'or title like'%”时,搜索结果为所有的数据(图6)。因为此时的SQL语句已变为“select*from news where title like'%注胶虾%'or title like'%%'”。

图6 注入搜索结果

搜索功能实现代码:

对比这两次查询结果可知,第二次查询完全不是软件开发人员的预期效果,这样就又构成了一次“SQL注入”攻击,虽然这种方式的攻击,需要攻击者对数据表的字段很了解,但这对于有经验的攻击者而言,不是难事。并且通过修改相应的SQL语句,又可以实现不同的注入式查询,从而实现更加复杂的“注入式”攻击。

2 SQL注入攻击防范措施

由于“SQL注入”攻击使用的是合法的SQL语句,所以只要是有数据库的场合,该注入式攻击方式都适用,而如今,大部分的网站和Web应用系统都使用了数据库技术,所以目前很多的系统都存在被注入攻击的风险和安全隐患。因此,为了减少系统被攻击的可能性,应采取必要的应对措施:

(1)替换或者屏蔽特殊字符(字符串),比如 or、and、%、like等信息,这样可以从一定程度上降低被攻击的概率,由于更高级的攻击者依然不会轻易放弃,会竭力寻找过滤的漏洞,继续实施攻击。

(2)通过设置文本框的长度属性(MaxLength),限制用户名、密码等输入字符串的长度,这样在一定程度上可降低被攻击的可能性[5]。

(3)通过设置IIS屏蔽系统的出错信息,阻止攻击者获取系统的出错结果,使其不能继续实施更进一步的攻击[5]。

(4)将用户名和密码加密后再进行存储,也是一种防止攻击的方法。

(5)在ASP.NET下,有一种特有的防止SQL注入攻击的方式,就是用传参数的方式替代普通字符串拼接SQL语句的方式,从根本上避免SQL注入式攻击的发生。下面用代码(ASP.NET(C#语言)代码)的形式来说明避免SQL注入式攻击的实现方式。

上文提出了很多解决SQL注入式攻击的方法,现以“用户登录”功能,结合ASP.NET特有的传递参数的方式,用代码的形式举例说明。

由于传统的拼接字符串的方式,给攻击者留下了很多可攻击的漏洞,我们改用ASP.NET传递参数的方式,具体实现代码如下:

代码分析:

(1)该函数代码没有使用字符串拼接的方式;

(2)指定了两个参数的数据类型,这里均为SqlDbType.VarChar类型;

(3)在指定了参数的数据类型后,又指定了相应参数的长度,这样可以避免攻击者恶意输入任意长度的参数进行攻击;

(4)当调用该代码进行用户名和密码验证时,使用Sql Server Profiler工具进行实时监测。若按照拼接字符串方式进行“SQL注入”攻击,当输入用户名“'or 1=1or'1'='1” 和任意密码时,Sql Server Profiler监测到的实际执行语句为

“exec sp_executesql N'select count(*)from users whereusername= @usernameand password =@password',N'@username varchar (20),@password varchar(20)',@username='12312312312''or 1=1',@password='123123'”。可以看出,在使用参数集合传入输入值时,数据将被作为非结构化的数据发送到数据库,而没有像先前①以整个字符串的方式进行运行,这样可以实现安全的SQL语句查询功能,有效的避免了“SQL注入”攻击。

3 结 语

本文从SQL注入的基本原理入手,用两个典型的案例说明了注入攻击的方式。SQL注入是由于编码人员的疏漏所造成的,因此必须加强编码人员的安全意识,才能防范SQL注入攻击。本文的所有代码均在以下环境调试通过:winxp、IIS6.0、SQL2008、Visual Studio2010。

研究“SQL注入”攻击并不是为了去攻击别人的系统,而是使自己的系统更加安全。因为攻击和防御是相辅相成的,相信在了解了“SQL注入”攻击的原理和防范措施后,无论是在软件开发还是在系统维护方面,都能够很大程度地提高系统的安全性。

[1]钟志东,赵中文.ASP.NET4(C#)项目开发教程-面向工作过程[M].北京:北京航空航天大学出版社,2011.

[2]黄晓华.ASP.NET网站防SQL注入的方法研究[J].电脑知识与技术,2011(29):30-32.

[3]孙俊德.SQL注入攻击与防范技术[J].职业技术,2011(8):19-21.

[4]钟增胜.SQL注入漏洞的分析及防范[J].重庆工商大学学报:自然科学版,2005(12):593-597.

[5]张勇,李力,薛倩.Web环境下的SQL注入式攻击的监测与防御[J].现代电子技术,2004(15):103-108.

The Principle of SQL Injection Attack and Analysis of Countermeasures

DING Yunchao1FAN Xiaohua2
(1.Zhengda Software Polytechnic of Chongqing,Chongqing 400056;2.Chongqing University of Science and Technology,Chongqing 401331)

SQL injection is a kind of popular and easy to realize intrusion means,and it is one of the main threats to the small and medium enterprise website and application system.This paper introduces the methods of SQL injection attack,especially,summarizes and analyses various measures to prevent SQL injection attacks,and gives the related program code to prevent SQL injection attacks(Realize by C#language).

SQL injection;security;attack;ASP.NET

TP311

B

1673-1980(2012)05-0136-04

2012-04-24

国家自然科学基金项目(11076030)

丁允超(1980-),男,重庆正大软件职业技术学院教师,研究方向为数据安全、软件工程。

猜你喜欢
注入式用户名攻击者
《护士进修杂志》投稿程序
机动能力受限的目标-攻击-防御定性微分对策
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
GE发电机转子接地保护的原理
高中化学教学模式的探讨与学习
正面迎接批判
机智的快递员
红外导引头注入式闭环试验的边界能力及一致性
有限次重复博弈下的网络攻击行为研究