购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.1 数据库与注入隐患

如今的互联网系统,不管是JSP、ASP.NET还是PHP技术都免不了使用一些用户输入的信息以达到信息的沟通。但用户输入信息种类繁多,其中不乏一些黑客的试探数据。

在Web开发中,安全性都是开发人员要考虑的一个重要要素。在Web应用程序中,确保安全性是一个重要而复杂的问题。ASP.NET应用程序的安全性通常界定为在其上运行的计算机的配置,以及诸如数据库之类的连接资源。这就需要对特定文件夹、文件、组件和其他资源进行限制访问,以及给合适的用户授权,以便他们能访问请求的资源。

一般来讲,可用ASP.NET本身提供的身份验证、授权、角色扮演、IIS自带的NTFS权限和委托技术来增强Web应用程序和服务器的安全性。但当SQL注入攻击发生时,这些技术对于保护数据库安全就远远不够的了。本节将重点讨论攻击者使用SQL注入攻击的原理,并结合实例提出防范措施。

SQL注入是一种Web应用程序的安全漏洞,攻击者可以通过它将恶意数据提交给应用程序,欺骗应用程序在服务器上执行恶意的SQL命令。理论上讲,这种攻击一般可以预防,但由于其允许攻击者直接运行针对用户关键数据的数据库命令,从而成为一种常见的、危害性大的攻击形式。在极端情况下,攻击者不但能够自由地控制用户的数据,还可以删除数据表和数据库,甚至控制整个数据库服务器。

如果这种攻击容易预防,那么为什么还如此危险呢?由于众所周知的经济上的原因,用户的应用数据库对黑客来说非常诱人,他们可以引起攻击者的极大注意。如果在Web应用程序中可能存在SQL注入漏洞攻击者来说是很容易检测到并利用它。显然,即使SQL注入错误并不是开发人员最经常犯的错误,但是一旦发生就很容易被发现和利用。

攻击者检测SQL注入漏洞的一个简单方法是在输入中插入一个元字符(meta-character),应用程序会用这个字符生成一个数据库访问语句。例如,在任何包含一个搜索输入栏的Web站点上,攻击者可以输入一个数据库元字符,如一个核对符号(),然后单击“搜索”按钮提交输入。

如果应用程序返回一个数据库错误消息,攻击者不但会知道已经发现了一个应用程序的数据库驱动部分,而且能注入更有意义的命令,让服务器执行。应用程序安全研究员Michael Sutton近来的研究表明,发现那些易于受到SQL攻击的站点是很容易的。使用Google搜索这种API方法只需几分钟,就可以确定大量的潜在的易受攻击的站点。

5.1.1 攻击原理

SQL注入攻击是当今最危险、最普遍的基于Web的攻击之一。所谓注入攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。

在某些表单中,用户输入的内容直接用来构造(或影响)动态SQL命令或作为存储过程的输入参数,这类表单特别容易受到SQL注入攻击。SQL注入攻击的要诀在于将SQL的查询/行为命令通过“嵌入”的方式放入合法的HTTP提交请求中,从而达到攻击者的某种意图,接着通过运用一些特权登录,让恶意用户通过程序在数据库上执行命令。

常见的SQL注入攻击过程如下:

(1)程序员用ASP.NET写了一个Web应用登录页面。这个登录页面控制用户是否有权访问应用,它要求用户输入一个用户名和密码。

(2)登录页面中输入的内容将直接用来构造动态的SQL命令或直接用作存储过程的参数。

(3)攻击者在用户名和密码输入框中输入“or 1=1”之类的内容。

(4)用户输入的内容提交给服务器后,在服务器运行上面的ASP.NET代码构造查询用户的SQL命令,由于攻击者输入的内容非常特殊。就使SQL命令变成类如:

(5)服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

(6)由于SQL命令已被注入式攻击修改,不能有效验证用户身份,所以系统错误地授权给了攻击者。如果攻击者知道将表单中输入的内容直接可以用于验证身份的查询,将会尝试输入某些特殊的SQL字符串,篡改查询原来的功能,欺骗系统的授予访问权限,进而可能对数据表执行各种操作,包括添加、删除或更新数据,甚至可能删除表。

5.1.2 攻击方式

