习讯云-实习管理平台协议登录与逆向分析

1312 字
7 分钟
习讯云-实习管理平台协议登录与逆向分析

习讯云-实习管理平台xixunyun.com)网页端登录流程的逆向分析。


1. 背景与抓包定位#

习讯云是许多高校用于学生毕业实习、顶岗实习签到与日报填报的综合管理平台。在进行协议自动化对接或二次开发时,首先需要解决登录态认证问题。

打开浏览器访问习讯云登录页面并打开 DevTools(Network 面板),输入账号与密码发起登录,可以捕获到关键认证请求:

  • 请求 URLhttps://api.xixunyun.com/login/admin
  • 请求方法POST
  • 数据格式application/x-www-form-urlencoded;charset=UTF-8

DevTools Network 面板抓取到的登录 Payload
DevTools Network 面板抓取到的登录 Payload

查看 Payload(Form Data),提交的表单字段如下:

字段名示例值说明
school_id2***学校对应的唯一数字标识 ID
j_dataMTIzMTMxMzsxMzEzMTMxMzsx加密/编码后的认证凭据数据
typeweb客户端来源类型(网页端固定为 web
algen001前端标记的加密算法版本编号

可以看到,登录并未直接明文传输密码,而是将账号凭据打包进了 j_data 字段,且标注算法为 alg: en001


2. 前端逆向与算法溯源#

为了弄清 j_data 的生成逻辑与 en001 究竟代表何种加密算法,我们在 DevTools 的 Sources 面板中搜索关键字 j_dataen001,或者审查页面加载的 JS 文件。

在资源目录结构中,可以清晰地看到前端脚本的分布:

Sources 面板中定位到前端引入的 base64.js 脚本
Sources 面板中定位到前端引入的 base64.js 脚本

js/functionjs/ 目录下发现了 base64.js,并在登录逻辑代码中定位到 j_data 的构造过程。

2.1 逆向解码验证#

我们将抓包截获的 j_data 值:

MTIzMTMxMzsxMzEzMTMxMzsx

放入 Base64 解码工具中进行测试:

Base64 解码还原出原始明文结构
Base64 解码还原出原始明文结构

解码结果为:

1231313;13131313;1

对照输入数据:

  • 前半段 1231313 为登录账号(用户名/学号/手机号);
  • 中间段 13131313 为用户登录密码;
  • 末尾固定追加分号与数字 1(表示登录用户身份类型或默认角色)。

2.2 编码规则总结#

所谓的 alg: "en001" 实际上只是标准 Base64 编码,并未引入非对称加密(如 RSA)或对称加密(如 AES/DES),也未加盐或混淆。

其生成规则极其简洁:

raw = `${account};${password};1`
j_data = Base64Encode(raw)

3. 认证流程梳理#

整个登录与鉴权流程如下:

登录成功

登录失败

输入账号密码与学校代码

拼接认证文本 账号;密码;1

标准 Base64 编码生成 j_data

构造 POST 表单数据

向 /login/admin 发起认证请求

服务端校验

解析响应 JSON 并提取 Token

提示账号或密码错误

登录成功

登录失败

输入账号密码与学校代码

拼接认证文本 账号;密码;1

标准 Base64 编码生成 j_data

构造 POST 表单数据

向 /login/admin 发起认证请求

服务端校验

解析响应 JSON 并提取 Token

提示账号或密码错误


4. 脚本实现#

4.1 综合核心代码 (JavaScript / Node.js)#

以下为提取并整理的完整登录与解析脚本:

const schoolId = "学校代码";
const account = "账户";
const password = "密码";
// 1. 拼接认证数据并进行 Base64 编码
const raw = `${account};${password};1`;
const jData = Buffer.from(raw, "utf8").toString("base64");
console.log("账号:", account);
console.log("j_data:", jData);
// 2. 发起登录请求
const response = await fetch("https://api.xixunyun.com/login/admin", {
method: "POST",
headers: {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"Referer": "https://www.xixunyun.com/"
},
body: new URLSearchParams({
school_id: schoolId,
j_data: jData,
type: "web",
alg: "en001"
}).toString()
});
// 3. 处理并打印响应数据
const text = await response.text();
try {
const result = JSON.parse(text);
console.log(JSON.stringify(result, null, 2));
console.log("message:", result.message);
console.log("data:", result.data);
} catch {
console.log("返回内容不是 JSON");
}

4.2 Python 实现参考 (Requests)#

import base64
import requests
def login_xixun(school_id: str, account: str, password: str) -> dict:
url = "https://api.xixunyun.com/login/admin"
# 1. 拼接并进行 Base64 编码
raw_str = f"{account};{password};1"
j_data = base64.b64encode(raw_str.encode("utf-8")).decode("utf-8")
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"Referer": "https://www.xixunyun.com/"
}
payload = {
"school_id": school_id,
"j_data": j_data,
"type": "web",
"alg": "en001"
}
response = requests.post(url, headers=headers, data=payload)
try:
return response.json()
except Exception:
return {"error": "返回内容不是 JSON", "raw": response.text}
if __name__ == "__main__":
result = login_xixun("学校代码", "账户", "密码")
print(result)

5. 实战调试与响应解析#

运行上述脚本进行登录测试,成功获取到服务端的 JSON 响应:

实战运行脚本与接口响应输出
实战运行脚本与接口响应输出

接口返回的关键字段说明:

{
"pop_form": "1",
"default_webview_domain": "https://www.xixunyun.com/",
"dcwj_webview_domain": "https://dcwj.xixunyun.com/",
"differ_api": "",
"qxiao_api": "",
"user_type_name": "学生",
"user_qq": "",
"user_one_family": "",
"user_one_family_phone": "",
"user_two_family": "",
"user_two_family_phone": "",
"user_birthday": "",
"user_birthplace": "",
"user_email": "",
"user_phone": "",
"point": "0"
}
  • user_type_name:当前登录账号的身份(如 学生教师 等);
  • default_webview_domain / dcwj_webview_domain:平台业务系统与问卷调查系统的 WebView 基础域名;
  • 响应头中还会下发会话 Cookie / Token,用于后续接口(如打卡签到、提交实习周报/日报)的鉴权。

6. 安全性分析与总结#

安全性隐患
  1. 伪加密alg: en001 命名虽然形似加密算法版本,但实质上仅使用了明文 Base64 编码。Base64 不具备保密性,任何中间节点或日志捕获均可直接还原出明文密码。
  2. 缺少防重放机制:请求中未加入时间戳(Timestamp)、随机数(Nonce)或签名摘要(Sign),请求包具有永久重放风险。
  3. 无验证码保护:网页端默认未强制开启图形验证码或滑块验证码,易遭受撞库与暴力破解攻击。

总结#

习讯云网页端的登录认证非常直观,核心在于将 ${account};${password};1 经 Base64 编码后作为 j_data 提交给 /login/admin 接口。为后续实现自动化签到、实习报表等脚本。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

习讯云-实习管理平台协议登录与逆向分析
https://blog.5iwy.com/posts/notes/mycc/mianyangcitycollege/xixun/
作者
Suki
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0
分类
站点信息
构建平台
ESA Pages
文章许可
CC BY-NC-SA 4.0