如何測試WEB應用程序防止SQL注入攻擊
摘要:
在WEB應用程序的軟件測試中,安全測試是非常重要的一部分,但常常容易被忽視掉。在安全測試中,防止SQL注入攻擊尤其重要。本文介紹了SQL注入攻擊產生的后果以及如何進行測試。
關鍵字:安全測試 SQL 注入攻擊 防火墻
正文:
WEB應用程序的安全測試,防止SQL注入攻擊,下面舉一些簡單的例子加以解釋。——Inder P Singh。
許多應用程序運用了某一類型的數據庫。測試下的應用程序有一個接受用戶輸入的用戶界面,這些輸入值用來執行下列任務。
給用戶顯示相關的存儲數據。例如,程序通過用戶輸入的登錄信息檢查用戶憑證(權限),從而只顯示相關的功能和數據。
將用戶輸入的數據存儲到數據庫中。例如,用戶填寫了一張表格并提交,程序立即將之存儲到數據庫中;從而,用戶可以在本次會話和下次會話中獲取這些數據。
一些用戶輸入值可能會被接下來程序將執行的SQL語句運用到,而程序有可能不會正確執行用戶輸入的值。如果是這樣的話,蓄意用戶可以向程序提供非法數據,這些數據接下來被運用到框架中并且用來在數據庫中執行SQL語句。這就是SQL注入。該行為的結果令人鳴起警鐘。
SQL注入可能導致以下結果:
用戶可以以另一用戶的身份登錄到程序,甚至是管理員的身份。
用戶可以看到其他用戶的隱私信息,如其他用戶的簡介細節,交易細節。
用戶可以修改應用程序配置信息以及其他用戶的數據。
用戶可以修改數據庫的結構,甚至是刪除應用數據庫中的表格。
用戶可以控制數據庫服務器并且按照自己意愿隨意執行命令。
因為允許SQL注入的結果是相當嚴重的,所以在應用程序的安全測試階段應對SQL注入進行測試。通過對SQL注入技術有一個總體的概括,讓我們來理解一些SQL注入的實際例子!
重點:SQL注入問題只能在測試環境中測試
若應用程序頁面有登錄功能,程序有可能使用如下所示的動態SQL語句。這條語句本應從用戶表中返回至少一條用戶詳細信息作為結果,當SQL語句中含有輸入的用戶名和密碼時。
SELECT * FROM Users WHERE User_Name = ‘” & strUserName & “‘ AND Password = ‘” & strPassword & “’;” |
如果測試人員輸入John作為用戶名(用戶名文本框),輸入Smith作為密碼(密碼文本框),上述SQL語句就變成:
SELECT * FROM Users WHERE User_Name = ‘John’ AND Password = ‘Smith’ |
如果測試人員輸入John’-作為用戶名,不輸入密碼,那么SQL語句變成:
SELECT * FROM Users WHERE User_Name = ‘John’– AND Password = ‘’; |
我們可以注意到,SQL語句中John后面的部分成為了注釋。如果用戶表中有一些用戶用戶名為“John”,那么程序能夠允許測試人員以用戶John的身份登錄,這樣,測試人員可以看到用戶John的隱私信息。
如果測試人員不知道任何程序中已存在的用戶該怎么辦呢?在這種情況下,測試人員可以嘗試相似的用戶名像“admin”,“administrator”,“sysadmin”。如果這些用戶名在數據庫中都不存在,測試人員可以輸入John’ or ‘x’=’x作為用戶名,Smith’ or ‘x’=’x作為密碼。那么SQL語句如以下所示:
SELECT * FROM Users WHERE User_Name = ‘John’ or ‘x’='x’ AND Password = ‘Smith’ or ‘x’=’x’; |
因為‘x’=’x’這一條件總是成立的,結果集包含用戶表中所有行。程序允許測試人員以用戶表中第一個用戶的身份登錄進去。
重點:測試人員在嘗試下列SQL注入之前應該請求擁有數據庫管理員或者開發人員權限以備份有問題的表格。
如果測試人員輸入John’; DROP table users_details;’—作為用戶名,任意值作為密碼,那么SQL語句如下所示:
SELECT * FROM Users WHERE User_Name = ‘John’; DROP table users_details;’ –‘ AND Password = ‘Smith’; |
這條語句將造成表格“users_details”從數據庫中永久刪除。
雖然上述例子說明的是頁面中登錄功能上運用SQL注入技術,但是測試人員應在應用程序中所有接受用戶輸入的頁面運用該技術測試,如搜索頁面,反饋頁面等等。
SQL注入可能出現在運用了SSL的程序中,即使是防火墻也不能防御SQL注入攻擊。
本文中,我盡量以簡單的形式解釋SQL注入技術。再次強調,SQL注入只能在測試環境中測試,不能再開發環境,生產環境或者其他任何環境下測試。除了手工測試程序是否易受SQL注入攻擊,我們還應該使用web vulnerability scanner(一款掃描工具)來檢查SQL注入。