致測試同仁們:讓我們做安全測試吧!

今天,很多的軟件并沒有經(jīng)過專門的安全測試就被放到互聯(lián)網(wǎng)上,它們攜帶著各類安全漏洞暴露在公眾面前,其中一些漏洞甚至直指軟件所承載的核心敏感信息或業(yè)務(wù)邏輯。這些漏洞一旦被不懷好意者利用,很可能會給企業(yè)造成經(jīng)濟(jì)損失。帶來負(fù)面聲譽(yù)影響的同時(shí),還可能被起訴、遭到罰款等等,細(xì)思極恐。其中的一部分原因是企業(yè)本身安全意識不強(qiáng),但是很多時(shí)候雖然軟件企業(yè)已經(jīng)開始意識到這些問題,卻苦于缺少專業(yè)的安全測試人員,他們不得不冒著極大的風(fēng)險(xiǎn)先上線賭一把運(yùn)氣再說。

既然如此,作為質(zhì)量代言人的我們,怎能對此置之不理呢?

你也許會問?怎么理?安全測試水太深了。

安全測試并不遙遠(yuǎn)

是的,安全測試在軟件測試?yán)锩媸且粋€(gè)很特別的科目(或作“工種”),很多人都覺得這個(gè)科目應(yīng)該全權(quán)交給神秘的安全測試人員來管。這個(gè)觀念導(dǎo)致很多測試人員徘徊在安全測試的門口卻遲遲不進(jìn)去,包括我自己。

直到后來,我非常有幸能夠在不同規(guī)模的軟件開發(fā)項(xiàng)目上跟“神秘的安全測試人員”學(xué)習(xí)如何進(jìn)行安全測試,發(fā)現(xiàn)“神秘的安全測試人員”不光是名字跟我們一樣都有“測試”二字,所做的事情在本質(zhì)上也跟我們測試人員有很多相通之處。

想想看我們都做過什么:

我們修改過url的參數(shù),對不對?他們也是!
我們在數(shù)據(jù)輸入處提供過不合法的數(shù)據(jù),對不對?他們也是!
我們嘗試過修改只讀數(shù)據(jù),對不對?他們也是!
我們也測過用戶會話是否如期timeout,對不對?他們也是!

Ok,這還不是全部。他們也做測試計(jì)劃、測試用例設(shè)計(jì)、bug分析與管理等等。所以,安全測試離我們并沒有那么遙遠(yuǎn)。

當(dāng)然,我必須承認(rèn),安全測試是非常復(fù)雜的。一個(gè)專業(yè)的安全測試專家在某種程度上來說是一個(gè)全棧工程師。所以,想要在安全測試上一夜成才不太容易。不過好消息是,作為測試人員的我們卻有得天獨(dú)厚的優(yōu)勢,使我們能夠在安全測試上快速起步,幫助團(tuán)隊(duì)盡快展開預(yù)防并檢測安全漏洞的工作。
在這里我想要跟大家分享一下在敏捷開發(fā)團(tuán)隊(duì)中如何利用我們的測試經(jīng)驗(yàn)開展安全測試。

安全測試并不陌生

首先,讓我們先來了解什么是安全測試,我們作為測試人員有什么可以直接用上的技能和經(jīng)驗(yàn)。
簡單來說,安全測試其實(shí)就是一個(gè)發(fā)現(xiàn)軟件安全漏洞的過程,旨在保護(hù)軟件系統(tǒng)的數(shù)據(jù)與功能。它跟常規(guī)測試相似的地方至少有以下幾點(diǎn):

圖表.png

1. 目標(biāo)類似
不管是常規(guī)測試還是安全測試,都有一個(gè)原則:預(yù)防勝于檢測。這個(gè)比較容易理解,不管是常規(guī)測試的缺陷也好,還是安全測試的漏洞也好,如果能預(yù)防使它不發(fā)生,就省了后期的修復(fù)與驗(yàn)證工作。如果不能成功的預(yù)防缺陷,能早一些發(fā)現(xiàn)的話,肯定比晚發(fā)現(xiàn)的修復(fù)的成本低。

2. 在軟件生命周期中的過程類似

