攻擊方式學(xué)習(xí)之SQL注入(SQL Injection)第3/3頁
更新時(shí)間:2008年09月06日 12:34:30 作者:
有些網(wǎng)站將直接拿用戶的輸入 來拼接SQL語句,進(jìn)行查詢等操作,同時(shí)也將錯(cuò)誤信息暴露給用戶。
探測
非常簡單,輸入一個(gè)單引號('),看頁面是否出錯(cuò),要是頁面出錯(cuò)了,而且又將錯(cuò)誤信息暴露給你了那就太好了。
從錯(cuò)誤信息中觀察確定是哪種數(shù)據(jù)庫,比如Access,SQL Server等。不同數(shù)據(jù)庫的SQL語句有些差別
靜態(tài)代碼分析,從代碼中檢查SQL語句是否是由字符串拼接而成。
實(shí)施方式
詳見示例網(wǎng)站
危害
變態(tài)性的,服務(wù)器被遠(yuǎn)程控制,想干嘛干嘛。
盜取性的,盜取了數(shù)據(jù)庫中的機(jī)密信息,謀取私利或其他。
破壞性的,直接破壞數(shù)據(jù)庫。
修改性的,篡改數(shù)據(jù),比如通過大學(xué)成績查詢修改成績。
我也沒干過,想不出來了。
防范
在示例中也說明了如何防范,在這里再精煉一下所謂的防止SQL注入四大法寶:
最小權(quán)限原則
特別是不要用dbo或者sa賬戶,為不同的類型的動作或者組建使用不同的賬戶,最小權(quán)限原則適用于所有與安全有關(guān)的場合。
在服務(wù)器端對用戶輸入進(jìn)行過濾
我 們要對一些特殊字符,比如單引號,雙引號,分號,逗號,冒號,連接號等進(jìn)行轉(zhuǎn)換或者過濾;使用強(qiáng)數(shù)據(jù)類型,比如你需要用戶輸入一個(gè)整數(shù),就要把用戶輸入的 數(shù)據(jù)轉(zhuǎn)換成整數(shù)形式;限制用戶輸入的長度等等。這些檢查要放在server運(yùn)行,client提交的任何東西都是不可信的。
以安全的方式創(chuàng)建SQL語句
不要再用萬惡的字符串拼接SQL語句了,使用Parameter對象吧,比如C#中的:
復(fù)制代碼 代碼如下:
string sqlText = "select * from [Users] where UserName = @Name";
SqlParameter nameParm = new SqlParameter("Name", uname);
sqlCmd.CommandText = sqlText;
sqlCmd.Parameters.Add(nameParm);
錯(cuò)誤信息不要暴露給用戶
當(dāng)sql運(yùn)行出錯(cuò)時(shí),不要把數(shù)據(jù)庫返回的錯(cuò)誤信息全部顯示給用戶,錯(cuò)誤信息經(jīng)常會透露一些數(shù)據(jù)庫設(shè)計(jì)的細(xì)節(jié)。
特別注意:也許有很多人告訴過你使用存儲過程能免受SQL注入攻擊。這是錯(cuò)的!這只能阻止某些種類的攻擊。比如存在sp_GetName存儲過程,我們的代碼如下:
復(fù)制代碼 代碼如下:
string name = ...; //name from user
SqlConnection conn = new SqlConnection(...);
conn.Open();
string sqlString = @"exec sp_GetName '" + name + "'";
SqlCommand cmd = new SqlCommand(sqlString, conn);
我們試圖輸入"Black' or 1=1 --"將會失敗,但下面的操作卻是合法的:
exec sp_GetName 'Black' insert into Users values(2008, 'Green') -- '
參考資料
Michael Howard, David LeBlanc. "Writing Secure Code"
Mike Andrews, James A. Whittaker "How to Break Web Software"
http://www.secnumen.com/technology/anquanwenzhai.htm
相關(guān)文章
關(guān)于動網(wǎng)的cookie瀉露站點(diǎn)絕路徑的問題
關(guān)于動網(wǎng)的cookie瀉露站點(diǎn)絕路徑的問題...2006-09-09