在測試過程中遇到一個登錄框,看到前端加密的情況下對密碼處進行了簡單的加密分析
在控制臺中打開網絡,匹配Fetch/XHR,可以看到password處進行了加密處理

在js中全局搜索encrypt
這里可以看到使用的是AES的ECB模式加密(這可以使用python的Crypto-js庫來寫加解密腳本或者從前端提取出js進行逆向,因為該庫中有c(t)函數中所調用的enc,AES方法)

第一種方法使用python腳本來進行加密
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
key = b'0123456789ABCDEF'
cipher = AES.new(key, AES.MODE_ECB)
def encrypt(msg):
plaintext = msg.encode('utf-8')
padded_plaintext = pad(plaintext, AES.block_size)
ciphertext = cipher.encrypt(padded_plaintext)
return base64.b64encode(ciphertext).decode('utf-8')
def decrypt(ciphertext):
ciphertext_bytes = base64.b64decode(ciphertext.encode('utf-8'))
padded_plaintext = cipher.decrypt(ciphertext_bytes)
plaintext = unpad(padded_plaintext, AES.block_size)
return plaintext.decode('utf-8')
enData = encrypt('123456')
print(enData)
print(decrypt(enData))
運行結果(可以看到跟一張圖中的password加密值一致)

第二種方法提取前端js來逆向,整體代碼如下
const CryptJs = require('crypto-js');
function c(t) {
var e = CryptJs.enc.Utf8.parse(t);
return CryptJs.AES.encrypt(e, {
"words": [
808530483,
875902519,
943276354,
1128547654
],
"sigBytes": 16
}, {
mode: CryptJs.mode.ECB,
padding: CryptJs.pad.Pkcs7
}).toString()
}
data = 123456;
console.log(c(data))
運行結果也一致

整個過程如下
先找到核心函數 function c(t),對此函數開始和結尾下個斷點

光標移到i.a處,可以看到使用的是crypto-js庫中的方法,所以可以將i.a替換為變量CryptJs(因為js文件中定義了 const CryptJs = require('crypto-js');所以可以直接使用CryptJs替換i.a)

當運行這個js文件時會報錯o沒有定義

這時回到斷點處,將光標移到變量o處(或者在控制臺中輸出o的值再復制)

此時將o替換成我們復制出來的值

運行結果跟查詢的一致

在進行登錄框爆破時可以使用該腳本進行批量加密,將加密后的密碼當作字典進行爆破

商密君
數緣信安社區
上官雨寶
Andrew
FreeBuf
Anna艷娜
Andrew
Anna艷娜
虹科網絡安全
X0_0X
FreeBuf
Andrew