加密发现
逆向加密流程
直接全局搜索 password 参数,定位到加密代码段
这里似乎找到了加密password参数的加密点,到底是不是呢?
可以下个断,调试验证一下,在第90行打上断点:再次输入admin 123456,登录,果然在第90行成功下断,这就是password参数的加密点
此时还未通过这个加密点,password参数应该是未被加密的,控制台输出一下password的值看看是否如此
123456,果然,执行下一步,使password通过加密片段,再次看看password的值
可以看到123456已经被加密得面目全非了
确认了加密点,那么下一步就是回到加密点分析加密流程
_etd2(password.val(),casLoginForm.find("#pwdDefaultEncryptSalt").val());
可以看到,_etd2函数接收了两个参数,password.val(),casLoginForm.find("#pwdDefaultEncryptSalt").val()
意思就是接收password的原始值(val()) 和 从登录表单(casLoginForm)中find出pwdDefaultEncryptSalt的值(val()),一起传入_etd2函数进行加密处理,password的原始值我们知道,于是在分析_etd2函的加密逻辑之前,先要找到pwdDefaultEncryptSalt的值:
看看登录表单的源码有没有泄露出来?搜索一下好家伙,直接写在源码里了
<input type="hidden" id="pwdDefaultEncryptSalt" value="UnejJGj5DiyhEJH7">
现在两个参数的值有了,那就跟进_etd2函数,看看加密逻辑
function_etd2(_p0,_p1) {try{var _p2 = encryptAES(_p0,_p1);$("#casLoginForm").find("#passwordEncrypt").val(_p2);}catch(e){$("#casLoginForm").find("#passwordEncrypt").val(_p0);}} });
可以看到_etd2函数接收的两个参数"password","pwdDefaultEncryptSalt"的形参是 分别是"_ p0","_p1"
有两条路径,正常情况下走第一条路径,遇到e(应该是某种错误)走第二条路径
那么这里看第一条路径
var _p2 = encryptAES(_p0, _p1); $("#casLoginForm").find("#passwordEncrypt").val(_p2);
接收"_ p0","_ p1"两个参数使用"encryptAES"进行AES加密,并赋值为"_ p2"
之后,在ID为casLoginForm的表单元素内,找到ID为passwordEncrypt的子元素,并将其值设置为_ p2变量的值
接着,跟进encryptAES
其他几处都是调用,只有第一处是定义,跟进
functionencryptAES(data, _p1) {if (!_p1) {return data; }var encrypted = _gas(_rds(64) + data, _p1, _rds(16));return encrypted;}
var _p2 = encryptAES(_p0, _p1); $("#casLoginForm").find("#passwordEncrypt").val(_p2);
接收两个参数,"data"就是"_ p0"的形参,即"password"
如果_ p1(即:pwdDefaultEncryptSalt)不存在,就直接返回原始值password
反之,进行加密处理:
var encrypted = _gas(_rds(64) + data, _p1, _rds(16));
那么就很简单了,把"_ rds(64)"与"data"进行拼接作为第一个参数,"_ p1"作为第二个参数,"_ rds(16)"作为第三个参数,传入"_ gas"函数
"_ rds"估计就就是生成随机数的函数,同一个密码两次加密结果不同,主要就是这个函数导致的
在控制台运行看看:
果然,就是生成某某位数的随机数的函数
那么再跟进"_ gas"函数:
function_gas(data, key0, iv0) { key0 = key0.replace(/(^s+)|(s+$)/g, "");var key = CryptoJS.enc.Utf8.parse(key0);var iv = CryptoJS.enc.Utf8.parse(iv0);var encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7 });return encrypted.toString();}
可以看到,"_ gas"函数接收三个值,由上可知,"data"就是"_ rds(64)"+"password"的拼接, "key0"就是"pwdDefaultEncryptSalt", "iv0"就是"_rds(16)"
对key0去除特殊字符
将一个 UTF-8 编码的字符串 (key0
) 转换为 CryptoJS
库能够处理的字节数组(WordArray
),以便进行加密或解密操作
key=key0
iv=iv0
进行AES加密,传入data,key,iv,指定为CBC模式,Pkcs7填充
返回加密后的字符串
再总结一下数据流:
整体来说算简单的一类了,大佬们,菜菜~轻喷
原文始发于微信公众号(The One安全):【JS逆向】凌晨三点,我逆向了一所985高校的SSO登录加密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论