网址:aHR0cDovL25ld2F1dGhzZXJ2ZXIuc3p1LmVkdS5jbi9hdXRoc2VydmVyL2xvZ2lu
登陆页面,找到登录接口,发现登录接口是document类型,而不是xhr类型,无法跟栈分析。
登陆两次,发现有两个加密参数,lt这个参数也是变化的。
还记得土巴兔那一次的分析吗,可以在元素中搜索authserver/login
找到casLoginForm关键词,再搜索
找到疑似加密位置点击进去
再第二个encryptAES处打上断点
分析这长串代码:
这段代码定义了两个函数 _etd
和 _etd2
,它们都用于对输入的密码进行 AES 加密并将加密后的值设置到表单的 #passwordEncrypt
输入框中。如果加密失败,则直接将未加密的密码设置到该输入框中。
下面是这两个函数的详细解释:
- _etd 函数:
- 参数
_p0
:需要加密的密码。 - 使用默认的加密盐(
pwdDefaultEncryptSalt
)对密码进行 AES 加密。 - 将加密后的密码设置到表单
#casLoginForm
的#passwordEncrypt
输入框中。 - 如果加密过程出现错误,则将未加密的密码
_p0
设置到#passwordEncrypt
输入框中。
- 参数
function _etd(_p0) {try {var _p2 = encryptAES(_p0, pwdDefaultEncryptSalt);$("#casLoginForm").find("#passwordEncrypt").val(_p2);} catch(e) {$("#casLoginForm").find("#passwordEncrypt").val(_p0);}
}
_etd2 函数:
- 参数
_p0
:需要加密的密码。 - 参数
_p1
:用于加密的盐值。 - 使用传入的盐值
_p1
对密码进行 AES 加密。 - 将加密后的密码设置到表单
#casLoginForm
的#passwordEncrypt
输入框中。 - 如果加密过程出现错误,则将未加密的密码
_p0
设置到#passwordEncrypt
输入框中。
function _etd2(_p0, _p1) {try {var _p2 = encryptAES(_p0, _p1);$("#casLoginForm").find("#passwordEncrypt").val(_p2);} catch(e) {$("#casLoginForm").find("#passwordEncrypt").val(_p0);}
}
学习新知识:
-
casLoginForm
:- 假设
casLoginForm
是一个 jQuery 对象,表示登录表单。
- 假设
-
find("#username")
:- 从
casLoginForm
表单中查找 ID 为username
的输入框,并将其存储在username
变量中。
- 从
-
find("#password")
:- 从
casLoginForm
表单中查找 ID 为password
的输入框,并将其存储在password
变量中。
- 从
最终,这段代码的作用是获取表单中的用户名和密码输入框,以便后续对它们进行操作,比如读取用户输入的值、进行加密等。
var username = casLoginForm.find("#username");
var password = casLoginForm.find("#password");
-
password.val()
:password
是之前从表单中获取的密码输入框。.val()
方法用于获取输入框中的值(即用户输入的密码)。
-
casLoginForm.find("#pwdDefaultEncryptSalt").val()
:casLoginForm
是登录表单的 jQuery 对象。.find("#pwdDefaultEncryptSalt")
从表单中查找 ID 为pwdDefaultEncryptSalt
的输入框。.val()
方法用于获取输入框中的值(即用于加密的盐值)。
-
_etd2
函数:_etd2
函数接受两个参数:第一个参数是密码,第二个参数是用于加密的盐值。- 该函数会尝试使用 AES 加密密码,并将加密后的结果设置到表单中的
#passwordEncrypt
输入框中。如果加密失败,则直接将原始密码设置到#passwordEncrypt
输入框中。
总结一下,这段代码首先获取用户输入的密码和加密盐值,然后调用 _etd2
函数对密码进行加密,并将加密后的密码设置到表单中相应的隐藏输入框内。
_etd2(password.val(), casLoginForm.find("#pwdDefaultEncryptSalt").val());
某变量.find('#某变量1) 一般是从class = 某变量1中取出值
再次点击登录,打印参数,发现果然是这个加密函数,但是又引出了_p1是怎么来的?
经过上面的分析,大致知道要在源码中去_p1,而且是搜索pwdDefaultEncryptSalt
顺便搜索lt,发现果然也在源码中。
找齐密钥和加密参数后,回到加密函数encryptAES,进入其中,
再进入_gas函数发现就是一个AES的加密。
这个AES需要三个参数,加密的数据_rds(64)+data(data是123456),_p1是密钥,_rds(16)是iv值。
现在就是函数_rds()不知道了。进入_rds(),发现下面代码,没有什么特别的,全部复制下面的内容即可。
总结,这个登录口加密分析:加密lt参数从源码中获得。密码经过AES加密,密钥从源码中获得,把密码和rds生成的内容结合作为最终加密数据,把rds生成的内容作为iv值 。这就是整个的加密流程,可以自己试着写代码!
学到的东西给就是从源码中获取需要的内容,有时是参数的加密值,有时是某种加密方式的密钥。联想古诗文网登录逆向,它里面也有两个加密参数是从源码中获取的。