攻:
1. 擷取資料庫的結構資訊:
攻擊者要成功實施一次攻擊,需要瞭解哪個表和列可用。SQL Server預設的行為是,當不正確查詢運行時返回錯誤訊息。例如攻擊者輸入使用者名稱:“'having 1=1;--”,資料庫將返回包含表名和代碼查詢中第一列的錯誤訊息;而group by語句可以更進一步確定查詢中的列:“'group by 表名.列名 having 1=1;--”,資料庫將返回查詢中的下一列;攻擊者可以繼續附加group by語句,直到不再收到錯誤訊息。
2. 擷取資料庫內容資訊:
攻擊者可以利用變換錯誤訊息,擷取資料庫中儲存的資料,例如輸入使用者名稱:“'union select min(username),1 from Users where username>1;--”,資料庫將返回表中的第一個使用者名稱。攻擊者可以使用同樣的SQL注入,用password代替username得到使用者賬戶的密碼,以此類推,可以擷取資料庫表中的每條記錄。
3. 修改資料庫和內容:
攻擊者通過“';”來結束一條查詢語句,然後附加破壞性的SQL語句,例如:“';delete from Accounts”或“';insert into Users (……)”。
4. 縮短查詢條件:
攻擊者通過縮短查詢條件來繞過身份認證過程,例如輸入使用者名稱“admin'--”或“' or a==a--”
防:
用戶端的任何輸入(欄位,查詢字串參數,Cookie等)都是不安全的,雖然Asp.Net提供了一些驗證控制項,但這些控制項都是產生用戶端指令碼在用戶端進行校正,雖然使用這些控制項可以減少頁面的住返次數,改善使用者體驗,但是不要僅僅依賴於此,因為駭客可以很容易避過用戶端指令碼。
1. 過濾或轉義危險字元:string.Replace("'","''")或正則;
通常我們要定義合法字元,再檢查輸入是不是在合法字元範圍之內;而不是校正是否包含危險字元,因為非法的情況太多了,很容易漏掉。過濾是一種不理想的構思,因為“危險的”字元可能是使用者輸入的有效部分。另外,攻擊者可以使用ASCII十六進位字元和其他字元來通過驗證,例如用0x2C來代替單引號(')。
2. 參數化SQL查詢或預存程序:
SqlParameter可以提供類型和長度檢查,並自動轉義使用者輸入。
3. 使用最小特權:
將資料庫使用者能執行的動作限制到最少,絕對不要使用sa賬戶,因為sa具有操作資料庫的所有許可權。
4. 在伺服器上處理錯誤:
成功的SQL注入攻擊不一定導致錯誤;導致錯誤的SQL注入通常是攻擊者正在收集資料庫資訊,是攻擊的前兆。在try..catch..finally中處理錯誤;<compilation debug="false"/>;<customErrors mode="RemoteOnly"/>。
一般綜合運用這些方法...
Stop SQL Injection Attacks Before They Stop You
新型SQL截斷攻擊和防禦方法
SQL注入技術和跨站指令碼攻擊的檢測
在ASP.NET中防止注入攻擊