从攻击原理可以看出,SQL注入攻击的源头是用户输入到Web表单的输入域或页面请求的查询字符串的内容,沿着SQL命令路径可以到达数据库服务器。在攻击的过程中,根据用户操作可将攻击方式分为无意攻击和有意攻击。

无意攻击是指用户无意中在Web表单的输入域或页面请求的查询字符串输入一些字符构成SQL命令,这些命令会对数据库执行破坏操作,此攻击造成的危害较小。有意攻击指用户故意在Web表单的输入域或页面请求的查询字符串输入一些字符构成SQL命令,通过这些命令欺骗服务器操作数据库得到某些返回结果,此攻击造成的危害非常严重。

实际上,每个Web站点都读取用户的信息,从登录信息到查找条件等。当用户在数据库将要处理的数据时故意插入SQL代码,就发生了SQL注入。此外一些基本的SQL符号将有助解释这些攻击,称为SQL特殊符号攻击。常见如“”打开和关闭数据库字符串;“;”结束语句;“—”创建注释,编译器会忽略“—”之后的内容,还有如“/”、“%”等转义符号。

5.1.3 防范方法

从以上SQL注入攻击的源头,路径以及攻击方式的分析,可以针对性地采取如下的防范措施:

1.过滤或转义危险字符

过滤或转义危险字符是阻止SQL注入最常用也最简单的方法。这种技术的思想基础是,从用户输入中移除(过滤)危险字符,或使数据库将危险字符作为文字对待(即转义)。过滤并不是一种理想的构思,因为“危险的”字符可能是用户输入的有效部分。但是,可以在出现“已知有害”数据的地方引发错误。已知的有害数据是一般在SQL语句外不可能使用的字符,如“-”或“;”字符。转义字符一般涉及复制危险字符,所以在“”字符的例子中,代码将字符视为文字,而不是字符串的结束。

2.使用SqlParameter类

.NET框架有一个叫做SqlParameter的集合类型,可以提供类型和长度检查,并且自动转义用户输入。当调用存储过程时使用同样的技术时,数据库将赋值给parm.Value的输入看做文字值,所以不需要转义用户输入,SqlParameter也强制要求类型和类型长度。如果用户输入值与描述的类型和大小不一致,代码将抛出一个异常。必须尽可能通过强制的类型和长度检查限制用户输入数据。

3.用正则表达式限制输人

如果ASP.NET的文本控件捕获了文本框的值,则可以用一个正则表达式控件来限制其输入。如果文本输入框的值有另外的来源,如一个HTML控件、查询参数或Cookie,则可以从System.Text.RegularExpressions命名空间中用类Regex来限制输入。

4.使用最小权限

将数据库访问和数据库使用权限限制到功能性的最小权限集。如果应用程序仅需要从数据库中读取数据,就没有理由允许数据库用户拥有删除表、插入记录或除读取数据之外的其他任何权限。

如果有恶意代码对数据库实施SQL注入攻击,但由于缺乏权限,破坏将降到最低限度。

5.拒绝已知的攻击签名

根据应用程序的行为,可以拒绝访问可能有危险的数据。过滤危险的SQL命令的关键字,如drop、delete、insert或update等。

6.加密处理

将用户登录名称,密码等数据加密后保存于数据库。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这就对用户输入的数据进行了“清洁处理”,用户输入的数据不再对数据库有任何特殊的意义,从而防止了注入SQL攻击命令。在System.web.Security.FormsAuthenatication类有一个HashPasswordForStoringInConfigFile,适合对输入数据进行处理。

7.在服务器上处理错误

系统错误中可以给攻击者提供数据库中的许多详细信息,如果在Try和Catch语句中隐藏数据库行为,并在服务器端正确地处理错误,则可以避免攻击者收集信息。在Catch语句中记录发生的错误的详细信息将有助于得知受到的攻击,以及攻击的企图。通过在服务器上处理错误,将阻止服务器向客户传送错误,以及所包含的敏感信息,因为成功的SQL注入攻击不一定会导致错误,导致错误的SQL注入通常说明攻击者正在收集数据库信息,是攻击的前兆。 EmhUBUui3yL1M5et7ovgP+PE9xfJ1bPIgkE4tLDucqY4TniZRzCXUg/IGak0i4Uu

点击中间区域
呼出菜单
上一章
目录
下一章
×