逆向目标
- 网址:
https://www.91118.com/Passport/Account/Login
- 接口:
https://www.91118.com/passport/Account/LoginPost
- 参数:
pass
r
逆向过程
输入手机号、密码、验证码
点击登陆,多试几次,然后观察并比较不通请求参数有哪些变化,其中 ckcode
是验证码
逆向分析
先使用关键词 pass
搜索,匹配项太多,直接从启动器入口进去跟栈分析
调试如下
可以发现参数 r
就是一个随机值 Math.random()
,pass
跟栈进去如下
加解密的方法都有了
var _key = 'k1fsa01v';
var _iv = 'k1fsa01v';
function encryptByDES(message) {
var keyHex = CryptoJS.enc.Utf8.parse(_key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
iv: CryptoJS.enc.Utf8.parse(_iv),
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
function decryptByDES(ciphertext) {
var keyHex = CryptoJS.enc.Utf8.parse(_key);
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
}, keyHex, {
iv: CryptoJS.enc.Utf8.parse(_iv),
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
看着像是 DES
对称加密,使用标准库 crypto-js
来加密看看结果是否一致
var CryptoJS = require("crypto-js");
// 定义加密密钥,使用Utf8编码解析密钥字符串
const SECRET_KEY = CryptoJS.enc.Utf8.parse("k1fsa01v");
// 定义加密向量IV,使用Utf8编码解析IV字符串
const SECRET_IV = CryptoJS.enc.Utf8.parse("k1fsa01v");
/**
* 加密函数,接受一个数据参数,返回加密后的字符串
* @param {string|object} data - 需要加密的数据,可以是字符串或对象
* @returns {string} 加密后的数据字符串
*/
function encrypt(data) {
// 如果数据是对象类型,则尝试将其转换为字符串
if (typeof data === "object") {
try {
data = JSON