動態(tài)網(wǎng)站商品瀏覽怎么做seo流量排名軟件
高校教務(wù)系統(tǒng)密碼加密邏輯及JS逆向
本文將介紹南京郵電大學(xué)教務(wù)系統(tǒng)的密碼加密邏輯以及使用JavaScript進行逆向分析的過程。通過本文,你將了解到密碼加密的基本概念、常用加密算法以及如何通過逆向分析來破解密碼。
本文僅供交流學(xué)習(xí),勿用于非法用途。
一、密碼加密基本概念
密碼加密是一種保護信息安全的技術(shù)手段,它通過將明文(原始信息)轉(zhuǎn)換為密文(加密后的信息),以防止未經(jīng)授權(quán)的訪問和篡改。常見的密碼加密算法有MD5、SHA-1、SHA-256等。
1.1 加密過程
加密過程通常包括以下步驟:
- 密鑰擴展:將密鑰擴展為多個輪值,每個輪值都與明文的一部分有關(guān)。
- 初始輪值生成:將擴展后的密鑰與輪常數(shù)進行某種運算,生成第一輪加密的密文。
- 多輪迭代:對密文進行多輪迭代操作,每輪操作都包括非線性函數(shù)、模運算和輪常數(shù)的變換。
- 最終密文:經(jīng)過多輪迭代后,得到最終的密文。
1.2 解密過程
解密過程與加密過程相反,通過反向操作來恢復(fù)原始明文。通常需要知道加密時使用的密鑰和算法。
二、高校教務(wù)系統(tǒng)密碼加密邏輯分析
2.1 抓包
我們首先打開教務(wù)系統(tǒng)的登錄頁面,我們可以看到,只有學(xué)號和密碼,有的高校會有驗證碼,或者有的高校是錯誤一次密碼,會驗證驗證碼。
2.2 無限debugger
我們在打開開發(fā)者工具的時候,會發(fā)現(xiàn)有debugger,我在這里順便教一下大家怎么繞過它。
第一個debugger
右擊圖示位置,點擊永不在此斷點。
第二個debugger
這里的操作和前面一樣的。
第三個debugger
這里發(fā)現(xiàn)用上面的方法不好使了,我先說解決方法:
直接在console輸入以下代碼,步驟如下:
打開F12點擊Console
輸入下面代碼后回車;(function(){}).constructor?===?Function
如果返回的是true,繼續(xù)輸入并回車;
Function.prototype.constructor?=?function(){}
切換回sources選項卡,點擊繼續(xù)執(zhí)行,無限debugger的問題就解決了
注意:如果第二步返回的是false,則此方法不可用。
constructor是一個特殊的方法,用于在創(chuàng)建一個對象時對其進行初始化。構(gòu)造器(constructor)的作用是初始化對象的屬性和方法,以便在創(chuàng)建對象時可以使用這些屬性和方法。在JavaScript中,使用constructor定義一個構(gòu)造器函數(shù),通過這個構(gòu)造器函數(shù)可以創(chuàng)建多個對象。在使用new關(guān)鍵字創(chuàng)建對象時,會自動調(diào)用構(gòu)造函數(shù),從而完成對象的初始化。這里是構(gòu)造了debugger,所以前面的方法不能用。
我們打開開發(fā)者工具,嘗試登錄抓包,網(wǎng)頁會返回這樣的數(shù)據(jù)接口。
我們可以看到,用戶名和密碼是一樣的,也就是說加密方法也是一樣的(因為我們用戶名和密碼是一樣的,通過加密之后,得到的值也是一樣的)。
2.2 分析加密參數(shù)
我們接下來,就是來分析這個密碼是怎么加密的。我們?nèi)炙阉鱬assword。定位到加密的位置。
我們可以看到,這里用了encrypt函數(shù),把輸入的用戶名和密碼,和checkkey一起傳給了這個函數(shù)。我們接下來就是定位encrypt。
看到這里,是不是覺得有點眼熟,是的,這個加密方法和我們前面講到的皖西學(xué)院是一樣的,可以直接拿來用。
三、JS逆向分析方法
逆向分析是指從已知的加密文本或程序中還原出原始信息的過程。在本例中,我們將使用JavaScript編寫一個簡單的逆向分析工具,用于逆向高校教務(wù)系統(tǒng)的密碼。
環(huán)境使用
- python 3.9
- pycharm
- node
我們?nèi)炙阉鱡ncrypt,我們可以定位到這個函數(shù),我們接下來就是扣這個函數(shù)嗎,看缺什么補什么。
代碼實現(xiàn)
我們先把這些代碼扣下來,運行看看缺什么補什么。
var CryptoJS = require("crypto-js");var password = encrypt('1234', '1697346526649')function encrypt(msg, checkkey) {var base64 = new Base64();var key = CryptoJS.enc.Base64.parse(base64.encode("iam" + checkkey));var iv = CryptoJS.enc.Base64.parse(base64.encode("iam" + checkkey));var encrypted = CryptoJS.AES.encrypt(msg, key, {iv: iv,padding: CryptoJS.pad.Pkcs7,mode: CryptoJS.mode.CBC});var cipherText = encrypted.ciphertext.toString();return cipherText
}function Base64() {// private property_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";// public method for encodingthis.encode = function (input) {var output = "";var chr1, chr2, chr3, enc1, enc2, enc3, enc4;var i = 0;input = _utf8_encode(input);while (i < input.length) {chr1 = input.charCodeAt(i++);chr2 = input.charCodeAt(i++);chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)) {enc3 = enc4 = 64;} else if (isNaN(chr3)) {enc4 = 64;}output = output +_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +_keyStr.charAt(enc3) + _keyStr.charAt(enc4);}return output;}// public method for decodingthis.decode = function (input) {var output = "";var chr1, chr2, chr3;var enc1, enc2, enc3, enc4;var i = 0;input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");while (i < input.length) {enc1 = _keyStr.indexOf(input.charAt(i++));enc2 = _keyStr.indexOf(input.charAt(i++));enc3 = _keyStr.indexOf(input.charAt(i++));enc4 = _keyStr.indexOf(input.charAt(i++));chr1 = (enc1 << 2) | (enc2 >> 4);chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);chr3 = ((enc3 & 3) << 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) {output = output + String.fromCharCode(chr2);}if (enc4 != 64) {output = output + String.fromCharCode(chr3);}}output = _utf8_decode(output);return output;}// private method for UTF-8 encoding_utf8_encode = function (string) {string = string.replace(/\r\n/g, "\n");var utftext = "";for (var n = 0; n < string.length; n++) {var c = string.charCodeAt(n);if (c < 128) {utftext += String.fromCharCode(c);} else if ((c > 127) && (c < 2048)) {utftext += String.fromCharCode((c >> 6) | 192);utftext += String.fromCharCode((c & 63) | 128);} else {utftext += String.fromCharCode((c >> 12) | 224);utftext += String.fromCharCode(((c >> 6) & 63) | 128);utftext += String.fromCharCode((c & 63) | 128);}}return utftext;}// private method for UTF-8 decoding_utf8_decode = function (utftext) {var string = "";var i = 0;var c = c1 = c2 = 0;while (i < utftext.length) {c = utftext.charCodeAt(i);if (c < 128) {string += String.fromCharCode(c);i++;} else if ((c > 191) && (c < 224)) {c2 = utftext.charCodeAt(i + 1);string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));i += 2;} else {c2 = utftext.charCodeAt(i + 1);c3 = utftext.charCodeAt(i + 2);string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));i += 3;}}return string;}
}console.log(password)
我們這里的checkkey,要和網(wǎng)頁一樣的,大家感興趣的話,可以去看看這個是怎么生成的。
var password= encrypt('1234', '1697346526649')
實現(xiàn)效果
647de9a60f4ac07444fd45625f6cefab
四、總結(jié)
本文介紹了高校教務(wù)系統(tǒng)的密碼加密邏輯以及使用JavaScript進行逆向分析的方法。通過學(xué)習(xí)這些知識,你可以更好地理解密碼加密技術(shù)的原理,并掌握一定的逆向分析技巧。請注意,逆向分析可能涉及到法律問題,請在合法范圍內(nèi)進行研究和實踐。
五、累計更新
爭取到到底早日更新30所高校,大家可以在評論區(qū)留言。
往期作品可以查看專欄👇👇👇
全國高校教務(wù)系統(tǒng)登錄頁面JS分析_愛吃餅干的小白鼠的博客-CSDN博客