前言
H5移動(dòng)應(yīng)用作為個(gè)人生活、辦公和業(yè)務(wù)支撐的重要部分,也面臨著來自移動(dòng)平臺(tái)的安全風(fēng)險(xiǎn),不僅僅來自于病毒,更多的是惡意的攻擊行為、篡改行為和釣魚攻擊。關(guān)于H5頁(yè)面的安全測(cè)試,業(yè)務(wù)邏輯功能測(cè)試基本和WEB滲透測(cè)試是通用的。
從業(yè)務(wù)安全角度考慮,一般客戶端與服務(wù)端通信會(huì)進(jìn)行加密,防止被刷單、薅羊毛等攻擊,需要對(duì)數(shù)據(jù)加密加密處理。所以我們必須了解各種加密方式。開發(fā)者常會(huì)用到AES(Advanced Encryption Standard)加密算法,在此對(duì)H5頁(yè)面的漏洞挖掘案例分享給大家。
前置知識(shí)
AES加密模式介紹
AES加密的模式主要有五種:ECB (電子密碼本模式)、CBC(密碼分組連接模式)、CTR(計(jì)算器模式)、CFB(密碼反饋模式)、OFB (輸出反饋模式)。這五種工作模式主要是在加密器的使用上有所區(qū)別。在這里主要介紹下ECB和CBC這兩種開發(fā)者最常用的兩種加密方式。
ECB模式
其使用方式是一個(gè)明文分組加密成一個(gè)密文分組,相同的明文分組永遠(yuǎn)被加密成相同的密文分組。直接利用加密算法分別對(duì)每個(gè)64位明文分組使用相同的64位密鑰進(jìn)行加密。每個(gè)明文分組的處理是相互獨(dú)立的。
優(yōu)點(diǎn):
簡(jiǎn)單。
有利于并行計(jì)算。
缺點(diǎn):
相同的明文塊會(huì)加密成相同的密文塊,安全性低。
CBC模式
引入一個(gè)初始向量IV,它的作用跟MD5加鹽有些類似,可以防止相同的明文塊加密成同樣的密文塊。IV是初始向量,參與第一個(gè)明文塊的異或,后續(xù)的每一個(gè)明文塊,都與它前一個(gè)密文塊相異或。這樣就能保證相同的明文塊不會(huì)被加密為相同的密文塊。 優(yōu)點(diǎn):能隱蔽明文的數(shù)據(jù)模式,在某種程度上能防止數(shù)據(jù)篡改, 諸如明文組的重放,嵌入和刪除等,安全性高。 缺點(diǎn):無法并行計(jì)算,性能相對(duì)ECB低,會(huì)出現(xiàn)錯(cuò)誤傳播(errorpropagation)。
案例
在一次金融行業(yè)的漏洞挖掘過程中,從發(fā)現(xiàn)請(qǐng)求和返回?cái)?shù)據(jù)包全程加密。我們?cè)撊绾瓮黄茢?shù)據(jù)包加密,并自動(dòng)化暴力破解登陸。繼續(xù)深度挖掘發(fā)現(xiàn)存在越權(quán)漏洞,最終獲取大量賬戶敏感信息。
發(fā)現(xiàn)加密
瀏覽器訪問H5頁(yè)面登錄接口。
隨意輸入一個(gè)手機(jī)號(hào)和密碼,點(diǎn)擊登陸。利用Burp抓包查看,發(fā)現(xiàn)請(qǐng)求和響應(yīng)數(shù)據(jù)包全過程加密。
破解加密算法
右鍵查看登陸網(wǎng)頁(yè)源代碼尋找加密方法:
點(diǎn)擊登錄調(diào)用前端onLoginBtnClick方法,獲取用戶請(qǐng)求數(shù)據(jù)requestData,在調(diào)用ajax請(qǐng)求中發(fā)送未加密的數(shù)據(jù)內(nèi)容。
ajax請(qǐng)求函數(shù)postData:全局搜索postData函數(shù),最終在common.js找到。在發(fā)送請(qǐng)求中發(fā)現(xiàn)加解密函數(shù):加密函數(shù)encrypt和解碼函數(shù)decrypt。
因?yàn)橐话悴寮膉s文件都是非格式化存儲(chǔ)的,調(diào)試時(shí)非格式化文件不能直觀顯示,我們格式化代碼后再調(diào)試查看。發(fā)現(xiàn)使用AES加密ECB模式PKCS7Padding填充,密鑰key硬編碼在js代碼中。
我們編寫Python腳本解密登錄請(qǐng)求數(shù)據(jù)包,成功拿到明文請(qǐng)求數(shù)據(jù)包。
由于登錄沒有驗(yàn)證碼機(jī)制。我們可以利用登陸接口和服務(wù)端返回的提示信息,可以批量枚舉平臺(tái)用戶手機(jī)號(hào),而且發(fā)現(xiàn)登陸密碼是純6位數(shù)字,首選密碼是123456,進(jìn)行嘗試自動(dòng)化暴力破解。
在執(zhí)行Python腳本的時(shí)候,發(fā)現(xiàn)不允許重放請(qǐng)求數(shù)據(jù)包,那肯定是存在簽名校驗(yàn),用于防止攻擊者重放請(qǐng)求數(shù)據(jù)包。
通過diff請(qǐng)求數(shù)據(jù)包,確認(rèn)是校驗(yàn)請(qǐng)求頭中的replayId值。我們?nèi)ゴa中定位replayId值是如何生成的。
在JS文件中搜索replayId,發(fā)現(xiàn)replayId變量是調(diào)用guid函數(shù)賦值的。
繼續(xù)定位guid函數(shù),到這里我們已經(jīng)成功拿到請(qǐng)求和響應(yīng)數(shù)據(jù)包的加解密過程,和guid生成的過程。
編寫Python的execjs執(zhí)行js代碼,偽造guid值。
自動(dòng)化腳本
繼續(xù)編寫python代碼,完成自動(dòng)化暴力破解登陸。萬事具備,那離成功就差一個(gè)手機(jī)號(hào)字典了。
通過前期的信息收集,整理出一份高質(zhì)量的手機(jī)號(hào)字典,幸福來的太突然,成功爆破出一個(gè)手機(jī)號(hào)和密碼。
成功登陸用戶賬戶:
繼續(xù)深度挖掘,發(fā)現(xiàn)通過修改請(qǐng)求數(shù)據(jù)包中的mobilephone參數(shù),還可以越權(quán)查看他人銀行卡額度信息,包括卡ID、可用額度、已使用額度等。
總結(jié)
- 遇到全程加密數(shù)據(jù)包,我們首先分析前端JS文件,發(fā)現(xiàn)使用AES加密ECB模式PKCS7Padding填充,密鑰key硬編碼在js代碼中,編寫腳本破解加密算法。又發(fā)現(xiàn)利用請(qǐng)求頭中的replayId值,防止攻擊者重放請(qǐng)求數(shù)據(jù)包。通過全局搜索發(fā)現(xiàn)replayId變量是調(diào)用guid函數(shù)賦值的,繼續(xù)編寫Python腳本完成自動(dòng)化的暴力破解,成功登陸,深入漏洞挖掘。
- 后續(xù)我們可以寫一個(gè)Burp插件,更便捷我們后續(xù)的漏洞挖掘。可以參考如下:
- https://github.com/Ebryx/AES-Killer
本文轉(zhuǎn)載自: 酒仙橋6號(hào)部隊(duì)
如若轉(zhuǎn)載,請(qǐng)注明出處: https://mp.weixin.qq.com/s






