js aes加密_某高考咨询网js逆向分析笔记
生活随笔
收集整理的這篇文章主要介紹了
js aes加密_某高考咨询网js逆向分析笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、某高考資訊網逆向分析
某網站的js加密分析,安全簽名signsafe + HmacSHA1 + AES
一年前分析過網站數據還沒有加密,最近需要獲取新的數據發現原先的爬蟲失效,請求和響應都經過加密。于是重新分析,記錄下分析思路以及分析過程中遇到的問題。二、signsafe分析
2.1?抓包請求
打開谷歌瀏覽器,f12開發者模式抓包,分析請求參數:抓包請求local_province_id:省份idlocal_type_id:可類型,固定參數,可以忽略
page:當前頁數
school_id:學校id
signsafe:安全簽名,動態變化
size:響應返回數據數量
url:固定值,可以忽略
year:年份
2.2 尋找signsafe加密算法
一般遇到這種明確的加密參數,例如 signsafe=xxx這種,通常做法都是嘗試搜索參數名。按住ctrl+shift+f,調出搜索框,搜索關鍵詞signsafe。搜索signsafe這里只搜索到一條包含signsafe關鍵字的文件,main.75.js文件,跟進去。格式化代碼,按住ctrl+f調出文件內搜索框,繼續搜索定位signsafe的位置。signsafe加密函數定位到疑似函數,打斷點測試該函數是否就是我們需要的加密函數。斷點分析斷下來的數據可以看到,t就是請求中的signsafe參數。而且,函數中也出現了HmacSHA1、base64等方法。由此可知,定位的加密位置是正確的。接下來需要將加密函數摳下來改寫,方便調用。下斷點繼續跟蹤方法調用。跟蹤v.a.enc.Utf8.parse方法,如下:v.a.enc.Utf8.parse方法單步步入,繼續跟c.parse方法,如下:c.pars方法這里又出現了一個i.init方法,繼續跟進去,如下:i.init方法跟完v.a.enc.Utf8.parse之后,繼續跟蹤外層v.a.HmacSHA1方法,如下:v.a.HmacSHA1方法跟到這里能看出,很容易的定位加密函數位置,而且關鍵函數代碼量不多,但是代碼可讀性較差,斷點跟蹤的方式反而將問題復雜化,反思有可能是分析的方式有誤。由于網站應該是經過webpack或類似的工具打包,將多個js文件打包成一個,導致代碼文件冗長。仔細想想,如果是自己開發網站,也不可能手寫各種加密算法,極大可能是調用第三方現成的加密庫。如果是未壓縮前的代碼文件,必然會引用第三方的加密庫。所以轉換思路,直接搜索關鍵字require,嘗試找到引用的加密庫。ctrl+f 搜索 require,如下:搜索關鍵字require通過搜索發現,代碼中確實引用了Crypto文件,而且查閱Crypto文檔,發現api函數名與加密函數中的方法一致。初步證實猜想是正確的,那么接下來安裝CryptoJs庫,照著仿寫加密流程。加密流程梳理一下加密流程:
- v.a為Crypto-js的引用對象;
- 第一步:v.a.enc.Utf8.parse(e),參數e為請求的get鏈接,將utf8字符串轉換為WordArray;
- 第二步:v.a.HmacSHA1(result, M),result為上一步中的WordArray,M為加密密鑰,打斷點可知M="D23ABC@#56",為固定值。
HMACSHA1 是從 SHA1 哈希函數構造的一種鍵控哈希算法,被用作 HMAC(基于哈希的消息驗證代碼)。它將任意長度的字符串生成 28位長的字符串。
HMACSHA1加密返回結果- 第三步:v.a.enc.Base64.stringify(t).toString(),將第二步的結果進行一次base64編碼。
- 第四步:t = C()(t),直觀看上去不知道函數作用,打斷點跟進去函數內部發現是進行了一次md5運算。
2.3 代碼實現
弄清楚加密流程,直接調用CryptoJs庫,照著流程實現即可:// e get請求鏈接, M 為加密密鑰function?initSignSafe(e,?M)?{
?let?t?=?CryptoJS.enc.Utf8.parse(e);
?let?a?=?CryptoJS.HmacSHA1(t,?M);
?let?b?=?CryptoJS.enc.Base64.stringify(a).toString();
?let?c?=?CryptoJS.MD5(b).toString();
?return?c;
}
三、響應解碼
這個網站還是做了一些防護的,請求參數和響應數據都進行了加密。上面我們分析了請求中的安全簽名加密,接下來分析響應數據解密方法。照例抓包進行分析,摳出解密代碼。3.1 抓包查看響應
返回響應抓包這一長串就是加密后的數據,乍一看無從下手,但有意思的是,響應中method的值說明響應是通過aes-256-cbc的方式進行加密。百度解釋:高級加密標準(AES,Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。對稱加密算法也就是加密和解密用相同的密鑰。AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。在AES標準規范中,分組長度只能是128位,也就是說,每個分組為16個字節(每個字節8位)。密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數也不同。
看多了太復雜,這里只需要知道使用的加密方法是aes-256,密鑰長度256位,cbc指的是在加密和解密是需要一個初始化向量(Initialization Vector, IV),在每次加密之前或者解密之后,使用初始化向量與明文或密文異或。說白了,就是設定的密鑰,添加一個初始化偏移量。加密時,明文先與iv偏移量異或,再將結果進行256位的塊加密,得到的輸出就是密文,同時本次的輸出密文作為下一個塊加密的IV。3.2 響應解密分析
分析思路跟signsafe參數類似,按住ctrl+shift+f,搜索關鍵字aes。搜索aes關鍵字按住ctrl+f,文件內搜索aes關鍵字:文件內搜索aes關鍵字有11個結果,對可疑的函數段下斷點找到加密函數:斷點找到加密函數梳理一下加密流程:
- 第一步:將響應中的數據賦值到變量中保存,s為安全簽名的密鑰;
- 第二步:將兩個原始密鑰s("D23ABC@#56")和l("apidata/api/gk/plan/special")進行PBKDF2加密;
PBKDF2(Password-Based Key Derivation Function)是一個用來導出密鑰的函數,常用于生成加密的密碼。它的基本原理是通過一個偽隨機函數(例如HMAC函數),把明文和一個鹽值作為輸入參數,然后重復進行運算,并最終產生密鑰。
- 第三步:將密文初始化為一個cipher params 對象;
- 第四步:進行aes-256-cbc加密,傳入cipher params 對象,密鑰是經過PBKDF2加密的s("D23ABC@#56"),偏移量lv為經過PBKDF2加密的l("apidata/api/gk/plan/special");
- 第五步:將aes加密后的結果WordArray轉換為字符串g.toString(v.a.enc.Utf8)。
3.3 代碼實現
復制加密流程代碼,將v.a替換為CryptoJs引用對象進行改寫:function?decodeRes(e,?_s,?_l)?{?let?a?=?e,?s?=?_s,?l?=?_l;
?if?(e.data?&&?e.data.text)?{
??let?c?=?e.data.text;
??let?u?=?CryptoJS.PBKDF2(s,?"secret",?{
???keySize:?8,
???iterations:?1e3,
???hasher:?CryptoJS.algo.SHA256
??}).toString();
??let?f?=?CryptoJS.PBKDF2(l,?"secret",?{
???keySize:?4,
???iterations:?1e3,
???hasher:?CryptoJS.algo.SHA256
??}).toString();
??let?m?=?CryptoJS.lib.CipherParams.create({
???ciphertext:?CryptoJS.enc.Hex.parse(c)
??});
??let?g?=?CryptoJS.AES.decrypt(m,?CryptoJS.enc.Hex.parse(u),?{
???iv:?CryptoJS.enc.Hex.parse(f)
??});
??a?=?{
???code:?"0000",
???data:?JSON.parse(g.toString(CryptoJS.enc.Utf8)),
???message:?""
??}
??return?JSON.stringify(a);
?}
?return?undefined;
}
解密后的內容如下:解密后的響應內容
四、總結
- 加密參數優先通過搜索的方式進行定位;
- 現在的js文件一般都經過壓縮,可讀性較差,可以通過搜索require等關鍵字轉換思路;
- 摳出加密函數的方法可以通過斷點一步一步跟蹤,查缺補漏,或者手動仿寫;
- 逆向的技巧性很強,要善于利用搜索引擎。
總結
以上是生活随笔為你收集整理的js aes加密_某高考咨询网js逆向分析笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4t硬盘实际容量是多少_SMR硬盘到底能
- 下一篇: antd 怎么用ajax,react+d