以敏捷開發(fā)團(tuán)隊(duì)為例,常規(guī)測試人員在各個(gè)階段做的事情,安全測試人員也要做:

  • 了解業(yè)務(wù)的需求,以避免混亂的測試優(yōu)先級;
  • 針對業(yè)務(wù)與系統(tǒng)功能設(shè)計(jì)用例:常規(guī)測試需要關(guān)注系統(tǒng)功能,安全測試同樣也不能脫離系統(tǒng)功能;
  • 與其他角色一起啟動需求的開發(fā):溝通測試用例,避免因?yàn)闇贤ú蛔阍斐煞倒ぃ?/li>
  • 與其他角色一起在開發(fā)環(huán)境驗(yàn)收需求:盡早提供反饋,發(fā)現(xiàn)缺陷時(shí)開發(fā)可以馬上修正
  • 在測試環(huán)境進(jìn)行全面測試:針對端到端的場景進(jìn)行測試,盡可能把第三方系統(tǒng)(如果有的話)也包括進(jìn)來;
  • 分析并總結(jié)測試結(jié)果:整理問題清單,排列優(yōu)先級;
  • 反饋測試結(jié)果:把測試結(jié)果反饋給團(tuán)隊(duì)等干系人。

3. 測試用例很多重合

在面向終端用戶的測試場景上,常規(guī)測試的用例與安全測試的用例是非常類似的。比如對于登錄系統(tǒng)的功能,不管是常規(guī)測試還是安全測試,我們都會測試用戶輸入正確的用戶名是否可以登錄,輸入錯(cuò)誤的用戶名或密碼系統(tǒng)會如何反應(yīng)。

比如我曾經(jīng)工作的一個(gè)搜集報(bào)稅人信息的系統(tǒng),不管是常規(guī)測試還是安全測試,都會測試系統(tǒng)的登錄,系統(tǒng)信息的錄入與編輯,文件的上傳等等。因?yàn)樵诿恳粋€(gè)終端用戶可以操作的場景上,都可能會有安全漏洞存在。所以,有了常規(guī)測試的經(jīng)驗(yàn),我們就相當(dāng)于有了不少安全測試用例的儲備。

4. 都需要有探索的過程

測試是一個(gè)了解軟件系統(tǒng)能否完成我們預(yù)期的過程,也是探索系統(tǒng)還有哪些我們沒有預(yù)期的行為的過程。安全測試的過程需要把探索的目標(biāo)轉(zhuǎn)向安全漏洞。當(dāng)我們這么做時(shí),我們同樣會得到很多探索的樂趣。

5. 都要有測試人員必備的“懷疑態(tài)度”

相信咱們測試人員都非常熟悉一個(gè)場景--開發(fā)人員說:“我只做了一個(gè)很小的代碼改動。”然后我們帶著友好而警惕的態(tài)度,發(fā)現(xiàn)這個(gè)“很小的改動”引發(fā)了很大的問題。不管是在安全測試還是非安全測試,這個(gè)警惕性是我們都需要保持的良好傳統(tǒng)。

那么,有了這么多類似的地方,還缺什么呢?如果想要做專家,還差很多。但是如果想馬上安全測試上起步,我們可以先做下面的改變。

安全測試從何做起

第一,轉(zhuǎn)換視角

在我看來,不管是帶著全棧的經(jīng)驗(yàn),還是只有部分技術(shù)知識,想要做好安全測試必須先轉(zhuǎn)換我們觀察軟件的視角。舉個(gè)例子,讓我們看看下這幅畫:

同樣一幅畫,有人一眼看過去看到的是兩個(gè)人臉,而有人看到的是一個(gè)花瓶。這就是觀察視角的不同造成的。

在我剛開始接觸安全測試時(shí)就很深的體會到了這一點(diǎn)。當(dāng)時(shí)我在測試一個(gè)Web應(yīng)用的用戶登錄功能。當(dāng)我輸入錯(cuò)誤的用戶名來試著登陸時(shí),瀏覽器上的提示信息為“該用戶名不存在”。當(dāng)我嘗試正確的用戶名而錯(cuò)誤的密碼時(shí),提示信息變成“密碼輸入錯(cuò)誤?!睂τ谶@個(gè)清晰的錯(cuò)誤提示我非常滿意。試想我若是一個(gè)真實(shí)的終端用戶,這個(gè)信息有效的幫助我縮小糾錯(cuò)范圍,提高效率,非常好。

