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

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

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

2、啟用Burp suite:安裝Burp suite后,Burp suite需要安裝JAVA環境才可以運行 需要先安裝JDK1.8版本,再通過漢化啟動,啟動進入Burp suite。
3、禁用攔截請求:在代理工具下的截斷功能中關閉攔截請求,變為攔截禁用。
4、修改代理監控器:在代理工具下的選項功能中改變默認端口,默認端口為8080端口,與Tomcat是沖突的,因此把監聽端口改為8888,并選擇指定地址。

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

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


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

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

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

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

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

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

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

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

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

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