軟件測試技術(shù)之安全性測試
安全性測試是一項(xiàng)迫切需要進(jìn)行的測試,測試人員需要像黑客一樣攻擊軟件系統(tǒng),找到軟件系統(tǒng)包含的安全漏洞。
1.網(wǎng)頁安全漏洞檢測
一些設(shè)計(jì)不當(dāng)?shù)木W(wǎng)站系統(tǒng)可能包含很多可以被利用的安全漏洞,這些安全漏洞如同給遠(yuǎn)程攻擊者開了一個(gè)后門,讓攻擊者可以方便地進(jìn)行某些惡意的攻擊。例如,公共漏洞和披露網(wǎng)站CVE(Common Vulnerabilities and Exposures)公布了Element InstantShop中的Web網(wǎng)頁add_2_basket.asp的一個(gè)漏洞項(xiàng),允許遠(yuǎn)程攻擊者通過隱藏的表單變量“price”來修改價(jià)格信息。這個(gè)表單的形式如下所示:
<INPUT TYPE = HIDDEN NAME = "id" VALUE = "AUTO0034">
<INPUT TYPE = HIDDEN NAME = "product" VALUE = "BMW545">
<INPUT TYPE = HIDDEN NAME = "name" VALUE = "Expensive Car">
<INPUT TYPE = HIDDEN NAME = "price" VALUE = "100">
利用這個(gè)漏洞,不懷好意者可以任意設(shè)定price字段的值,然后提交給InstantShop網(wǎng)站的后臺(tái)服務(wù)器,從而可能用100美元就可以獲得一部BMW545。
技巧:發(fā)現(xiàn)類似的安全漏洞的最好方法是進(jìn)行代碼審查。除了代碼審查,測試人員還可以利用一些測試工具進(jìn)行檢查,例如:Paessler Site Inspector、Web Developer等。
2.SQL注入
SQL注入是另外一個(gè)經(jīng)常忽略的安全漏洞,但是SQL注入同時(shí)也是一種非常普遍的代碼漏洞,它會(huì)導(dǎo)致數(shù)據(jù)庫端的敏感數(shù)據(jù)泄漏,或者服務(wù)器受到黑客的控制。例如,下面的一段代碼就存在SQL語句的注入漏洞。
SqlConnection sqlcon = sqlconnA;
//打開連接
sqlcon.Open();
//組合一條查詢語句
SqlCommand cmd = "select count(*) from User where LogonName = ‘" + this.textBox1.Text +”’ and Password = ‘”+this.textBox2.Text;
SqlDataAdapter adpt = new SqlDataAdapter(cmd, sqlcon);
DataSet ds = new DataSet();
adpt.Fill(ds);
//關(guān)閉連接
sqlcon.Close();
//如果返回?cái)?shù)據(jù)不為空,則驗(yàn)證通過
If(ds.Tables[0].Rows.Count>0)
{
retuen true;
}
else
{
Return false;
}
這段代碼從textBox1獲得用戶輸入的用戶名,從textBox2獲得用戶輸入的密碼,然后執(zhí)行數(shù)據(jù)庫查詢操作。假設(shè)在textBox1的輸入框輸入一個(gè)已知的用戶名,然后再做一些手腳,則可以不輸入密碼也能登錄系統(tǒng)。這個(gè)字符串利用了SQL Server對(duì)單引號(hào)的處理方式,只要簡單地組合成類似下面的字符串并輸入到textBox1的輸入框中即可。
Admin' or '1' = '1
這樣就可以利用已知的Admin賬號(hào),不輸入密碼就能登錄系統(tǒng)。因?yàn)榻o預(yù)期的SQL語句注入了額外的語句,所以實(shí)際上提交到SQL Server數(shù)據(jù)庫執(zhí)行的語句變成了如下所示的語句:
select count(*) from user where LogonName = 'Admin' or '1'='1' and Password=''
由于1=1是恒等的,因此返回的結(jié)果肯定為真,從而干擾了用戶信息的正常驗(yàn)證,導(dǎo)致能繞過密碼驗(yàn)證而登錄系統(tǒng)。
技巧:檢查是否存在SQL語句注入漏洞的最好辦法是代碼審查,查看所有涉及SQL語句提交的地方,是否正確處理了用戶輸入的字符串。
3.緩沖區(qū)溢出
不僅僅是連上Internet的軟件系統(tǒng)才會(huì)有安全問題,個(gè)人軟件系統(tǒng)或公司內(nèi)部的軟件系統(tǒng)也存在安全問題,這些安全問題不會(huì)導(dǎo)致信用卡密碼的泄漏,但是可能導(dǎo)致工作成果的丟失。如果軟件系統(tǒng)是采用C語言這類容易產(chǎn)生緩沖區(qū)溢出漏洞的語言開發(fā)的話,作為測試人員就要注意檢查可能造成系統(tǒng)崩潰的安全問題了。
例如,下面的兩行C語言代碼就可能造成緩沖區(qū)的溢出問題:
char buf[20];
gets(buf);
如果使用gets函數(shù)來從stdin讀入數(shù)據(jù),則可能出現(xiàn)緩沖區(qū)溢出的問題。另外一個(gè)例子如下:
char buf[20];
char prefix[] = "http://";
strcpy(buf,prefix);
strncat(buf,path,sizeof(buf));
這里問題出現(xiàn)在sizeof的參數(shù)不應(yīng)該是整個(gè)buf的大小,而是buf的剩余空間大小。
技巧:
測試人員需要對(duì)每一個(gè)用戶可能輸入的地方嘗試不同長度的數(shù)據(jù)輸入,以驗(yàn)證程序在各種情況下正確地處理了用戶的輸入數(shù)據(jù),而不會(huì)導(dǎo)致異常或溢出問題?;蛘咄ㄟ^代碼審查來發(fā)現(xiàn)這些問題。還可以利用一些工具來幫助檢查這類問題,例如AppVerifier等。