獲得額外的數據
當然,對于一個攻擊程序,盡管它不知道任何顧客的ID,甚至不用去猜,它也可以獲得數據。為了完成這個工作,它將下面的文本輸入到應用程序調用顧客ID的textbox中:
customer ID:
'UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>'
如果你輸入了這個代碼,你將會看到返回一個詢問語句:
SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>''
通過獲得空和非空顧客的ID并集,這個查詢語句會返回數據庫中所有的相關姓名。事實上,這個UNION技術可以被用來獲得你數據庫中大多數信息,看看這個CustomerID的值:
'UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>'
它將SQL語句變成:
SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>''
看,那就是攻擊程序從你的數據庫獲得的第一個雇員的名字。
更多的攻擊程序
如果SQL注入僅僅只有數據暴光這個弱點就已經夠糟糕的了,但是,實際上一個良好的攻擊程序可以通過這個弱點獲取你數據庫中所有的資料?聪旅孢@個例子:
';DROP TABLE Customers;--
SQL語句變成:
SELECT ContactName FROM Customers
WHERE CustomerID = ''
; DROP TABLE Customers;-- '
這個分號使語句和SQL Server隔離,所以,這里實際上是兩個語句。第一個語句不存在的名字,第二個則撤消的整個Customers表。兩個—SQL Server注釋符,它可以使子句不發生語法錯誤。
使用這個技術的變異,一個攻擊程序可以在任何SQL語句或者存儲過程上運行。通過使用xp_cmdshell擴展存儲過程,一個攻擊程序同樣可以在操作系統命令下運行,顯然,這是一個嚴重的漏洞。
保護自己的數據庫
現在,你知道如何防范SQL注入攻擊了嗎?首先,你不能在用戶輸入中構造WHERE子句,你應該利用參數來使用存儲進程。在最初的ASP頁面下,重新寫的部分將和剛才我們在表中所看到的東西相似。即使你認為在你的應用程序中沒有脆弱點,你應該遵守最小特權原則。使用我們建議的其他安全技術允許你的用戶僅僅訪問他們能夠訪問的。在你沒有發現你數據庫脆弱點的時候,只有這樣,不會使你的數據庫崩潰。
最后的建議
這就是全部的SQL Server安全系列。也許你現在不是一個全面的專家,但是你已經了解了很多反面。下一步就是你要保護你SQL Server數據,記住你在這里所學到的知識,并利用到你的數據庫中保證你的數據不被那些黑客攻擊。
文章來源于領測軟件測試網 http://www.kjueaiud.com/