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