隨著WEB應(yīng)用的日益豐富,越來越多的傳統(tǒng)企業(yè)開始使用WEB應(yīng)用來開展在線業(yè)務(wù),與此同時,黑客也將攻擊技術(shù)研究的重點(diǎn)轉(zhuǎn)到了WEB應(yīng)用方面,從而加劇了WEB應(yīng)用的安全風(fēng)險(xiǎn)。
- 2021年2月,國內(nèi)某知名投資機(jī)構(gòu)遭遇黑客攻擊,投資者個人和財(cái)務(wù)信息恐被竊取,此次數(shù)據(jù)泄露事件將導(dǎo)致公司該財(cái)年成本增加。
- 2021年4月,某知名計(jì)算機(jī)廠商遭到了勒索軟件攻擊,勒索軟件團(tuán)伙REvil成功入侵宏碁的系統(tǒng),并公布了企業(yè)部分的財(cái)務(wù)電子表格、銀行對賬單,索要的贖金達(dá)到5000萬美元。
同時有數(shù)據(jù)顯示,有約98%的網(wǎng)站曾經(jīng)遭受黑客攻擊,黑客的襲擊一直是行業(yè)性的問題,從互聯(lián)網(wǎng)發(fā)展至今從未間斷過。
本次將分享基于業(yè)務(wù)安全的Web測試,將分為6個板塊來進(jìn)行演示介紹。分別為:基于業(yè)務(wù)的安全測試,暴力破解,篡改登錄用戶名信息,截包篡改手機(jī)短信/E-mail驗(yàn)證碼、橫向越權(quán)—查看與修改、刪除、CSRF token。
基于業(yè)務(wù)安全的測試
舉個例子:在一個電商企業(yè)的系統(tǒng)中,假設(shè)現(xiàn)有庫存貨品20個,單價(jià)為30元,買家現(xiàn)有資金100元,購1個,那么當(dāng)前庫存為19個,買家所剩資金為70元。若在代碼編寫階段沒有控制購買數(shù)量只能大于0的話,可能會出現(xiàn)一種情況,客戶可以在購買數(shù)量欄填寫負(fù)數(shù),如-3,就會出現(xiàn)剩余數(shù)量為22,客戶剩余資金為160的情況。該漏洞產(chǎn)生的根本原因是沒有控制用戶輸入的購買數(shù)量必須大于0,這就是所謂的基于業(yè)務(wù)安全的漏洞。

在《性能之巔》一書中的闡述了這么一個觀點(diǎn):知識可以分為已知的已知的知識;已知的未知的知識和未知的未知的知識。我們把已知的未知改為未知的已知。根據(jù)業(yè)務(wù)安全測試可一一對應(yīng):
已知的已知=已知的已經(jīng)出現(xiàn)的BUG,即該BUG已經(jīng)出現(xiàn)過,已有應(yīng)對方法,只需實(shí)施修改即可;
未知的已知=未知的已經(jīng)出現(xiàn)的BUG,即已經(jīng)出現(xiàn)在程序的BUG,但還沒有找到,可通過腳本式測試或者探索式測試來應(yīng)對;
未知的未知=未知的沒有驗(yàn)證的模塊,即未出現(xiàn)的BUG,但有出現(xiàn)的可能性。
通過已知的bug可預(yù)知新的bug的出現(xiàn),可通過探索式測試,找到并在軟件開發(fā)測試之前進(jìn)行以預(yù)防為主的測試。例如要基于Python的Djiango內(nèi)的Web應(yīng)用框架編寫代碼,那么已經(jīng)可知當(dāng)訪問數(shù)據(jù)庫時,不要使用傳統(tǒng)的Python訪問數(shù)據(jù)庫的方式,而要采用Djiango自帶的MTV的結(jié)構(gòu)去訪問數(shù)據(jù)庫,就可避免SQL注入的缺陷。

