SQL注入详解-3
第三节、判断数据库类型及注入方法
不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP 最常搭配的数据库是Access 和SQLServer ,网上超过99% 的网站都是其中之一。 怎么让程序告诉你它使用的什么数据库呢?来看看: SQLServer 有一些系统变量,如果服务器IIS 提示没关闭,并且SQLServer 返回错误提示的话,那可以直接从出错信息获取,方法如下: http://www.19cn.com/showdetail.asp?id=49 and user>0 这句语句很简单,但却包含了SQLServer 特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0 ,我们知道,user 是SQLServer 的一个内置变量,它的值是当前连接的用户名,类型为nvarchar 。拿一个nvarchar 的值跟int 的数0 比较,系统会先试图将nvarchar 的值转成int 型,当然,转的过程中肯定会出错,SQLServer 的出错提示是:将nvarchar 值 ”abc ” 转换数据类型为 int 的列时发生语法错误,呵呵,abc 正是变量user 的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。 顺便说几句,众所周知,SQLServer 的用户sa 是个等同Adminstrators 权限的角色,拿到了sa 权限,几乎肯定可以拿到主机的Administrator 了。上面的方法可以很方便的测试出是否是用sa 登录,要注意的是:如果是sa 登录,提示是将”dbo ”转换成int 的列发生错误,而不是”sa ”。 如果服务器IIS 不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access 和SQLServer 都有自己的系统表,比如存放数据库中所有对象的表,Access 是在系统表[msysobjects] 中,但在Web 环境下读该表会提示“没有权限”,SQLServer 是在表[sysobjects] 中,在Web 环境下可正常读取。 在确认可以注入的情况下,使用下面的语句:
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) fromsysobjects)>0
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0
如果数据库是SQLServer 那么第一个网址的页面与原页面
http://www.19cn.com/showdetail.asp?id=49 是大致相同的;而第二个网址,由于找不到表msysobjects ,会提示出错,就算程序有容错处理,页面也与原页面完全不同。 如果数据库用的是Access ,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS 错误提示时的验证。