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

发布者:发布时间:2009-09-06浏览次数:556

摘自:动态网站指南网


 

  asp编程门槛很低,新手很容易上路。在一段不长的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到。那么新手与老手就没区别了吗?这里面区别可就大了,只不过外行人很难一眼就看出来罢了。在界面的友好性、运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点。而在安全性方面,新手最容易忽略的问题就是sql注入漏洞的问题。用nbsi 2.0对网上的一些asp网站稍加扫描,就能发现许多asp网站存在sql注入漏洞,教育网里高校内部机构的一些网站这种漏洞就更普遍了,可能这是因为这些网站大都是一些学生做的缘故吧,虽然个个都很聪明,可是毕竟没有经验,而且处于学习中,难免漏洞多多了。本文主要讲讲sql注入的防范措施,而要明白这些防范措施的用处,须先详细讲解利用sql注入漏洞入侵的过程。新手们看明白啦。

  相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。如这是一个正常的网址http://localhost/lawjia/show.asp@id=444,将这个网址提交到服务器后,服务器将进行类似select * from 表名 where 字段="!amp;id的查询(id即客户端提交的参数,本例是即444),再将查询结果返回给客户端,如果这里客户端故意提交这么一个网址:

  http://localhost/lawjia/show.asp@id=444 and user>0,这时,服务器运行select * from 表名 where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下:

  ·错误类型:

