宁大JS加密逆向
练习URL=https://uis.nbu.edu.cn/authserver/login
- 打开调试台,找到POST包如下:发现password是经过js加密混淆的. 这里captchaResponse的值是验证码的参数,lt和
lt的值就是网页的tooken值
execution 的值为tooken值减去1,其余数值不变,主要是这个password要解密出来
2. 通过对password变量名搜索,可以定位到第三个js脚本
3. 对这个js再用变量名定位,基本就是这个_etd2函数了
-
来验证下是不是这个_etd2函数,设个断点看是否会进入断点调试这里,可以看到密码的值是我们输入的admin
-
通过追踪_etd2函数发现是一长串函数,
function _etd(_p0) {try{var _p2 = encryptAES(_p0,pwdDefaultEncryptSalt);$("#casLoginForm").find("#passwordEncrypt").val(_p2);}catch(e){$("#casLoginForm").find("#passwordEncrypt").val(_p0);}}function _etd2(_p0,_p1) {try{var _p2 = encryptAES(_p0,_p1);$("#casLoginForm").find("#passwordEncrypt").val(_p2);}catch(e){$("#casLoginForm").find("#passwordEncrypt").val(_p0);}}
用鬼鬼代码格式化后发现_etd2需要传入2个参数,我们继续追踪encryptAES函数
-
这里看到里面又有个_gas函数并且要传入3个值,其中第一和第3个还要调用_rds函数,我们先去看_rds函数
-
_rds函数 还算简单,就是输个数字,然后生成同等数字大小的随机字符串
_rds(64)+data: 分别就是64位随机字符串+密码
_p1:id为#pwdDefaultEncryptSalt的值
_rds(16) 随机16位的字符串
然后再传入_gas中进行AES加密 -
_gas函数是用AES加密,加密方式是CBC,Pkcs7,传入的key就是_p1,iv就是_rds,对_rds(64)+data进行加密
可以看到_rds(64)+data就是WkjXdfn3pZMDiaN3ziBmmMJJ5xP3JjCNeD8ca87crmjF4EJbEjmASnyQ2z87exTTadmin,这个admin就是输入的密码
key:5oTEvjuoShogiOTS 和iv:JEj3ZKYi4cYdTyN2
-
用工具模拟计算出加密后的数据
加密后数据为UIGK5b9ieBXhTw+9qK88cqXfJkDWUBnkLaqoBN8FHpXx4xVSIUqXZScdmAqz9rQN5lSPkK5B1QxuXSliw2STbO/U7fP5iSiqyKkUbfos2jE=
-
验证
我们输入encrypted.toString()得出结果为UIGK5b9ieBXhTw+9qK88cqXfJkDWUBnkLaqoBN8FHpXx4xVSIUqXZScdmAqz9rQN5lSPkK5B1QxuXSliw2STbO/U7fP5iSiqyKkUbfos2jE=
从POST包也可以验证结果一样.