APP下载

SQL注入攻击与防范

2009-07-29

科技经济市场 2009年6期
关键词:开发人员服务器端攻击者

刘 佳

摘要:SQL注入攻击是对数据库进行攻击的常用手段之一。伴随着网络的普及应用,基于B/S模式的Web应用程序也得到了广泛的应用,但这些程序的水平却参差不齐,相当一部分开发人员在编写代码的时候没有对用户数据的合法性进行判断,使程序存在安全隐患。SQL注入攻击正是利用了这一漏洞对后台数据库进行攻击的。

关键词:SQL注入攻击;防范

1SQL注入攻击的原理

SQL注入攻击就是向服务器端提交一段事先准备好的数据,拼凑出攻击者想要的SQL语句,以改变程序预期的执行结果。

存在SQL注入漏洞的地方都是程序中需要根据客户端提交的数据来构造SQL语句的地方,也就是说只要程序中存在“客户端数据替换服务端预定义变量”的地方就有可能被注入。

由于服务器端程序通常采用拼凑SQL语句的方式,从而使得攻击者有机会在提交的数据中包含SQL关键字或者运算符,来构造想要的语句。

假设服务器端有这样一条SQL语句:

dim client_title as integer=Request.QueryString("title")

strsql="update book set title='" & client_title & "' where id=12"

客户端则通过http://websitename/update.aspx?title=sqlinjectio

n的形式向服务器提交用户数据。

开发人员的本意是想通过用户提交的数据“client_title”来更新表“book”中“id”为12的记录中的“title”字段的内容。在正常情况下,这样做不会有任何问题。但是如果攻击者提交http://websitename/update.aspx?title=sqlinjection'--,那么sql语句将被拼凑为:

update book set title='sqlinjection'。

可以看到,“where”子句被“--”注释掉了,“book”表中“title”列的所有内容都将被更新为“sqlinjection”。

2SQL注入攻击的危害

SQL注入攻击的目的就是改变SQL语句预期的执行结果。上面的例子就说明了SQL注入攻击的危害-对数据库进行了预期以外的操作,然而这还不是最糟糕的情形。请看下面的例子。

Dim id as string=Request.QueryString("ID")

Dim strsql as string="select * from tablename where id=" & id

这是在查询数据库中某个表的id字段中符合用户条件的记录的常用方法,而用户条件通常是以查询字符串的形式追加在URL的尾部。在本例中,客户端浏览器会以http://websitename/targetpage.aspx?id=123的形式向服务器端传递id参数,在正常情况下,这样做不会产生任何问题。但对于潜在的攻击者来说,这就是一个可以利用的SQL注入漏洞。如果攻击者在浏览器的地址栏中输入下面的地址:http://websitename/targetpage.aspx?id=123';dropdatabasedatabasename-

-,然后提交,那么服务器端的sql语句就变成了:

select * from tablename where id=123; drop database databasename --

攻击者在正常的查询字符串后面添加了“'; drop database databasename -”,先通过“;”来终止当前的sql语句,然后添加了恶意的sql语句-“drop database databasename”,最后通过“--”注释掉语句的其它部分。这样程序在执行的时候会先执行查询,然后删除数据库。

上面的例子中攻击者删除了后台数据库。类似的,攻击者可以利用程序编码中的漏洞,执行一个Join语句,获取数据库中所有的用户名和密码,也可以用Update、Insert语句修改商品的价格,添加新的管理员等等。

如果SQL注入只能通过手动方式进行的话,那么这个过程通常是漫长而烦琐的,使得利用这个漏洞入侵的成本过高,会让一些水平有限的攻击者放弃攻击。但如果使用专门的SQL注入工具情况就大大的不同了,一般手动入侵需要一天乃至更长的时间,而使用工具只需几分钟时间。目前网上最流行的SQL注入工具是NBSI2.0,它使得SQL注入变成了十分小儿科的游戏,哪怕攻击者既不懂ASP也不懂SQL,只需点点鼠标就可以轻松入侵存在漏洞的网站。

3SQL注入攻击的防范措施

从上面的分析可以看出,SQL注入攻击对网站的危害是巨大的,那么如何防范它呢?我认为可以从以下几个方面入手。

3.1修改IIS返回的异常信息。

攻击者在进行SQL注入攻击之前大多要通过IIS服务器返回的异常信息来收集和判断服务器端的信息,如数据库类型,连接方式,管理员账户甚至密码等。只要将IIS默认的异常提示页面由500-100改为500即可,这样无论程序运行中出现什么错误都将只提示“HTTP 500”错误,攻击者无法从中获取有用的信息。

