地址
发包分析
两个可以参数,一个是密码,另一个未知,看特征像是md5
加密
测试参数
下面测试一下重发请求需要哪些参数。
先完全重写请求的信息
import requests
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://passport.5173.com",
"Referer": "https://passport.5173.com/Sso/Login?",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\""
}
cookies = {
".5173auth": "",
"__utma": "12194411.1048386069.1718180174.1718180174.1718180174.1",
"__utmb": "12194411",
"__utmc": "12194411",
"__utmz": "12194411.1718180174.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)",
"Hm_lvt_6054b5813cf740e14dd8df8f5d0cb24b": "1718180174",
"Hm_lpvt_6054b5813cf740e14dd8df8f5d0cb24b": "1718180174",
"trace_5173": "202406121616c74a9e73ffbcf6de5db3",
"gr_user_id": "c3e0f896-7485-454d-b1c0-8b89862d1a1e",
"ae7d9d7e698ddc2f_gr_session_id": "234a0d7d-1d33-48e7-b292-801fb27f64c2",
"ae7d9d7e698ddc2f_gr_session_id_sent_vst": "234a0d7d-1d33-48e7-b292-801fb27f64c2",
"fp": "2d111e52caf1d2bd6dab42c11490dae4"
}
url = "https://passport.5173.com/Sso/Login"
data = {
"smsLogin": "0",
"userName": "1111111111",
"password": "f87f4674e58b8d51780864505f0eb445",
"mobileNo": "",
"smsCaptcha": "",
"category": "",
"passpod": "",
"__validationToken__": "79f9227b25e148b691852632b54ceefe",
"__validationDna__": ""
}
response = requests.post(url, headers=headers, cookies=cookies, data=data)
print(response.text)
print(response.status_code)
print(len(response.text))
通过删减部分信息,对比最后打印的数据包长度来确定是否影响数据返回。
经过测试
- 密码加密
- 剩余参数写死
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
url = "https://passport.5173.com/Sso/Login"
data = {
"smsLogin": "0",
"userName": "1111115611",
"password": "f87f4674e58b8d51780864505f0eb445",
"mobileNo": "",
"smsCaptcha": "",
"category": "",
"passpod": "",
"__validationToken__": "79f9227b25e148b691852632b54ceefe",
"__validationDna__": ""
}
response = requests.post(url, headers=headers, data=data)
print(response.text)
print(response.status_code)
print(len(response.text))
密码加密逆向
找入口
在点击登录的时候会发现一个现象,就是密码框的内容会变长
我输入的是123456
但是登录的时候会出现密码变长, 这就说明加密后的密码又重新赋值给了原密码框。这点和上一个案例很像 【JS逆向入门实战】7881登录
既然会对密码框进行操作,肯定会用到选择器,那就根据密码框的特征来检索。
有id
通常会使用id
所以根据这个txtPass
进行搜索
找加密函数
Ctrl + shift + F
打开搜索框,点进去查看,发现第二个搜索结果很像操作的地方。
图中红框位置很像是对密码框赋值密文了,打上断点测试。
果然这个o
参数就是密文
往上找发现这个o
是上层函数传入的第二个参数,往上一级追栈。
往上发现是传入c
参数
这段的逻辑就是判断是否已经对密码加密赋值了,如果是就直接获取密码框的内容,如果没有则进入生成密文以及赋值的逻辑。
那么密文最终就是函数a.getPassword
生成的。还需要传入参数pkey
,这里先记录固定值,先把加密逻辑扣下来
点进加密函数,发现就是一个md5加密,打上断点看看传入的参数是谁
发现一个是密码,一个是pkey
扣代码
先扣下来
pkey = 'yoy8dc';
password = '123456';
c = hex_md5(hex_md5(password).substr(8, 16) + pkey);
console.log(c);
重新请求测试这个md5
加密有没有魔改。
- 浏览器结果
- 本地结果
说明是标准md5加密库,就不需要扣了,如果扣也很简单。
完整js代码
const crypto = require('crypto');
// 计算 MD5
function hex_md5(input) {
const hash = crypto.createHash('md5');
hash.update(input);
const md5 = hash.digest('hex');
return md5;
}
pkey = "4qh005";
password = '123456';
c = hex_md5(hex_md5(password).substr(8, 16) + pkey);
console.log(c);
找pkey
的位置
还有一个问题,参数pkey
这个参数还不知道哪里来的,这个估计是随网页返回的。全局搜索一下,在加密函数上面能发现一个,不确定是不是这个,登录测试
其实在这里就能发现这个参数的生成位置!
不知道为什么我没有看到!
下面的内容是找到上面这个位置。
发现数据是对不上的
那就看看上级传入的,发现这个参数最终会在b.fost.security.FostTpm
中。
这就有点棘手了。
往上能够找到这个b.fost.security.FostTpm
的赋值位置,打上断点,发现请求完毕后,会重新生成pkey
也就是说,本次使用的pkey
是上一次生成的。
慢慢调试,往下翻发现pkey
是先在一个a
变量中生成,然后赋值给b.fost.security.FostTpm
this.ekey = a.ekey;
this.vkey = a.vkey;
this.pkey = a.pkey;
往上追就是a
的来源。
发现a
还是在上层。
发现是传入了d
参数
搜索往上查找,发现了pkey
的生成位置
使用$
查找是jQuery
的语法,这么说还是在网页上的,搜索发现果然如此。
所以这个参数是跟随网页发送过来的,可以先请求一次网页,获取需要的内容,再构建逆向代码登录,本篇完结!