【Js逆向】淺析前端加解密

2024年2月6日 19点热度 0人点赞

本文是挖洞高手「Ness_a」分享的技術文章,文章旨在為大傢提供更多的學習方法與技能技巧,文章僅供學習參考。

Ness_a

三年甲方安全工作經驗,負責漏洞挖掘、安全體系架構、IOT安全,是多傢眾測平臺的核心測試人員,蟬聯多傢SRC年榜TOP。

很多Web、H5、APP、小程序為了增加攻擊成本和安全性,會把Request及Response的數據進行加密,這種加密原理其實無非就是在Js文件中調用 1個或者多個Js文件(或函數),把原有的明文信息,按照Js中的加密邏輯生成密文,但這種方式也是可逆的。

本文是我結合實際案例總結出來的一個比較“笨”但是有效的方法,即找到加密位置、copy加密函數、微調直接跑,這個方法其實可以應對大多數的前端加解密,希望對小夥伴們有所借鑒。

分析目標

該H5應用為例,抓包查看,可以看到裡面無論響應包或是請求包關鍵信息都直接是密文。

遇到這種情況,有幾個關鍵步驟:

1.初步分析是何種加密,RSA、AES或者Base64加鹽;

2.加密關鍵字搜索;

3.F12根據API直接斷點調試,逐步跟進堆棧(對於APP的話可能需要逆向APK了,對於微信小程序的話需要找到本地的緩存js);

4.整理記錄加密流程中調用到的函數;

5.提取出關鍵函數並變形。

接下來逐步分析加密過程:

1.觀察bdata中數據,data、key一眼AES,既然是AES那就首先要聯想到如下內容:

(1)AES必帶密鑰

(2)去尋找AES密鑰是否寫死(硬編碼)

(3)如果AES為動態key,找到具體AES函數,分析運行流程

2.既然已知是AES加密,那麼直接F12大法,搜索關鍵字如:AES、AESKEY等,剛好在某js文件裡直接找到了相關函數:

分析該函數,就是剛剛提到過的動態key,既然如此,肯定有其他函數調用了getAesKey(),那先把getAesKey()copy出來,放在txt。

3.已經找到了getAesKey函數,繼續跟進調用到這個函數的位置,繼續F12大法。

第一個搜索結果,一眼引入依賴,直接pass。

第二個就是剛剛那個函數忽略。

直接看第三個搜索

大致看下判斷很像數據加密的一環,依舊txt待宰。

第四個搜索結果如下,直接看到了關鍵特征bdata,放回。

4.細致分析doPostRequest函數,把其中涉及到的所有自定義函數提取出來後,再次放在txt備忘,同時也方便做邏輯梳理(所以說分析算法和細致化滲透時,txt備忘很關鍵)

裡面自定義函數如下:

GetAesKey--encryptData--sendPost--decrypt

翻譯為中文:

獲取AES密鑰、加密數據、發送數據、解密

根據調用的函數名,合理猜測,直接就是主函數,類似於C語言中的main,做各種函數調用,同時也是程序入口。

那就去一步步調試看下,一旦定位到關鍵主函數,笨方法就是直接全打上斷點,一個個去看去分析各種函數會生成什麼樣的值。

先看入參,傳進來了一個API接口並命名為url,data數據就為明文body,這個時候回想一下我們的目標是什麼?我們想要的是可以直接明文輸入,然後js直接把我們的明文加密為後端可識別密文,於是思路就變為,直接在doPostRequest函數做改動,然後自行輸入url和明文,再直接加密輸出。

繼續跟進看下,url就是直接拼接成baseurl api沒啥好說的,把data數據打印出來看下,然後分析這個API接口所在的js文件函數,發現裡面lgParam和ipAdr就是一個固定的值,不管是請求哪個API都要帶上,lgParam裡面是session,ipAdr是IP地址,IdentNo和Itype就是這個API中必填的請求參數。

繼續跟進,調用aesKey函數就直接拿到一個aesKey密鑰。

繼續跟進,可以看到這裡調用了encryptData函數並且傳入了兩個值,一個是data一個是aesKey,所以我們定位到了初步加密的地方和函數。

其實到這裡基本就可以結束了,因為滿足了幾個要素:

(1)明文可控

(2)可以對明文直接進行加密

後面要做的就是繼續跟進函數,把所有doPostRequest函數中有調用到的函數例如:encryptData等等全部copy出來,再把這些子函數調用到的其他函數全都copy出來,然後再改改格式,就可以了,類似於apk的hook。

最後的腳本就類似如下,寫了個start函數用來傳參也就是api和明文body,然後其他需要輸出的關鍵參數值加上console.log,再引用doPostRequest函數,最後調用start函數就ok了。

最後輸出如下:

總結

目前很多行業Web端、移動端都開始卷前端加密,很多師傅們遇到了加密傳參就直接pass掉,轉頭看下個資產,但其實有些廠商會抱有“做了加密傳輸,我很安全”這種僥幸心理,所以隻要解出加密邏輯,很可能多站通用、多漏洞產出。

從攻擊層面來說,一切前端參數加密都是可逆的,關鍵點如下:

1.找到加密位置

2.分析加密邏輯

3.copy所有加密流程相關函數

4.做好hook和console.log

5.run!

從防禦層面來說,要拒絕信任一切用戶傳參,哪怕是做了各種加密,從底層(服務端)做好安全管控。

以上是我今天的分享內容,對Js逆向感興趣的小夥伴及時關註後續推文,學習過程中難免會遇到疑問,推薦加入i春秋的學習交流群(後臺發私信)