渗透测试之SQL注入(二)

Access 数据库 注入攻击基本技术

1. 爆出数据库类型

SQL Server有一些系统变量和系统表,如果服务器IIS提示没关闭,并且SQL Server返回错误提示的话,可以直接从出错信息中获取判断数据库的类型(后面会给大家讲解如何突破IIS提示被关闭)。

1.1 内置变量爆数据库类型

“User”是SQL Server的一个内置变量,它的值是当前连接的用户名,其变量类型为“nvarchar"字符型。通过提交查询该变量,根据返回的出错信息即可得知数据库类型。方法是在注入点之后提交如下语句。

and user>0

该查询语句会将user对应的nvarchar型值与int数字型的0进行对比,两个数据类型不一致,因此会返回出错信息。

如果提示如下出错信息

Microsoft OLE DB Provider for SQL Server 错误'80040e21'

将nvarchar值'****'转换为数据类型为int的列时发生语法错误。

/home/yz/yu/show.asp

则可以判断是MS SQL数据库。如果采用的是Access数据库的话,那么提示信息则会如下


Access数据库不会显示类型转换错误

1.2 内置数据库表爆数据库类型

如果服务器IIS不允许返回错误提示,通常可以通过数据库内置的系统数据表来进行判断。在注入点后提交如下查询语句。

and  (select count(*)  from sysobjects)>=O

and (select count(*)  from msysobjects)>=O

Access存在系统表[msysobjects],不存在“sysobjects”表。因此如果数据库采用的是Access,会返回如下提示错误信息(图5)。

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e37'

/home/yz/yu/show.asp, 行 8

[Microsoft][ODBC Microsoft Access Driver] Microsoft Jet数据库引擎找不到输入表或查询'sysobjects'。确定它是否存在,以及它的名称的拼写是否正确。

在MS SQL Serve:存在系统表[sysobjects],不存在[msysobjects]系统表,因此会返回如下错误提示信息为(图6).

Microsoft OLE DB Provider for SQL Server 错误 '80040e37'

对象名'msysobjects' 无效。

/home/yz/yu/show.asp, 行 8