可是,就在我身邊坐著的安全測試人員馬上跳了出來:“這個(gè)提示信息需要改!敏感信息暴露了!”看到我一臉茫然,這位安全測試人員告訴我,通過我們的提示信息,惡意的系統(tǒng)使用者可以推測出哪些用戶名已經(jīng)存在于系統(tǒng)中,然后利用這些用戶名可以再進(jìn)行密碼的暴力破解,縮小破解的范圍。所以,這個(gè)信息雖然為合法用戶提供了便利,也為不懷好意的系統(tǒng)使用者提供了便利。而往往這種便利為惡意的系統(tǒng)使用者帶來的好處遠(yuǎn)大于給合法用戶帶來的好處。

這個(gè)經(jīng)歷在讓我受震動的同時(shí),也使我意識到可能很多安全漏洞之前就擺在我的面前了,我卻沒有看出來,因?yàn)槲野阉鼈冞^濾了。事實(shí)證明,在后來經(jīng)歷的不同項(xiàng)目中,當(dāng)我轉(zhuǎn)換了視角,有些安全漏洞不需要我去找,而是自己跑到我眼前來的。真是得來全不費(fèi)功夫。

第二,改變測試中模擬的對象

為了能從不同的視角來觀察軟件,我們必須改變我們所模擬的對象。這也是一個(gè)讓我們刻意練習(xí)轉(zhuǎn)換視角的有效方法。

我們在做非安全測試的時(shí)候通常把自己想象成一個(gè)合法用戶,然后開始驗(yàn)證系統(tǒng)是否能完成預(yù)設(shè)的目標(biāo)。比如對于一個(gè)網(wǎng)上商城,我們會驗(yàn)證系統(tǒng)是否能讓用戶完成商品的瀏覽與購買,我們也會測試一些異常的行為,比如購買的商品數(shù)量不是數(shù)字而是一串無意義的字母時(shí),看系統(tǒng)是否能比較優(yōu)雅的做出回應(yīng)。我們這么測試的目的往往是為了確保用戶誤操作以后還能夠繼續(xù)他們的購買,或者說不要給系統(tǒng)造成什么嚴(yán)重的傷害。

如果要做安全測試,我們則必須去模擬系統(tǒng)的另一類使用者-惡意用戶。他們的目的是尋找系統(tǒng)中可鉆的漏洞。比如同樣是一個(gè)網(wǎng)上商城,惡意用戶的目標(biāo)之一就是要想辦法以較少的錢,甚至不付錢就能拿到商品。所以,如果惡意用戶進(jìn)行了“誤操作”,他們不會停留在“誤操作”,而是通過“誤操作”來看系統(tǒng)是否給自己提供更多的線索。

所以,我們需要轉(zhuǎn)換測試時(shí)所模擬的對象,把思維從一個(gè)合法用戶的視角中拉出來,轉(zhuǎn)換成一個(gè)惡意用戶。這需要一點(diǎn)時(shí)間,就如同之前看到的畫,如果我們一開始看到的是人臉,要想下一次第一眼看到的是花瓶,我們需要時(shí)間來刻意練習(xí)。

第三,使用專用的測試工具