對于TDD概念,是現(xiàn)代軟件開發(fā)中非常重要的概念之一,以測試用例為驅(qū)動的測試方法,要求開發(fā)人員,開發(fā)出符合測試用例的程序,然后通過測試用例對程序進(jìn)行驗(yàn)收,這被叫做“測試先行的開發(fā)”。
但并不一定都是自動化測試,可以根據(jù)腳本來進(jìn)行測試,也可以基于word或者Excel格式的文本化的用例來進(jìn)行測試,只需要將事先寫好的測試用例供開發(fā)人員參考,可以在開發(fā)階段進(jìn)行就避免了,這樣爭取做到測試用例中出現(xiàn)的bug不出程序中發(fā)現(xiàn)。
但是如何發(fā)現(xiàn)BUG主要看傳統(tǒng)安全測試與基于安全的測試的區(qū)別,而傳統(tǒng)的安全測試是以預(yù)防為主的,業(yè)務(wù)安全測試是以測試為主的。
暴力破解
暴力破解——Burp suite測試工具。
步驟:
1、設(shè)置internet網(wǎng)絡(luò)代理:在瀏覽器中設(shè)置代理經(jīng)常會遇見一些bug,因此不建議使用瀏覽器設(shè)置。使用控制面板設(shè)置網(wǎng)絡(luò)代理,首先打開控制面板,點(diǎn)擊網(wǎng)絡(luò)和internet,再點(diǎn)擊INTERNET選型,點(diǎn)擊局域網(wǎng)設(shè)置,勾中代理服務(wù)器下的兩個設(shè)置,并設(shè)置地址為127.0.0.1,端口為8888;取消自動配置下的兩個設(shè)置,即可點(diǎn)擊確認(rèn),確認(rèn)后再檢查一遍確認(rèn)無誤之后代理設(shè)置即完成。

2、啟用Burp suite:安裝Burp suite后,Burp suite需要安裝JAVA環(huán)境才可以運(yùn)行 需要先安裝JDK1.8版本,再通過漢化啟動,啟動進(jìn)入Burp suite。
3、禁用攔截請求:在代理工具下的截?cái)喙δ苤嘘P(guān)閉攔截請求,變?yōu)閿r截禁用。
4、修改代理監(jiān)控器:在代理工具下的選項(xiàng)功能中改變默認(rèn)端口,默認(rèn)端口為8080端口,與Tomcat是沖突的,因此把監(jiān)聽端口改為8888,并選擇指定地址。

5、啟動被測程序:打開被測程序,并用瀏覽器進(jìn)入該程序。
6、進(jìn)入登錄頁面:通過Command(命令提示符號)窗口,輸入IP config,將IP config中顯示無線局域網(wǎng)適配地址復(fù)制,到登錄頁面上將地址127.0.0.1改為該登錄地址,再次登錄,由于傳輸過程中,使用了SHA256進(jìn)行傳輸,所以選擇用戶名與密碼時可發(fā)現(xiàn),密碼會變得很長。

7、啟用攔截:成功登錄后就可以開始抓包,將攔截禁用改為攔截請求,啟用后開始攔包。
8、登錄操作:返回登錄頁面輸入用戶名密碼登錄,發(fā)現(xiàn)頁面不變。
9、攔截包:因?yàn)榘驯籅urp suite直接攔截。
10、發(fā)往測試器:將攔截的包發(fā)送至intruder,在測試器中會對默認(rèn)選項(xiàng)進(jìn)行標(biāo)記,成為參數(shù),我們只需要針對用戶名和密碼進(jìn)行暴力破解,將不需要進(jìn)行參數(shù)化的選項(xiàng)前的§刪除,由于存在CSRF token,需要把值保持一致,最后剩下兩個參數(shù):用戶名與密碼。


11、設(shè)置攻擊類型:這里選用集束炸彈攻擊,攻擊類型有兩種:音叉攻擊與集束炸彈。音叉攻擊是用戶名與密碼一一對應(yīng)的,需要兩組字典,每組字典中的一行對應(yīng)另一組的對應(yīng)行;集束炸彈是在賬號密碼均未知的情況下,對他們同時進(jìn)行暴力破解,需要兩組字典,每組字典的賬號,密碼都會去匹配另一組的賬號所有的密碼。

