Web应用中SQL注入攻击与防范探析

时间:2023-04-25 13:24:03 公文范文 来源:网友投稿

摘 要:SQL注入攻击已成为当前Web应用程序的主要安全漏洞之一,其危害巨大,受到国内外研究人员的高度重视和广泛关注。介绍了SQL注入攻击的原理和分类,并结合Web应用程序开发给出了若干防范措施。

关键词:SQL注入攻击;防范;Web应用

中图分类号:TP393.08 文献标识码:A 文章编号:1672-7800(2012)001-0137-02

0 引言

随着互联网技术的发展, Web应用程序的开发越来越多,针对Web应用的攻击也在迅猛增长。通常情况下,Web系统服务器和数据库管理系统软件通过合理的策略配置与密码机制,攻击者往往不能够直接实施攻击,Web应用与数据库的访问接口就成为攻击者实施攻击的一条捷径。SQL注入攻击就是现在存在于Web应用中最常见的一种攻击方式,在Internet或企业内网中,对Web应用进行的SQL注入攻击大量存在。加之一部分程序员因缺乏设计经验和安全意识,开发出的软件产品存在安全隐患,这种攻击手段很容易被攻击者利用。但是只要对Web应用采取合理的防范措施就可以阻止SQL注入的发生或减少攻击造成的损失。

1 SQL注入攻击原理

Web应用程序易受SQL注入攻击主要是由于Web应用程序开发人员对用户输入的验证不充分造成的。常见的SQL 注入攻击有以下几种方式:

(1)通过登录表单进行注入。攻击者利用客户端用户向服务器端提交数据请求时输入非法数据,通过后台服务器执行被修改过的SQL语句,得到与程序原有预期不同的结果,甚至可以执行删除数据库等管理操作。

(2)攻击者通过修改Cookie内容来实施SQL注入攻击。Cookie是Web应用程序产生的、存储在客户端机器上的包含状态信息的文件。当客户端想重新获取某个Web应用程序时,可以利用Cookie来恢复其之前的状态信息。攻击者可以在客户端修改其内容,将攻击嵌入到Cookie中进行提交,当Web应用程序访问Cookie的内容构造SQL查询语句时,就会引发SQL注入攻击。

(3)盲目SQL注入攻击。攻击者通过提交输入数据来检测应用是否存在SQL注入漏洞,当提交一个错误的SQL查询语句时,服务器将返回一个错误消息给客户端,攻击者从这些错误消息中获取有用信息后反复地进行探测,获取数据库中的敏感数据。

2 SQL注入攻击的防范措施

通常,SQL注入攻击的过程为:攻击者在Web应用程序客户端输入界面中输入精心构造的非法数据,提交给服务器端构建SQL查询语句,然后服务器执行该SQL查询语句并将执行的结果返回给客户端。客户端、服务器端和数据库都有可能被SQL注入攻击。由于程序开发人员无法控制客户端用户的输入内容,所以我们只能在服务器端和数据库上加强防范SQL注入攻击。

2.1 用户输入数据转义

在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。例如,在Web应用程序的登录页面中,允许用户输入其用户名(username)和密码(password)两个参数,应用程序通过users表中进行登录身份验证。假设登录用户名为:“zhangsan”,密码为:“2011015”。则身份验证语句为:select * from users where username="zhangsan" and password="2011015",正常情况下,如果上述SQL查询返回一条记录,则说明是合法用户;反之,则是非法用户。如果分别为username和password 两个参数赋以下的值:“’a’ or 0=0--”和“’a’”,则上述SQL语句就会变为:select * from users where username=’a’or 0=0--and password=’a’,显然在该语句的两个判断条件中,其中有一个总是为真,即0=0,因此身份验证就会成功。可见攻击者在不知道有效的用户名和密码的情况下就可以通过身份验证。