有了思維的轉(zhuǎn)換,我們可以加入新的測試想法。但是,在具體做安全測試的時(shí)候我們會發(fā)現(xiàn)并不是那么容易去模擬惡意用戶的行為。畢竟系統(tǒng)的前端會給我們設(shè)置很多的屏障。而且惡意用戶可不總是從系統(tǒng)前門進(jìn)去的。這時(shí)候,使用一些工具,比如OWASP Zap(https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project)、Burp(https://portswigger.net/burp/)等是非常有幫助的。我們可以在系統(tǒng)界面上執(zhí)行功能測試的用例,用這些工具來獲取http請求,篡改后發(fā)送給后臺服務(wù)器。有了這些實(shí)用又比較容易上手的工具,我們就可以執(zhí)行很多惡意用戶的操作場景了。

能做到這三點(diǎn),起步就基本夠用了。

舉個(gè)栗子吧??

下面讓我們以網(wǎng)上商城的買家在商品評價(jià)中上傳圖片這個(gè)功能來講講如何實(shí)踐這“三板斧”。假設(shè)我們從項(xiàng)目初期就加入了,那么我們大致有七件事情要做:

  1. 識別系統(tǒng)中有價(jià)值的數(shù)據(jù);
  2. 在需求分析階段加入惡意用戶需求;
  3. 針對惡意用戶需求設(shè)計(jì)測試用例;
  4. 參與啟動惡意需求的開發(fā);
  5. 在開發(fā)環(huán)境驗(yàn)收惡意需求的實(shí)現(xiàn);
  6. 在測試環(huán)境中進(jìn)行安全測試;
  7. 向團(tuán)隊(duì)反饋所發(fā)現(xiàn)的安全漏洞。

不要擔(dān)心,這不是7個(gè)全新的事情。只是在每個(gè)需要測試人員出現(xiàn)的地方增加了安全的工作而已。

1. 識別系統(tǒng)中有價(jià)值的數(shù)據(jù)
很多人認(rèn)為執(zhí)行測試才是測試,而我們的安全測試從這里就開始了。
了解業(yè)務(wù)之后,我們需要考慮系統(tǒng)中會有什么有價(jià)值的數(shù)據(jù)。這是為下一步加入惡意用戶需求做準(zhǔn)備。對于一個(gè)網(wǎng)上商城,有價(jià)值的數(shù)據(jù)可能包括產(chǎn)品信息、訂單信息、用戶信息、支付,等等。
這個(gè)環(huán)節(jié)對我們測試人員來說并沒有太多額外的工作,畢竟我們做非安全測試的時(shí)候也需要了解業(yè)務(wù)。不過要注意了,我們要測試的“圖片上傳功能”是一個(gè)涉及有價(jià)值數(shù)據(jù)的功能。我們需要提高警惕了。

2. 在需求階段加入惡意用戶需求
惡意用戶需求是用來記錄惡意用戶想要在系統(tǒng)中達(dá)到的目的。與普通用戶需求的區(qū)別是,我們不是要去實(shí)現(xiàn)它,而是使用它來幫助我們遠(yuǎn)離對系統(tǒng)使用者“不恰當(dāng)?shù)男湃巍?。通常我們需要針對每一個(gè)合法用戶需求來增加一個(gè)或多個(gè)相對應(yīng)的惡意用戶需求。

舉個(gè)例子,如果我們這個(gè)“圖片上傳功能”的合法用戶需求為:作為一個(gè)買家,我想在對商品進(jìn)行評價(jià)的時(shí)候上傳圖片作為買家秀,以便于參加返現(xiàn)營銷活動。那么對應(yīng)的惡意用戶需求可以是:為一個(gè)惡意用戶,我想破壞買家秀返現(xiàn)活動,以便破壞商城的營銷活動?!捌茐馁I家秀返現(xiàn)活動”是一個(gè)大的目標(biāo)。為了設(shè)計(jì)用例方便,它可以被細(xì)分為一系列小目標(biāo)。比如讓用戶無法上傳圖片、讓頁面無法正確顯示圖片等等。

有了惡意用戶需求的主干信息,我們就可以開始下一步設(shè)計(jì)安全測試用例了。

3. 針對“惡意用戶需求”設(shè)計(jì)測試用例
現(xiàn)在我們需要做的是努力把自己限制在“惡意用戶”的角度做頭腦風(fēng)暴:“到底有什么方法可以使買家無法上傳圖片信息呢?”, “讓頁面無法正確顯示買家秀圖片又怎么做到?”嗯,也許最直接的辦法就是讓服務(wù)器所在的機(jī)房斷電、斷網(wǎng)之類的。這是些不錯(cuò)的想法,雖然執(zhí)行難度有點(diǎn)大。沒關(guān)系,記錄下來。除此之外,我們還可以有其他測試用例,比如:

  • 使存儲圖片的磁盤空間被占滿而無法接受新的圖片;
  • 使處理上傳圖片的進(jìn)程繁忙而無法接受新的上傳任務(wù);
  • 上傳特別大的圖片使用戶的客戶端需要很長時(shí)間才能下載完
  • 上傳偽裝成圖片的惡意代碼,進(jìn)一步獲取服務(wù)器權(quán)限,刪除所有的買家秀圖片;
  • 等等

如果這個(gè)時(shí)候想到新的測試用例也同樣記錄下來,比如“我想不購買也上傳買家秀圖片以獲得返現(xiàn)”之類的。
不用太擔(dān)心這個(gè)階段的測試用例過于“瘋狂”或者不夠完整,畢竟我們對于系統(tǒng)的實(shí)現(xiàn)還不是很了解。我們會在接下來的環(huán)節(jié)中完善具體的步驟。

