|
正文
在测试过程中遇到一个登录框,看到前端加密的情况下对密码处进行了简单的加密分析
在js中全局搜索encrypt,这里可以看到使用的是AES的ECB模式加密,这可以使用python的Crypto-js库来写加解密脚本
第一种方法使用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的值再复制)
文章来源:先知社区(irvingA)
原文地址:https://xz.aliyun.com/t/12423
关 注 有 礼

推 荐 阅 读
原文始发于微信公众号(潇湘信安):记测试过程中登录参数加密逆向分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论