3.2配置网站的执行权限。

通常情况下将网站的权限设为“纯脚本”即可,而不要给以“脚本和可所执行”权限。尤其是对存放通过网站后台管理上传的文件的目录最好将权限设为“无”,这样即使攻击者将木马上传到服务器也无法运行。

3.3配置数据库权限。

只给访问数据库的web应用程序最低权限,如果public权限足够用就绝对不要赋予sa权限,否则一旦被注入,不但当前数据库被攻击,其它数据库的安全也会受到威胁。

3.4验证用户提交的数据。

SQL注入之所以能够有机可乘,是因为大多数服务器端代码采用拼凑SQL语句的方式来操作数据库,使得恶意用户可以向服务器提交恶意代码。所以要防止SQL注入就必须要对用户提交的数据进行验证。在TCP/IP这个框架下,开发人员必须假设用户提交的数据都是不可信的,对来自用户的数据进行验证。

对用户数据进行验证的方法有很多,主要包括使用过滤用户数据、存储过程和参数化查询。

SQL注入漏洞的本质是攻击者向服务器提交特殊数据拼凑SQL语句。因此,必须在程序中对来自用户的数据进行过滤。可以从两个方面来考虑,一是只允许合法的数据,假如系统用户名只能由字母数字和下划线组成,那么就可以用[0-9a-zA-Z_]+这个正则表达式来匹配它,如果不符合条件,就拒绝。二是禁止非法的数据,例如禁止用户提交包含有“select”、“update”、“delete”等SQL关键字的数据。

存储过程不但可以防止SQL注入,而且可以使应用程序的速度成倍的增长。但需要注意的是如果存储过程中也存在着由连接字符串组成的SQL语句的话同样也有可能被注入,所以也要对用户提交的数据进行验证。

参数化查询是将用户数据作为一种指定类型的参数提交给数据库,开发人员可以指定参数的数据类型、长度等。程序代码在执行过程中将用户提交的数据作为一个整体进行处理,即使攻击者提交了包含SQL语句的数据,程序也不会视为SQL语句,也就从根本上防止了SQL注入攻击。

3.5加密存储用户名和密码。

SQL注入有可能向攻击者暴露数据库存储的用户名和密码。如果将用户名和密码加密之后存储,攻击者得到的将仅仅是密文,无法得到真正的用户名和密码。

目前,MD5是最常用的加密方法。简单来说MD5是一种单向加密算法,即用户无法通过密文得到明文。

虽然攻击者也可以通过Update方法来替换密码,但这也是一个相对复杂的工作,增加了攻击者的成本。

3.6使用SQL注入检测工具。

既然攻击者可以使用工具来提高入侵效率,我们同样可以使用工具来防止入侵。

随着 SQL 注入攻击的明显增多,微软发布了三个免费工具,帮助开发人员检测存在的漏洞并对可能的攻击进行拦截。

Scrawlr

下载地址:https://download.spidynamics.com/Products/scrawlr/

这是微软和 HP合作开发的工具,会在网站中爬行,对所有网页的查询字符串进行分析并发现其中的SQL 注入风险。Scrawlr使用了部分HP WebInspect的技术,但只检测SQL注入风险。Scrawlr 从一个起始 URL 入口,爬遍整个网站,并对站点中所有网页进行分析以找到可能存在的漏洞。

Microsoft Source Code Analyzer for SQL Injection

下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-A4334146B6BA&displaylang=en

这款被称作 MSCASI 的工具可以检测 源 代码并发现其中的SQL注入漏洞,开发人员需要向 MSCASI 提供原始代码,MSCASI 会发现存在风险的代码位置。

URLScan 3.0

下载地址: http://www.iis.net/downloads/default.aspx?tabid=3

4&g=6&i=1697

URLScan 3.0会让IIS服务器限制某些类型的HTTP请求,通过对特定HTTP请求进行限制,可以防止某些有害的请求在服务器端执行。UrlScan通过一系列关键词发现恶意请求,并阻止恶意请求的执行。

猜你喜欢

开发人员服务器端攻击者
基于微分博弈的追逃问题最优策略设计
Linux环境下基于Socket的数据传输软件设计
Semtech发布LoRa Basics 以加速物联网应用
正面迎接批判
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
有限次重复博弈下的网络攻击行为研究
网页防篡改中分布式文件同步复制系统
三星SMI扩展Java论坛 开发人员可用母语