攻:
1. 獲取數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息:
攻擊者要成功實(shí)施一次攻擊,需要了解哪個(gè)表和列可用。SQL Server默認(rèn)的行為是,當(dāng)不正確查詢運(yùn)行時(shí)返回錯(cuò)誤消息。例如攻擊者輸入用戶名:“'having 1=1;--”,數(shù)據(jù)庫(kù)將返回包含表名和代碼查詢中第一列的錯(cuò)誤消息;而group by語(yǔ)句可以更進(jìn)一步確定查詢中的列:“'group by 表名.列名 having 1=1;--”,數(shù)據(jù)庫(kù)將返回查詢中的下一列;攻擊者可以繼續(xù)附加group by語(yǔ)句,直到不再收到錯(cuò)誤消息。
2. 獲取數(shù)據(jù)庫(kù)內(nèi)容信息:
攻擊者可以利用變換錯(cuò)誤消息,獲取數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),例如輸入用戶名:“'union select min(username),1 from Users where username>1;--”,數(shù)據(jù)庫(kù)將返回表中的第一個(gè)用戶名。攻擊者可以使用同樣的SQL注入,用password代替username得到用戶賬戶的密碼,以此類推,可以獲取數(shù)據(jù)庫(kù)表中的每條記錄。
3. 修改數(shù)據(jù)庫(kù)和內(nèi)容:
攻擊者通過“';”來結(jié)束一條查詢語(yǔ)句,然后附加破壞性的SQL語(yǔ)句,例如:“';delete from Accounts”或“';insert into Users (……)”。
4. 縮短查詢條件:
攻擊者通過縮短查詢條件來繞過身份認(rèn)證過程,例如輸入用戶名“admin'--”或“' or a==a--”
防:
客戶端的任何輸入(字段,查詢字串參數(shù),Cookie等)都是不安全的,雖然Asp.Net提供了一些驗(yàn)證控件,但這些控件都是生成客戶端腳本在客戶端進(jìn)行校驗(yàn),雖然使用這些控件可以減少頁(yè)面的住返次數(shù),改善用戶體驗(yàn),但是不要僅僅依賴于此,因?yàn)楹诳涂梢院苋菀妆苓^客戶端腳本。
1. 過濾或轉(zhuǎn)義危險(xiǎn)字符:string.Replace("'","''")或正則;
通常我們要定義合法字符,再檢查輸入是不是在合法字符范圍之內(nèi);而不是校驗(yàn)是否包含危險(xiǎn)字符,因?yàn)榉欠ǖ那闆r太多了,很容易漏掉。過濾是一種不理想的構(gòu)思,因?yàn)椤拔kU(xiǎn)的”字符可能是用戶輸入的有效部分。另外,攻擊者可以使用ASCII十六進(jìn)制字符和其他字符來通過驗(yàn)證,例如用0x2C來代替單引號(hào)(')。
2. 參數(shù)化SQL查詢或存儲(chǔ)過程:
SqlParameter可以提供類型和長(zhǎng)度檢查,并自動(dòng)轉(zhuǎn)義用戶輸入。
3. 使用最小特權(quán):
將數(shù)據(jù)庫(kù)用戶能執(zhí)行的動(dòng)作限制到最少,絕對(duì)不要使用sa賬戶,因?yàn)閟a具有操作數(shù)據(jù)庫(kù)的所有權(quán)限。
4. 在服務(wù)器上處理錯(cuò)誤:
成功的SQL注入攻擊不一定導(dǎo)致錯(cuò)誤;導(dǎo)致錯(cuò)誤的SQL注入通常是攻擊者正在收集數(shù)據(jù)庫(kù)信息,是攻擊的前兆。在try..catch..finally中處理錯(cuò)誤;<compilation debug="false"/>;<customErrors mode="RemoteOnly"/>。
一般綜合運(yùn)用這些方法...
Stop SQL Injection Attacks Before They Stop You
新型SQL截?cái)喙艉头烙椒?nbsp;
SQL注入技術(shù)和跨站腳本攻擊的檢測(cè)
在ASP.NET中防止注入攻擊
浙公網(wǎng)安備 33010602011771號(hào)