为了防范SQL注入攻击,需要对用户输入的数据进行检查。转义机制根据应用开发采用的语言与后台数据库的不同,所使用的具体方法可能不同,但是其基本原理都是相同的。这种技术工作方式如下:能够将你提供给查询语句的特殊字符转义,告诉DBMS 用户提供的输入是数据而不是代码。如果对用户提供输入数据使用合适的转义机制,DBMS将不会混淆输入,从而避免可能的SQL注入漏洞。例如:PHP提供了输入转义机制magic_quotes_gpc,保护应用程序免受潜在的SQL注入攻击。如果启用magic_quotes_ gpc=on功能,就会在用户提交的`(单引号)、“(双引号)、\(反斜线)、NULL等敏感字符前面加上转义字符\,达到防止注入攻击的目的。

2.2 使用存储过程

使用存储过程,可以在预防非法注入方面提供更好的保护。存储过程要求开发者首先定义SQL代码,然后在使用中通过参数传输值。存储过程在执行前,首先会执行预编译,编译出错则不会执行,这在某种程度上提供一层天然的屏障。其次,使用存储过程而不是直接访问基本表,可以提供更好的安全性。因此,攻击者将不能探测到SELECT语句。第三,存储过程可以加密。另外,使用存储过程还有两方面好处:一是在数据库中使用专用的存储过程能严格地限制数据库用户使用此存储过程的权限。二是性能优势,将所有的SQL代码放在数据库中,使SQL代码的开发与应用程序开发独立存放,方便数据库开发者的开发、升级与维护操作。VB.Net存储过程示例:

Try

Dim command As SqlCommand = new SqlCommand("sp_getAccountBalance",connection)

command.CommandType = CommandType.StoredProcedure

command.Parameters.Add(new SqlParameter("@CustomerName",CustomerName.Text))

Dim reader As SqlDataReader = command.ExecuteReader()

‘…

Catch se As SqlException

‘error handling

End Try

2.3 服务器端和数据库安全配置

(1)为了降低一次成功SQL注入攻击所产生的危害,应该根据具体情况分配给数据库账户最小的权限,不要分配DBA或admin类型的访问权限给应用账户,尽量不要分配create或delete权限给数据库账户。

(2) 因为很多的SQL注入攻击都是根据IIS提供的出错信息来判断攻击的,SQL错误信息经常会透露某些数据库设计的细节,所以当应用程序发生SQL运行错误时,不要把数据库返回的错误信息完全地显示给用户。合理的做法是:开发者需要对SQL出错页面进行包装,针对所有的错误都只返回一种由程序员定义好的错误信息提示页面,让攻击者无法从中得到有价值的内容。

(3)经常检验IIS日志和数据表。

(4)SQL注入攻击常常会对某些关键名称进行反复探测侦查,从而从中发现敏感信息。如operator,name,id,password 等。因此在设计数据库时,应避免使用明显含义的表名和字段名。

(5)在数据库端给用户密码加密。比如用MD5加密。MD5没有反向算法,是不能解密的。攻击者即使知道经加密后存在数据库里的密码,也无法知道原始密码。

2.4 漏洞扫描工具

目前,在客户端进行安全漏洞检测最常用的就是各种商业漏洞扫描器,比如HP WebInspect、IBMtational AppScan等,或者开源的漏洞扫描器,比如Gamja和Hscan等。这些漏洞扫描器的目标不仅仅是SQL注入漏洞,还包括其他Web漏洞,比如XSS漏洞、恶意文件执行、目录遍历攻击等,这在一定程度上限制了其对SQL注入漏洞检测的深度;而且不少漏洞扫描工具都是重入侵,轻测试。

3 结束语

针对常见的SQL注入攻击,在程序开发阶段主动防范,能有效提高Web应用程序的安全性。因此,研究SQL注入攻击的原理与防范技术对于Web应用的开发人员与维护人员来说具有重要的意义,在应用开发时就应尽量采用先进的技术,这样才能远离SQL注入攻击对Web应用的危害,保护系统的安全。

参考文献:

[1] 王丽丽.浅析SQL盲注攻击的实现[J].信息安全与通信保密,2008(5).

[2] 陈楠,薛质.SQL注入攻击的实现和防范[J].信息安全与通信保密,2005(1).

[3] 岳清.基于Web应用程序的SQL注入防范研究[J].大众科技,2011(4).

(责任编辑:杜能钢)

推荐访问:探析 注入 防范 攻击 Web