12、載入攻擊字典:再點(diǎn)擊有效負(fù)荷,清屏后載入事先設(shè)置好的用戶名和密碼。
13、設(shè)置有效負(fù)載處理:密碼傳輸過程中需要進(jìn)行SHA256加密處理,所以在有效負(fù)載處理中選擇合適的Hash算法。
14、開始攻擊:以上步驟設(shè)置完畢,就可以開始攻擊。若破解不成功,在“響應(yīng)”的body里會看到“用戶名或者密碼錯誤”,若破解成功,則響應(yīng)代碼是直接302反向跳轉(zhuǎn)。使用Burp suite進(jìn)行暴力破解,就這個案例,可參考字節(jié)長度或者狀態(tài)來判斷是否成功,沒有成功破解的是直接返回登錄頁面,因此字節(jié)數(shù)較長,而破解成功的字節(jié)數(shù)不需要跳轉(zhuǎn),因此字節(jié)數(shù)比較短。
暴力破解的注意事項(xiàng):
1、 不要使用瀏覽器自帶的代理設(shè)置,選擇 “控制面板”中的internet-連接中的設(shè)置。
2、 不用勾選“使用自動配置腳本”。
3、 打開Burp suite,先禁用攔截,配置環(huán)境,環(huán)境配置完畢,再啟用攔截。
4、 如下圖,“起動中”前的√一定要勾上。
5、 截包必須使用真實(shí)IP地址,不要使用127.0.0.1或localhost,用Command里面的用IP config。
6、 破解字典是區(qū)分大小寫的。

暴力破解——JMeter測試工具
打開控制面板,啟動程序,用網(wǎng)頁打開測試程序能否使用,確認(rèn)能使用后,打開JMeter,在登錄界面打開事先準(zhǔn)備好的腳本,由于JMeter無法使用集束炸彈,因此使用音叉方法來進(jìn)行,需要一個用戶名對應(yīng)一個密碼,然后進(jìn)行發(fā)包。

在登錄驗(yàn)證界面可查看,登錄驗(yàn)證字體是綠色的即是破解成功,紅色的則是失敗。找到成功破解的綠色登錄驗(yàn)證,再通過Debug Sampler找到用戶名與密碼。
注意所有通過Burp suite進(jìn)行測試的工作均可以通過JMeter實(shí)現(xiàn)。
暴力破解看似對白帽黑客并無用處,實(shí)際上并非如此,一般程序都是由用戶自行設(shè)置用戶名與密碼的,企業(yè)可以先行對產(chǎn)品進(jìn)行一次暴力破解,篩選出過于簡單易被破解的密碼,用郵件或者短信的方式通知用戶修改用戶名與密碼,甚至可以設(shè)定強(qiáng)制性修改密碼。若能提供這樣的服務(wù),則能給用戶帶來更好的體驗(yàn)感,這種情況下,測試可以作為一項(xiàng)增值業(yè)務(wù)。
篡改用戶名登錄信息
測試步驟:
1、 設(shè)置internet網(wǎng)絡(luò)代理
2、 啟動Burp suite
3、 進(jìn)入登錄頁面
4、 輸入用戶名、密碼
5、 攔截請求包
6、 修改cookies用戶名為未注冊用戶
7、 發(fā)送請求包
8、 觀察情況
輸入已注冊過的A的用戶名密碼進(jìn)行登錄,打開Burp suite,登錄后抓包模塊會被截取,在此輸入登錄信息,會看見A的用戶名與密碼的信息,用戶名是放在username的cookie中的,點(diǎn)擊“行動”選擇發(fā)送到repeater中,在repeater里,可以改cookie-username為已有的另一用戶名B,最終登錄的是A的賬號,而顯示的是B的用戶名。點(diǎn)擊發(fā)送,可進(jìn)入商品列表,若我們把用戶名改為一個未注冊過的用戶,cookie中顯示的是該新用戶,發(fā)送后仍可進(jìn)入商品列表。這就是存在的一個缺陷,對于此缺陷,可采用以下方法防御:

