ASP编程门槛很低新手很容易上路在一段不长的时间里新手往往就已经能够编出看来比较完美的动态网站在功能上老手能做到的新手也能够做到那么新手与老手就没区别了吗?这里面区别可就大了只不过外行人很难一眼就看出来罢了在界面的友好性运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点而在安全性方面新手最容易忽略的问题就是SQL注入漏洞的问题用NBSI 对网上的一些ASP网站稍加扫描就能发现许多ASP网站存在SQL注入漏洞教育网里高校内部机构的一些网站这种漏洞就更普遍了可能这是因为这些网站大都是一些学生做的缘故吧虽然个个都很聪明可是毕竟没有经验而且处于学习中难免漏洞多多了本文主要讲讲SQL注入的防范措施而要明白这些防范措施的用处须先详细讲解利用SQL注入漏洞入侵的过程新手们看明白啦
相当大一部分程序员在编写代码的时候没有对用户输入数据的合法性进行判断使应用程序存在安全隐患如这是一个正常的网址http://localhost/lawjia/showasp?ID=将这个网址提交到服务器后服务器将进行类似Select * from 表名 where 字段=&ID的查询(ID即客户端提交的参数本例是即)再将查询结果返回给客户端如果这里客户端故意提交这么一个网址
http://localhost/lawjia/showasp?ID= and user>这时服务器运行Select * from 表名 where 字段= and user>这样的查询当然这个语句是运行不下去的肯定出错错误信息如下
·错误类型
Microsoft OLE DB Provider for ODBC Drivers (xE)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 sonybb 转换为数据类型为 int 的列时发生语法错误
/lawjia/showasp 第 行
但是别有用心的人从这个出错信息中可以获得以下信息该站使用MS_SQL数据库用ODBC连接连接帐号名为sonybb所谓SQL注入(SQL Injection)就是利用程序员对用户输入数据的合法性检测不严或不检测的特点故意从客户端提交特殊的代码从而收集程序及服务器的信息从而获取想得到的资料通常别有用心者的目标是获取网站管理员的帐号和密码比如当某个人知道网站管理员帐号存在表login中管理员帐号名为admin他想知道管理员密码这里他从客户端接着提交这样一个网址
http://localhost/lawjia/showasp?ID= and (Select password from login where user_name=admin)>返回的出错信息如下
·错误类型
Microsoft OLE DB Provider for ODBC Drivers (xE)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 !@#*&admin 转换为数据类型为 int 的列时发生语法错误
/lawjia/showasp 第 行
你知道吗?上面标红的部分就是管理员帐号admin的密码!虽然很复杂让人看几遍也记不住的但它就这样显示在你面前了这时您就可以用这个帐号和密码接管人家的网站了!这时你可能还会说如果他不是事先知道管理员帐号存在表login中而且知道管理员帐号为admin那他就不可能获得管理员密码你错了只要人家愿意多花时间尝试他将可以获得数据库连接帐号权限内所能获得的所有信息!具体过程请参看网上的这篇文章SQL注入天书之ASP注入漏洞全接触
当然这个过程是很烦琐的而且要花费很多的时间如果只能以这种手动方式进行SQL注入入侵的话那么许多存在SQL注入漏洞的ASP网站会安全很多了不是漏洞不存在了而是利用这个漏洞入侵的成本太高了但是如果利用专门的黑客工具来入侵的话那情况就大大不同了手动方式进行SQL注入入侵至少需要半天或一天乃至很多天的时间而利用专门的工具来入侵就只需要几分钟时间了(视网速快慢决定)再利用获得的管理帐号和密码上传一个从网上下载的ASP后门程序就轻易获得整个网站的管理权限了甚至整个服务器的管理权限最有名的一种SQL注入入侵工具是NBSI 现在已经出到版本了不过人家正式名称不叫SQL注入入侵工具而叫做网站安全漏洞检测工具有了这个所谓的检测工具使得入侵存在SQL注入漏洞的ASP网站成了小儿科的游戏那些既不懂ASP又不懂SQL年纪小小的男性青年常常得以在一天之内入侵十多个ASP网站他们以此获得内心的极大满足他们似乎也非常讲究职业道德往往并不破坏网站数据和系统常见的破坏方式大都仅仅是改换掉网站的主页留下善意的警告如你的网站存在SQL注入漏洞请管理员做好防范措施!并声明我没有破坏数据和系统有的还要借机发布一下他的倡导国内网站大家不要入侵有本事入侵小日本的!最后签上他的鼎鼎大名是必不可少的程序
如此大的成就多数情况下仅需动动鼠标就做到了打开最新版的NBSI 如图所示输入地址到A区注意网址必须是带传递参数的那种点击右边的检测按钮即出来B区信息显示当前用户为sonybb的权限为PUBLIC当前库为lawjia有点可惜啊如果是SA权限的话就可以跨库注入了不过这个权限也足够获取该网站管理员帐号和密码了点C区下的自动猜解按钮即出来当前库lawjia中的各种表哇login表中一定是存管理员帐号和密码的吧?选中它吧接着点击D区下的自动猜解按钮立即出来login表里的列名称果然是存放用户名和密码的啊太棒了!赶快打上勾迫不急待的点击E区下的自动猜解按钮激动人心的时刻就要到来啦只见唰唰地几下帐号与密码全部出来了剩下的事就是辨别哪一个帐号是管理员了
图(图中的示例网站在作者本地电脑上运行)
不知那些没注意过SQL注入漏洞的ASP程序员们看了上图的例子要作何感想呢?是不是觉得这个所谓的网站安全漏洞检测工具SBSI 简直就是MS_SQL的企业管理器呢?只不过人家不需要帐号和密码就可以查看您数据库里的所有信息了如果您的网站就这样被人不费吹灰之力入侵了您是不是要吐几升血了呢?也许您已经为系统安全费尽心思了装补丁安防火墙装杀毒软件巧妙配置IIS及数据库用户权限但您就是没有注意到SQL注入漏洞于是千里之堤溃于蚁穴防火墙与杀毒软件对SQL注入是没办法防范的因为SQL注入入侵跟普通的WEB页面访问没什么区别所以往往是防不甚防而且一个服务器上放置的网站往往是有很多个的服务器管理员不可能挨个网站挨个页面的审查其是否存在SQL注入漏洞那么应该如何防范SQL注入入侵呢?作为服务器管理员或网站程序员应该分别怎么做呢?服务器管理员要做的事主要是配置IIS和数据库用户权限而网站程序员主要是要在程序代码编写上防范SQL注入入侵下面详细叙述
对了服务器管理员既然你不可能挨个检查每个网站是否存在SQL注入漏洞那么就来个一个绝招这个绝招能有效防止SQL注入入侵而且省心又省力效果真好!SQL注入入侵是根据IIS给出的ASP错误提示信息来入侵的如果你把IIS设置成不管出什么样的ASP错误只给出一种错误提示信息即http 错误那么人家就没办法入侵了具体设置请参看图主要把:这个错误的默认提示页面 C:\WINDOWS\Help\iisHelp\common\asp改成
C:\WINDOWS\Help\iisHelp\common\htm即可这时无论ASP运行中出什么错服务器都只提示HTTP错误
图 IIS出错信息设置
但是这样设置一个不好的地方是程序员编写的代码出错时服务器不给出详细的错误提示信息会给程序员带来很大的不便不过服务器毕竟不是测试代码的地方应坚持安全稳定第一这样设置也是无可厚非的事实上许多服务器的出错信息都是如此设置
服务器管理员还应在IIS中为每个网站设置好执行权限可千万别给人家静态网站以脚本和可执行权限一般情况下给个纯脚本权限就够了对于那些通过网站后台管理中心上传的文件存放的目录就更吝啬一点吧执行权限设为无好了这样做是为了防止人家上传ASP木马执行权限设为无人家上传ASP木马也运行不了一般情况下SQL注入漏洞仅是涉及一个网站安全的事如果人家通过这个漏洞上传了ASP木马并运行起来那整个服务器都失陷了所以有远见的有责任心的服务器管理员应该十分吝啬的配置IIS的执行权限
同样的吝啬态度应适用于数据库用户的权限配置上当然这里数据库是指MS_SQL啦ACCESS都没有用户权限配置这一步骤如果PUBLIC权限足够使用的绝不给再高的权限可千万别把SA级别的权限随随便便地给人家啊那个所谓的网站安全漏洞检测工具NBSI 可有跨库进行SQL注入的功能啊如果你把SA权限给了存在SQL注入漏洞的库那其它库就不保啦!城门失火殃及池鱼呀而人家还可以通过调用xp_cmdshell命令得到系统的最高权限具体步骤还是请参看上面提到的那篇《SQL注入天书之ASP注入漏洞全接触》这篇文章吧
接下来要讲讲程序员的防范措施了程序主要要做两件事最重要的一件事当然是对客户端提交的变量参数进行仔细地检测啦对客户端提交的变量进行检查以防止SQL注入有各种方法到http://communitycsdnnet/上搜索一下你能获得许多有益信息这里介绍一种现成的方法别人已经写好了检测代码拿来用一下不用自己辛苦啦那就是枫叶SQL通用防注入V ASP版这是一段对用户通过网址提交过来的变量参数进行检查的代码发现客户端提交的参数中有execinsertselectdeletefromupdatecountuserxp_cmdshelladdnetAsc等用于SQL注入的常用字符时立即停止执行ASP并给出警告信息或转向出错页面大家可以到网上搜索一下下载这段代码存为一个ASP页面如checkSQLasp把这个页面include到每个需要带参数查询SQL数据库ASP页面中记住只要加一行这样的<!#include file=checkSQLasp>代码就行了
程序员要做的第二件事是给用户密码加密啦比如用MD加密MD是没有反向算法不能解密的人家即使知道经加密后存在数据库里的像乱码一样的密码他也没办法知道原始密码了不过人家可以用UPDATE方法用他的密码代替你的密码但这个操作还是有点麻烦人家可能会怕麻烦而放弃而那个所谓的网站安全漏洞检测工具NBSI 是没有提供UPDATE操作功能的所以用MD加密后人家仅用NBSI 而不辅以手动操作的话就不可能获得网站管理员帐号的密码这将挡住许多菜鸟级的攻击者至少那些既不懂ASP又不懂SQL年纪小小的男性青年是没有办法啦!
文章写到这已经够长了本来还想对那些所谓的网站安全漏洞检测工具如NBSI之流的黑客工具进行一番理性的探讨的看来还是放弃好了为了增强网站安全了解攻击手段是必须的但是利用漏洞开发专门的黑客工具使那些其实并不具备必要的网络技术和网络安全知识的人(就是文中提到的既不懂ASP又不懂SQL年纪小小的男性青年)轻而易举地侵入一家网站这除了为许多网络管理员制造麻烦外是否还具有加强网络安全意识提高网络安全水平的功效呢?