Pwaerm 发表于 2023-2-14 13:00

仅使用浏览器分析某教育平台从登陆到任务完成的数据交换

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!

以CQ市为例

在登陆页,任意输入一个帐号密码,然后在控制台看到登陆接口为


usercenter/api/v3/wx/login?checkShowQrCode=true&tmp=false
数据并未加密,那么无感登陆就简单了
$.ajax({
    url: "https://appapi.xueanquan.com/usercenter/api/v3/wx/login?checkShowQrCode=true&tmp=false",
    type: "POST",
    contentType: "application/json",
    dataType: "json",
    xhrFields: {
      withCredentials: true
    },
    timeout: 10 * 1000,
    data: JSON.stringify({ username: _o.user, password: _o.pwd, "loginOrigin": 1 }),
    success: function (_data) {
      console.log(_data);
}}


第二步,进入学习任务页
同上,得到,任务完成情况接口为:
safeapph5/api/v1/homework/homeworklist
无感开启任务页
//学习任务
var openTabs = {};
function studyList(_isTest) {
console.log("获取学习任务列表");
$.ajax({
    url: "https://yyapi.xueanquan.com/chongqing/safeapph5/api/v1/homework/homeworklist",
    type: "GET",
    contentType: "application/json",
    dataType: "json",
    xhrFields: {
      withCredentials: true
    },
    timeout: 10 * 1000,
    success: function (_data) {
      var _t = _data.length;
      var _num = 0;
      if (_t > 0) {
      while (_t--) {
          if (_data.workStatus == "UnFinish") {
            console.log(_data.title, ":", _data.url);
            var _gid = getValueByUrl(_data.url, "gid");
            var _li = getValueByUrl(_data.url, "li");
            //常规授课课程
            if (_gid && _li) {
            //看视频(方案失败)
            //killVideo(_data.title, _gid, _li);
            //把手机版地址转换为电脑版地址
            var _videoUrl = _data.url.replace("platform/student/skilltrain.html", "jt/student/SeeVideo.html");
            if (!openTabs) {
                openTabs = true;
                window.sendMessage({ type: "createTab", data: { url: _videoUrl, selected: false } });
            } else {
                //完成答题                           
                console.log("答题");
                killStudy(_data.title, _li);
            }
            } else {
            //专项课程(参数sid在列表数据中没有)
            //window.open(_data.url);
            sutdentSign(818);
            }
            _num++;
          }
      }
      } else {
      _num = -1;
      console.log("本期还没有开启需要完成的任务。");
      }
      if (_num == 0) {
      if (_isTest) {
          console.log("任务完成有效,验证通过。");
      } else {
          console.log("当前没有需要完成的任务。");
      }

      setTimeout(lockUser, 600, getUrlParam("uid"));
      } else {
      _num > 0 && console.log("尝试完成了" + _num + "个任务。");
      setTimeout(studyList, 1000, true);
      //window.sendMessage({ type: "reloadTime", data: { time: _num + 0.5 } });
      }
    }
})
}

视频只要打开就视为完成,关键的是答题,通过分析得到。答案其实就在接口返回的sjon数据中,在提交时作答的情况并未返回到后面判断 。
而给后台的数据是:
_answer = {
      "workId": _data.workId,
      "fid": _data.fid,
      "title": _title,
      "require": "",
      "purpose": "",
      "contents": "",
      "testanswer": "0|0|0",
      "testinfo": "已掌握技能",
      "testMark": 100,
      "testResult": 1,
      "siteName": "",
      "siteAddrees": "",
      "watchTime": "2022-04-08T02:45:24.323Z",
      "courseID": _cid
      }
以上数据 中的 "0|0|0",表示做的全对。那么直接无感提交:

function killStudy(_title, _cid) {
//获得题目的ID
$.ajax({
    url: "https://yyapi.xueanquan.com/chongqing/api/v1/StudentHomeWork/GetSkillTestPaper?courseId=" + _cid,
    type: "GET",
    contentType: "application/json",
    dataType: "json",
    xhrFields: {
      withCredentials: true
    },
    timeout: 10 * 1000,
    asycn: false,
    success: function (_data) {
      console.log(_data);
      _data = _data.result;
      _answer = {
      "workId": _data.workId,
      "fid": _data.fid,
      "title": _title,
      "require": "",
      "purpose": "",
      "contents": "",
      "testanswer": "0|0|0",
      "testinfo": "已掌握技能",
      "testMark": 100,
      "testResult": 1,
      "siteName": "",
      "siteAddrees": "",
      "watchTime": "2022-04-08T02:45:24.323Z",
      "courseID": _cid
      }
      sendAnswer(_answer);
    }
})
}
function sendAnswer(_data) {
//提交答题数据,完成答题
$.ajax({
    url: " https://yyapi.xueanquan.com/chon ... meWork/HomeWorkSign",
    type: "POST",
    contentType: "application/json",
    dataType: "json",
    data: JSON.stringify(_data),
    xhrFields: {
      withCredentials: true
    },
    timeout: 10 * 1000,
    success: function (_data) {
      console.log(_data);

    }
})
}

一个任务就算完成了。

专项任务也直接上
//专项活动视频签到(很重要)
function sutdentSign(_sid, _exit) {
var _sid = _sid || $("body").attr("data-specialId") || 808;
$.ajax({
    url: "https://huodongapi.xueanquan.com/p/chongqing/Topic/topic/platformapi/api/v1/records/sign",
    type: "POST",
    contentType: "application/json",
    dataType: "json",
    xhrFields: {
      withCredentials: true
    },
    data: JSON.stringify({ "specialId": _sid, "step": 1 }),
    timeout: 10 * 1000,
    success: function (_data) {
      console.log(_data);
      if (_exit) {
      //lockUser(getUrlParam("uid"));
      }
    }
})
}

到此,登陆    看视频   做练习   专项作业就串起来了。因为数据没有加密,所以完全没有压力。
{:1_907:}

Pwaerm 发表于 2023-2-15 10:27

shouwangxinyang 发表于 2023-2-15 10:22
我还一直好奇 是做了加密函数的话是是不是就不能这么做 或者直接删除掉这个能不能过

加密了也能玩。
一种方案是逆向加密函数
另一种方案就简单得多了直接通过devtool控制台获取一个人的数据记录下来,用于其它的人(因为所人有完成的任务都一样,数据相同)
如果加密后每个人的数据不一样,可以通过控制台替换文件在js中直接引用加密函数。

Pwaerm 发表于 2023-2-15 08:19

fyabcabc 发表于 2023-2-15 08:14
他是因为违规三次被ban了帖子自动屏蔽
我这个帖子,只是做数据交互方面的分析。



这里有个王炸: https://anquan.huggy.moe/
据说是个高中学生做的,一看便知。

o.o 发表于 2023-2-14 13:08

针对这个平台,我举双手,你做得对{:1_918:}

Pwaerm 发表于 2023-2-14 13:18

o.o 发表于 2023-2-14 13:08
针对这个平台,我举双手,你做得对

{:1_896:}搜索过历史贴。好像发成品会被删贴。
所以只能分个分析过程 。

fyabcabc 发表于 2023-2-14 13:35

具体怎么用呢

tyz1234 发表于 2023-2-14 14:14

cghray 发表于 2023-2-14 14:15

我举双手支持你!

Pwaerm 发表于 2023-2-14 14:16

tyz1234 发表于 2023-2-14 14:14
小白期待大佬的成品,谢谢

发成品会被删贴。{:1_937:}

yanguichao 发表于 2023-2-14 14:29

我们这儿暂时还未接触到此平台。感谢楼主提前剧透。

Wayne2021 发表于 2023-2-14 14:37

哈哈 虽然看不懂但是很赞

mengyang 发表于 2023-2-14 14:41

不会用啊
页: [1] 2 3 4
查看完整版本: 仅使用浏览器分析某教育平台从登陆到任务完成的数据交换