篡改用戶名、密碼
從正常的修改密碼流程中使用Burp suite攔截發(fā)送用戶名和手機(jī)號請求信息,修改手機(jī)號,并再次發(fā)送,然后觀察它的表現(xiàn)。
用手機(jī)、短信或者郵件找回密碼的方式都是類似的。在數(shù)據(jù)庫中存有已注冊用戶的用戶名、密碼、郵箱、電話等信息,而且密碼是通過SHA256進(jìn)行加密的,是一個長字符串。當(dāng)用戶使用短信驗(yàn)證輸入用戶名與手機(jī)號時,若與數(shù)據(jù)庫中信息一致,則會通過手機(jī)發(fā)回驗(yàn)證碼,重設(shè)密碼;若是在傳輸過程中,手機(jī)號碼被截取,收到驗(yàn)證碼后會在輸入新密碼時提示信息被截取,驗(yàn)證碼錯誤。
再打開代理,Burp suite啟用攔截,在網(wǎng)頁中再次點(diǎn)擊獲取驗(yàn)證碼,包就已被Burp suite攔截。點(diǎn)擊“行動”選擇發(fā)送給repeater,在repeater里,改變手機(jī)號碼,再發(fā)送請求,在響應(yīng)包中并沒有顯示用戶名與密碼,而是顯示“注冊的用戶名和手機(jī)不匹配”請重新輸入。這樣就已經(jīng)成功篡改用戶名與密碼,黑客可將驗(yàn)證碼發(fā)送至自己手機(jī),在通過這個頁面獲取密碼,輸入驗(yàn)證碼,而后修改用戶名與密碼,手機(jī)、短信或者郵箱都可通過截取傳送的信息進(jìn)行篡改。

橫向越權(quán)——查看、刪除
橫向越權(quán)指的是攻擊者嘗試訪問或修改與他擁有相同權(quán)限的用戶的資源。以上述電商網(wǎng)站為例:

查看:當(dāng)?shù)卿汚用戶的賬號后,我們可以查看該用戶的各類信息,建立訂單,拷貝訂單URL地址,再登錄B用戶賬號,逐一粘貼訂單信息URL地址,查看是否有權(quán)限查看。
修改與刪除:在A用戶登錄后拷貝修改用戶配貨信息地址后,建立訂單,拷貝刪除用戶訂單信息,再登錄B用戶賬號,試圖刪除前面拷貝所得的A用戶的信息。
CSRF token
破解CSRF token
為了防止DDoS攻擊,一個用戶一天只允許輸入用戶名密碼3次,若是超過3次輸入,則存在一個暴力破解的可能性,賬號就會被封掉。黑客應(yīng)對這一情況最常用的方法就是在本地復(fù)制地址,將action改為絕對路徑,再通過Burp suite進(jìn)行暴力破解,獲取相應(yīng)內(nèi)容。
該方法采用的是通過一個token,在地址里加一個hidden字段,設(shè)置100個隨機(jī)長度的字符串,此方法為Djiango的解決方案。

當(dāng)我們往服務(wù)器或客戶端發(fā)送請求時,帶有一個middle ware hidden的字段,并其名為CSRF token的這么COOKIE的字段,發(fā)送至服務(wù)器后,服務(wù)器自動檢測兩個值是否相等,若相等,則返回Web匹配,否則返回403不匹配。

在這種情況下,可以人為在form表單中加一個hidden字段,但是在cookie中無法加,因此cookie中沒有hidden字段,與100長度的字段不匹配,故而報(bào)403錯誤。
比如在JMeter中,可以通過正則表達(dá)式獲得參數(shù),將100長度的字符串的token值取代,獲取到token里的字段后,通過建立一個cookie manager,往CSRF token中發(fā)送該字段,同時往csrfmiddleware里發(fā)送COOKIE token的值。這樣兩個值肯定是一樣的,CSRF token被破解。
若使用python中的requests類來寫接口測試,則可以將這100個字符串放在一個變量中,設(shè)在cookie里通過request post 傳輸,同時觸發(fā)body里的username、password和一個hidden字段,此時兩個值是相等的,CSRF token就能被破解。

Web的安全測試是一個很大的題目,在如今web應(yīng)用發(fā)展越來越蓬勃的時刻,隨著手機(jī)技術(shù)、html5帶來了許多新的挑戰(zhàn)和機(jī)遇,Web安全技術(shù)也應(yīng)該緊跟時勢的發(fā)展,不斷演變地更好。