实战|记一次测试过程中登录参数加密逆向分析
在测试过程中遇到一个登录框,看到前端加密的情况下对密码处进行了简单的加密分析
在控制台中打开网络,匹配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替换成我们复制出来的值
运行结果跟查询的一致
在进行登录框爆破时可以使用该脚本进行批量加密,将加密后的密码当作字典进行爆破
记一次测试过程中登录参数加密逆向分析.zip (1.972 MB) 下载附件https://xzfile.aliyuncs.com/upload/affix/20230413125742-b92ccc22-d9b7-1.zip
原文链接:https://xz.aliyun.com/t/12423
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END