4. 參與啟動惡意需求的開發(fā)(evil story kickoff)
在開發(fā)人員開始開發(fā)合法用戶需求之前,我們需要跟業(yè)務(wù)分析人員、開發(fā)人員一起溝通需求的內(nèi)容。在敏捷軟件開發(fā)項(xiàng)目中我們叫它story kickoff,即用戶故事啟動。當(dāng)有了對應(yīng)的惡意用戶需求時(shí),我們必然也要把它也加到啟動的范圍里。目的是把我們頭腦風(fēng)暴出來的測試用例跟所有的角色來溝通。預(yù)防勝于檢測。

5. 在開發(fā)環(huán)境驗(yàn)收惡意需求的實(shí)現(xiàn)

100%預(yù)防軟件的缺陷與漏洞是不太可能的,所以這個(gè)環(huán)節(jié)的存在是為了提早反饋。
我曾經(jīng)經(jīng)歷過一個(gè)項(xiàng)目,都快上線了才決定做安全測試,結(jié)果測出來的問題之一是用戶會話(user session)不能正確過期的問題,經(jīng)過一番研究,發(fā)現(xiàn)需要對系統(tǒng)設(shè)計(jì)的架構(gòu)進(jìn)行比較大的修改,只能做個(gè)臨時(shí)的修復(fù)讓系統(tǒng)先上線,然后再把系統(tǒng)的架構(gòu)給改了,重寫這部分功能,重新測試。代價(jià)非常高。所以不管是安全測試還是非安全測試,”在開發(fā)環(huán)境驗(yàn)收惡意需求的實(shí)現(xiàn)“這個(gè)步驟都不能缺少。

而這個(gè)環(huán)節(jié)存在的第二個(gè)目的是讓我們可以從開發(fā)人員那里得到支持-具體實(shí)施的細(xì)節(jié),幫助我們完善具體的測試用例。比如在這個(gè)時(shí)間點(diǎn)我們?nèi)魪拈_發(fā)人員那里得知系統(tǒng)的后臺沒有對圖片上傳者做身份驗(yàn)證,我們就可以至少增加一個(gè)測試的用例:“惡意用戶以其他用戶的身份上傳一個(gè)風(fēng)馬牛不相及的圖片”。有時(shí)候錯(cuò)誤的圖片比沒有圖片更具有殺傷力。

6. 在測試環(huán)境中進(jìn)行安全測試
終于到了運(yùn)行測試的階段??赡苓@個(gè)時(shí)候我們之前想到的測試用例已經(jīng)被開發(fā)人員給解決了。如果是這樣那就太好了。但是,事實(shí)并非有這么美好。第一,可能這些用例只是在開發(fā)環(huán)境上成功通過了,但是在理想的測試環(huán)境里,也就是類產(chǎn)品環(huán)境里,這些用例可能并不能完全通過;第二,肯定還有其他需要探索的地方。這時(shí)我們就可以用OWASP Zap、Burp這樣的工具來輔助我們把之前的安全測試用例執(zhí)行一次,同時(shí)還再可以對系統(tǒng)的安全性做一下探索測試。

7. 向團(tuán)隊(duì)反饋所發(fā)現(xiàn)的安全漏洞
都測得差不多的時(shí)候,我們就可以向團(tuán)隊(duì)以及相關(guān)干系人匯報(bào)安全測試的結(jié)果了。跟非安全測試不同的地方是,當(dāng)我們反饋安全漏洞的時(shí)候,要考慮不同漏洞結(jié)合起來是否會增加系統(tǒng)的安全風(fēng)險(xiǎn)。舉個(gè)例子:如果有兩個(gè)安全漏洞,一個(gè)是系統(tǒng)沒有很強(qiáng)的用戶賬戶密碼規(guī)規(guī)則,另一個(gè)是系統(tǒng)沒有對上傳圖片的大小做限制,那么惡意用戶把這兩個(gè)漏洞一結(jié)合起來,事情就比原來風(fēng)險(xiǎn)大很多。那么我們就必須建議提高這兩個(gè)漏洞中任意一個(gè)的優(yōu)先級。

當(dāng)我們用“三板斧”走完這七步以后,我們已經(jīng)可以把很多安全漏洞都挖出來了。是不是沒有想象中的難?所以,測試同仁們,讓我們做安全測試吧!


更多精彩洞見,請關(guān)注微信公眾號:思特沃克

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容