相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。如这是一个正常的网址http://localhost/lawjia/show.asp?id=444,将这个网址提交到服务器后,服务器将进行类似select * from 表名 where 字段="&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(图中的示例网站在作者本地电脑上运行) |
图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"-->代码就行了。
程序员要做的第二件事是给用户密码加密啦。比如用md5加密。md5是没有反向算法,不能解密的。人家即使知道经加密后存在数据库里的像乱码一样的密码,他也没办法知道原始密码了。不过,人家可以用update方法用他的密码代替你的密码,但这个操作还是有点麻烦,人家可能会怕麻烦而放弃。而那个所谓的网站安全漏洞检测工具nbsi 2.0是没有提供update操作功能的,所以用md5加密后,人家仅用nbsi 2.0而不辅以手动操作的话,就不可能获得网站管理员帐号的密码,这将挡住许多菜鸟级的攻击者,至少那些既不懂asp又不懂sql、年纪小小的男性青年是没有办法啦!
文章写到这,已经够长了,本来还想对那些所谓的网站安全漏洞检测工具如nbsi之流的黑客工具进行一番理性的探讨的,看来还是放弃好了。为了增强网站安全,了解攻击手段是必须的,但是,利用漏洞开发专门的黑客工具,使那些其实并不具备必要的网络技术和网络安全知识的人(就是文中提到的"既不懂asp又不懂sql、年纪小小的男性青年")轻而易举地侵入一家网站,这除了为许多网络管理员制造麻烦外,是否还具有加强网络安全意识提高网络安全水平的功效呢?
新闻热点
疑难解答