microsoft ole db provider for odbc drivers (0x80040e07)
[microsoft][odbc sql server driver][sql server]将 nvarchar 值 'sonybb' 转换为数据类型为 int 的列时发生语法错误。
/lawjia/show.asp, 第 47 行

  但是别有用心的人从这个出错信息中,可以获得以下信息:该站使用ms_sql数据库,用odbc连接,连接帐号名为:sonybb。所谓sql注入(sql injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。通常别有用心者的目标是获取网站管理员的帐号和密码。比如当某个人知道网站管理员帐号存在表login中,管理员帐号名为admin,他想知道管理员密码,这里他从客户端接着提交这样一个网址:
http://localhost/lawjia/show.asp@id=444 and (select password from login where user_name='admin')>0,返回的出错信息如下:

  ·错误类型:

microsoft ole db provider for odbc drivers (0x80040e07)
[microsoft][odbc sql server driver][sql server]将 varchar 值 '!@#*&admin' 转换为数据类型为 int 的列时发生语法错误。
/lawjia/show.asp, 第 47 行

  你知道吗?上面标红的部分就是管理员帐号admin的密码!虽然很复杂,让人看几遍也记不住的,但它就这样显示在你面前了,这时您就可以用这个帐号和密码接管人家的网站了!这时你可能还会说,如果他不是事先知道管理员帐号存在表login中,而且知道管理员帐号为admin,那他就不可能获得管理员密码。你错了,只要人家愿意多花时间尝试,他将可以获得数据库连接帐号权限内所能获得的所有信息!具体过程请参看网上的这篇文章:sql注入漏洞全接触。

  当然这个过程是很烦琐的而且要花费很多的时间,如果只能以这种手动方式进行sql注入入侵的话,那么许多存在sql注入漏洞的asp网站会安全很多了,不是漏洞不存在了,而是利用这个漏洞入侵的成本太高了。但是如果利用专门的黑客工具来入侵的话,那情况就大大不同了。手动方式进行sql注入入侵至少需要半天或一天乃至很多天的时间,而利用专门的工具来入侵就只需要几分钟时间了(视网速快慢决定),再利用获得的管理帐号和密码,上传一个从网上下载的asp后门程序,就轻易获得整个网站的管理权限了,甚至整个服务器的管理权限。最有名的一种sql注入入侵工具是nbsi 2.0,现在已经出到2.0版本了,不过,人家正式名称不叫sql注入入侵工具,而叫做网站安全漏洞检测工具。有了这个所谓的检测工具,使得入侵存在sql注入漏洞的asp网站成了小儿科的游戏,那些既不懂asp又不懂sql、年纪小小的男性青年常常得以在一天之内入侵十多个asp网站,他们以此获得内心的极大满足。他们似乎也非常讲究职业道德,往往并不破坏网站数据和系统,常见的破坏方式大都仅仅是改换掉网站的主页,留下"善意的警告",如:你的网站存在sql注入漏洞,请管理员做好防范措施!并声明"我没有破坏数据和系统",有的还要借机发布一下他的倡导:"国内网站大家不要入侵,有本事入侵小日本的!",最后,签上他的鼎鼎大名是必不可少的程序。

  如此大的成就多数情况下仅需动动鼠标就做到了。打开最新版的nbsi 2.0,如图1所示:输入地址到a区,注意网址必须是带传递参数的那种,点击右边的检测按钮,即出来b区信息,显示当前用户为sonybb的权限为public,当前库为lawjia。有点可惜啊,如果是sa权限的话,就可以跨库注入了。不过,这个权限也足够获取该网站管理员帐号和密码了。点c区下的自动猜解按钮,即出来当前库lawjia中的各种表,哇,login表中一定是存管理员帐号和密码的吧?选中它吧,接着点击d区下的自动猜解按钮,立即出来login表里的列名称,果然是存放用户名和密码的啊,太棒了!赶快打上勾,迫不急待的点击e区下的自动猜解按钮。激动人心的时刻就要到来啦,只见唰唰地几下,帐号与密码全部出来了。剩下的事就是辨别哪一个帐号是管理员了。


图1(图中的示例网站在作者本地电脑上运行)

  不知那些没注意过sql注入漏洞的asp程序员们看了上图的例子,要作何感想呢?是不是觉得这个所谓的网站安全漏洞检测工具sbsi 2.0简直就是ms_sql的企业管理器呢?只不过人家不需要帐号和密码就可以查看您数据库里的所有信息了。如果您的网站就这样被人不费吹灰之力入侵了,您是不是要吐几升血了呢?也许您已经为系统安全费尽心思了,装补丁、安防火墙、装杀毒软件、巧妙配置iis及数据库用户权限,但您就是没有注意到sql注入漏洞,于是"千里之堤,溃于蚁穴"。防火墙与杀毒软件对sql注入是没办法防范的,因为sql注入入侵跟普通的web页面访问没什么区别,所以往往是防不甚防。而且一个服务器上放置的网站往往是有很多个的,服务器管理员不可能挨个网站挨个页面的审查其是否存在sql注入漏洞。那么应该如何防范sql注入入侵呢?作为服务器管理员或网站程序员应该分别怎么做呢?服务器管理员要做的事主要是配置iis和数据库用户权限,而网站程序员主要是要在程序代码编写上防范sql注入入侵。下面详细叙述:

  对了服务器管理员,既然你不可能挨个检查每个网站是否存在sql注入漏洞,那么就来个一个绝招。这个绝招能有效防止sql注入入侵而且"省心又省力,效果真好!"sql注入入侵是根据iis给出的asp错误提示信息来入侵的,如果你把iis设置成不管出什么样的asp错误,只给出一种错误提示信息,即http 500错误,那么人家就没办法入侵了。具体设置请参看图2。主要把500:100这个错误的默认提示页面 c:\windows\help\iishelp\common\500-100.asp改成
c:\windows\help\iishelp\common\500.htm即可,这时,无论asp运行中出什么错,服务器都只提示http 500错误。


图2、iis出错信息设置

  但是这样设置一个不好的地方是程序员编写的代码出错时,服务器不给出详细的错误提示信息,会给程序员带来很大的不便。不过,服务器毕竟不是测试代码的地方,应坚持安全稳定第一,这样设置也是无可厚非的,事实上许多服务器的出错信息都是如此设置。

  服务器管理员还应在iis中为每个网站设置好执行权限,可千万别给人家静态网站以"脚本和可执行"权限。一般情况下给个"纯脚本"权限就够了,对于那些通过网站后台管理中心上传的文件存放的目录,就更吝啬一点吧,执行权限设为"无"好了,这样做是为了防止人家上传asp木马,执行权限设为"无",人家上传asp木马也运行不了。一般情况下,sql注入漏洞仅是涉及一个网站安全的事,如果人家通过这个漏洞上传了asp木马并运行起来,那整个服务器都失陷了。所以有远见的、有责任心的服务器管理员应该十分吝啬的配置iis的执行权限。

  同样的吝啬态度应适用于数据库用户的权限配置上,当然这里数据库是指ms_sql啦,access都没有用户权限配置这一步骤。如果public权限足够使用的绝不给再高的权限,可千万别把sa级别的权限随随便便地给人家啊。那个所谓的网站安全漏洞检测工具nbsi 2.0可有跨库进行sql注入的功能啊,如果你把sa权限给了存在sql注入漏洞的库,那其它库就不保啦!城门失火,殃及池鱼呀。而人家还可以通过调用xp_cmdshell命令得到系统的最高权限。具体步骤还是请参看上面提到的那篇《sql注入漏洞全接触》这篇文章吧。

  接下来要讲讲程序员的防范措施了。程序主要要做两件事,最重要的一件事,当然是对客户端提交的变量参数进行仔细地检测啦。对客户端提交的变量进行检查以防止sql注入,有各种方法,到http://community.csdn.net/上搜索一下,你能获得许多有益信息。这里介绍一种现成的方法,别人已经写好了检测代码,拿来用一下,不用自己辛苦啦。那就是"枫叶sql通用防注入v1.0 asp版",这是一段对用户通过网址提交过来的变量参数进行检查的代码,发现客户端提交的参数中有"exec、insert、select、delete、from、update、count、user、xp_cmdshell、add、net、asc"等用于sql注入的常用字符时,立即停止执行asp并给出警告信息或转向出错页面。大家可以到网上搜索一下,下载这段代码,存为一个asp页面,如checksql.asp,把这个页面include到每个需要带参数查询sql数据库asp页面中,记住,只要加一行这样的<!--#include file="checksql.asp"-->代码就行了。