ASP.NET网站中SQL注入攻击的分析与防范

(整期优先)网络出版时间:2012-06-16
/ 2

ASP.NET网站中SQL注入攻击的分析与防范

张志美林辉张佳奖

靳娜1,2(1、江南大学,江苏无锡2141222、江苏联合职业技术学院盐城生物工程分院,江苏盐城224051)

摘要:SQL注入是ASP.NET网站中经常存在的一种漏洞,对后台数据库甚至是整个系统的安全造成了很大的隐患。本文主要分析SQL注入攻击的工作原理并提出了相应的防范措施。

关键词:ASP.NET;SQL注入;攻击;防范措施

1概述

SQL注入对当前的Web系统安全问题造成了很大的隐患,因为大部分的Web系统都需要跟用户进行交互,即从客户端那里获取用户输入的数据;而获取的数据将作为参数来构造SQL语句,并让后台数据库执行。如果攻击者故意设计恶意的SQL语句,骗取了服务器的执行,则可以成功获取用户信息,对后台数据库进行访问,若获取用户的权限较高,甚至可以对数据库进行修改或删除,造成非常严重的后果。本文主要介绍SQL注入攻击的方法,并给出常见的防范措施。

2SQL注入的基本概念及原理

SQL注入即英文SQLInjection。在Web应用系统中,客户端的用户页面通常包含Web表单,来接收用户的输入信息,攻击者把特殊的符号或SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,以此改变查询属性,后台服务器执行了被攻击者修改过的SQL语句,从而达到了攻击的目的。由于SQL注入是从正常的端口访问,和正常的Web用户访问没有什么区别,所以一般的防火墙不会对SQL注入发出警报,很难被管理员发现。

2.1获取数据库结构信息。攻击者要实现SQL注入,首先要知道数据库中表的结构,即表的名称、表中字段的名称、字段的数据类型等信息,这样才能保证注入的SQL语句具有正确的语法。为了得到数据库的这些信息,攻击者通常会故意构造带有语法错误的SQL语句,Web系统执行后会返回相应的错误提示信息,攻击者可以从出错提示信息中得到表的信息,重复执行以上做法,综合多次错误提示信息既可以获取整个表的结构。在弄清数据库的结构信息后,就可以对数据库实施SQL注入攻击。

2.2注入特殊符号。在SQL中“——”为单行注释符号,在该符号后面的语句在执行时将会被服务器忽略。攻击者经常使用该符号跳过数据库的验证,即便没有正确的用户名和匹配的密码也能够访问数据库,从而以终端用户甚至是管理员的身份对数据库进行操纵,达到攻击的目的。例如:在Web应用程序的登录页面中,通常要对用户的用户名uname和密码upassword进行验证,只有该用户存在且密码匹配才能通过验证。假设数据库中存储用户信息的表为users,其中有一条记录,用户名为utest,密码为u111。当用户在客户端的登录页面中输入正确的用户名和密码,则Web系统构造的SQL语句是:select*fromuserswhereuname=‘utest’andupassword=‘u111’以上SQL语句执行后,如果有一条记录返回,则认为该用户是合法的,通过了认证。否则,说明该用户不存在或密码不正确,不能通过认证。正常情况下,以上操作是没有问题的,但如果攻击者故意设计具有攻击性的SQL语句,在用户名的文本框中输入以下内容:a’or‘1’=‘1’——,在密码框中输入了111或其它任意密码,则上述SQL语句将会变为:select*fromuserswhereuname=‘a’or‘1’=‘1’——‘andupassword=‘111’。由于or语句中‘1’=‘1’始终为真,所以条件uname=‘a’or‘1’=‘1’始终为真,而符号——之后的语句被服务器理解为注释,该SQL语句可以得到用户表中所有用户的信息。由上可见攻击者通过在Web表单的输入文本框中注入特殊的符号,在不知道用户名和密码的情况下就可以通过身份验证,访问数据库信息。同样一个例子,在某一在电子商务系统中,输入商品的id号来查询产品信息,正确的SQL语句应为:select*fromgoodswheregoodid=‘1001’。goods为存放商品信息的表,goodid为商品的id号。以上语句则可以查询到商品id为1001的商品信息。如果攻击者在goodid的文本框中输入以下信息:1001‘or‘1’=‘1。则Web系统构造的SQL语句将变为:select*fromgoodswheregoodid=‘1001’or‘1’=‘1’。由于or语句之后的条件‘1’=‘1’始终为真,这样攻击者就得到了goods表中所有商品的信息。

2.3注入SQL语句。SQL注入攻击的另一种方式是在用户输入中注入整个额外的SQL语句,如果能够成功执行的话,攻击者则可以对数据库或操作系统进行任意操作,带来更为严重的后果。例如,在上例的电子商务系统中,攻击者已经得到了goods表中的所有信息,假设有件商品的id号为1001,如果攻击者在goodid之后注入了SQL语句droptablegoods——,即在商品id文本框中输入如下信息:1001‘;droptablegoods——,则真正执行的SQL语句将如下所示:select*fromgoodswhereid=‘1001’;droptablegoods——‘。在SQL语句中,“;”表示一个SQL语句的结束及另一个SQL语句的开始,这样,攻击者的输入相当于附带执行了droptablegoods语句,如果执行该SQL语句的用户有相应权限的话,将会删除整个goods表。如果注入的SQL语句为;backupdatabase数据库名todisk='c:\inetpub\wwwroot\save.db'则可以把得到的数据内容全部备份到WEB目录下,造成用户个人信息泄露,同时危害了整个数据的保密性。

3防范措施

通过以上对SQL注入攻击方法的分析,提出以下防范措施。

3.1替换出错信息提示页面。由于大部分的SQL注入攻击都需要根据IIS服务器返回的错误提示信息来获取数据库结构的,所以我们可以对SQL出错提示页面进行修改,定义一个专门的错误提示页面,针对所有的错误都只返回该页面,让攻击者得不到任何有价值的错误提示信息,从而保证数据库的安全。

3.2限制用户输入。针对SQL注入攻击的方法,最简单的防御就是对用户的输入做全面的检查,只接受已知的合法的数据,拒绝非法的符号,比如目前网络上输入用户名通常都限定只能由字母、数字等常规字符组成,如果含有单撇号或超过一定长度则认为该用户名不合法。虽然该方法简单易行,但也存在一定的不足,因为有时候这样的限制会影响用户的正常使用。如果该用户的名字或密码本身就包含了单撇号或数据较长,这样的限制就会导致错误的结果。

3.3参数化查询。在ADO.NET中,另一种更有效的防御SQL注入攻击的方法即参数化查询(ParameterizedQuery或ParameterizedStatement),它是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter)来给值,这样可以将数据和代码区分开来。在这种情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,也不会被数据库所运行。这个方法目前被认为是最有效的预防SQL注入攻击的防御方式。

4结论

目前SQL注入漏洞正被越来越多的开发者所了解,也有部分攻击者仍在使用SQL注入进行攻击,因此研究了解SQL注入攻击的原理并进行主动防范,能有效提高Web应用程序的安全性,对开发Web应用系统具有重要的意义。

参考文献

[1]陈逊.SQL注入攻击原理与防范[J].电脑知识与技术.

[2]黄芳,苏桂莲.Web应用中SQL注入攻击与防范探析[J].软件导刊,2012,11(1).

[3]陈利婷.基于ASP_NET平台的SQL注入攻击分析及防范措施[J].科技信息,2010(1).

[4]孙炯宁,徐永华.在ASP_NET中SQL注入式攻击探析[J].电脑学习,2009(6).