逆向SSO登录加密

admin 2025年6月8日00:28:10评论10 views字数 2557阅读8分31秒阅读模式

加密发现

1. 打开目标,某985大学统一身份认证平台,如果加密的话那一般是加密密码参数逆向SSO登录加密
2. 输入admin 123456测试看看,F12,抓包,看看登录包载荷.逆向SSO登录加密果然密码参数被加密了,看样子肯定不是base64等等简单的加密
3. 本地禁用js,还是输入admin 123456,再次抓登录包,看看载荷逆向SSO登录加密密码就以明文形式呈现了,说明加密密码参数的逻辑就写在js代码中,尝试通过分析js逆向出加密流程,这样就可以爆破密码了

逆向加密流程

直接全局搜索 password 参数,定位到加密代码段逆向SSO登录加密

这里似乎找到了加密password参数的加密点,到底是不是呢?

可以下个断,调试验证一下,在第90行打上断点:逆向SSO登录加密再次输入admin 123456,登录,果然在第90行成功下断,这就是password参数的加密点逆向SSO登录加密此时还未通过这个加密点,password参数应该是未被加密的,控制台输出一下password的值看看是否如此逆向SSO登录加密123456,果然,执行下一步,使password通过加密片段,再次看看password的值逆向SSO登录加密可以看到123456已经被加密得面目全非了

确认了加密点,那么下一步就是回到加密点分析加密流程

_etd2(password.val(),casLoginForm.find("#pwdDefaultEncryptSalt").val());

可以看到,_etd2函数接收了两个参数,password.val(),casLoginForm.find("#pwdDefaultEncryptSalt").val()

意思就是接收password的原始值(val()) 和 从登录表单(casLoginForm)中findpwdDefaultEncryptSalt的值(val()),一起传入_etd2函数进行加密处理,password的原始值我们知道,于是在分析_etd2函的加密逻辑之前,先要找到pwdDefaultEncryptSalt的值:

看看登录表单的源码有没有泄露出来?搜索一下逆向SSO登录加密好家伙,直接写在源码里了

<input type="hidden" id="pwdDefaultEncryptSalt" value="UnejJGj5DiyhEJH7">

现在两个参数的值有了,那就跟进_etd2函数,看看加密逻辑逆向SSO登录加密

function_etd2(_p0,_p1) {try{var _p2 = encryptAES(_p0,_p1);$("#casLoginForm").find("#passwordEncrypt").val(_p2);}catch(e){$("#casLoginForm").find("#passwordEncrypt").val(_p0);}}    });
逆向SSO登录加密

可以看到_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逆向SSO登录加密

其他几处都是调用,只有第一处是定义,跟进

逆向SSO登录加密
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"估计就就是生成随机数的函数,同一个密码两次加密结果不同,主要就是这个函数导致的

在控制台运行看看:逆向SSO登录加密

果然,就是生成某某位数的随机数的函数

那么再跟进"_ gas"函数:逆向SSO登录加密

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,modeCryptoJS.mode.CBC,paddingCryptoJS.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填充

返回加密后的字符串

再总结一下数据流:

逆向SSO登录加密

整体来说算简单的一类了,大佬们,菜菜~轻喷

原文始发于微信公众号(迪哥讲事):逆向SSO登录加密

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月8日00:28:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向SSO登录加密http://cn-sec.com/archives/4145320.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息