軟件Web安全性測試—SQL注入
因為要對網站安全性進行測試,所以,學習了一些sql注入的知識。
在網上看一些sql注入的東東,于是想到了對網站的輸入框進行一些測試,本來是想在輸入框中輸入<script>alter("abc")<script>,但是輸入框有字符限制,只好輸入<script>,結果網站出大問題了,呵呵,終于又出現了個bug。
另一個就是在URL最后隨意輸入一些字符或數字,結果,新聞模塊那出現了問題,暴露了網站的一些信息,又一個bug,高興下……
下面把今天看到的有關SQL注入方面的知識整理如下:
SQL注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后將該字符串傳遞到SQL Server的實例以進行分析和執行。任何構成SQL語句的過程都應進行注入漏洞檢查,因為SQL Server將執行其接收到的所有語法有效的查詢。一個有經驗的、堅定的攻擊者甚至可以操作參數化數據。
SQL注入的主要形式包括直接將代碼插入到與SQL命令串聯在一起并使其得以執行的用戶輸入變量。一種間接的攻擊會將惡意代碼注入要在表中存儲或作為元數據存儲的字符串。在存儲的字符串隨后串連到一個動態SQL命令中時,將執行該惡意代碼。
注入過程的工作方式是提前終止文本字符串,然后追加一個新的命令。由于插入的命令可能在執行前追加其他字符串,因此攻擊者將用注釋標記“--”來終止注入的字符串。執行時,此后的文本將被忽略。
以下腳本顯示了一個簡單的SQL注入。此腳本通過串聯硬編碼字符串和用戶輸入的字符串而生成一個SQL查詢:
var Shipcity;
ShipCity = Request.form. ("ShipCity");
var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'";
用戶將被提示輸入一個市縣名稱。如果用戶輸入Redmond,則查詢將由與下面內容相似的腳本組成:
SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond'
但是,假定用戶輸入以下內容:
Redmond'; drop table OrdersTable--
此時,腳本將組成以下查詢:
SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond';drop table OrdersTable--'
分號(;)表示一個查詢的結束和另一個查詢的開始。雙連字符(--)指示當前行余下的部分是一個注釋,應該忽略。如果修改后的代碼語法正確,則服務器將執行該代碼。SQL Server處理該語句時,SQL Server將首先選擇OrdersTable中的所有記錄(其中ShipCity為Redmond)。然后,SQL Server將刪除OrdersTable。
只要注入的SQL代碼語法正確,便無法采用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,并仔細檢查在您所用的服務器中執行構造SQL命令的代碼。本主題中的以下各部分說明了編寫代碼的最佳做法。
驗證所有輸入:
始終通過測試類型、長度、格式和范圍來驗證用戶輸入。實現對惡意輸入的預防時,請注意應用程序的體系結構和部署方案。請注意,設計為在安全環境中運行的程序可能會被復制到不安全的環境中。以下建議應被視為最佳做法:
如果一個用戶在需要郵政編碼的位置無意中或惡意地輸入了一個10 MB的MPEG文件,應用程序會做出什么反應?
如果在文本字段中嵌入了一個DROP TABLE語句,應用程序會做出什么反應?
測試輸入的大小和數據類型,強制執行適當的限制。這有助于防止有意造成的緩沖區溢出。
輸入字符 在Transact-SQL中的含義
; 查詢分隔符。
' 字符數據字符串分隔符。
-- 注釋分隔符。
/* ... */ 注釋分隔符。服務器不對/*和*/之間的注釋進行處理。
xp_ 用于目錄擴展存儲過程的名稱的開頭,如xp_cmdshell。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/