起因

本来是想着用Python写一个抢课的脚本,没想到在研究教务系统的网页时发现了我们教务系统漏洞还挺多。

学校教务系统搭建在IIS上,这个方正教务系统用的是ASP .NET,系统版本还是2017年的,据我们学长说以前也被人搞过,但仍然很长一段时间都没有升级系统。

教务系统底部

分析

这里我已经提前知道了我们选课的那个页面对应xsxk.aspx,但教务系统首页现在的导航栏你活动报名一栏没有开放学生选课的入口,于是我们尝试把地址栏中的xs_main.aspx改为xsxk.aspx。一开始服务器返回了302,页面显示:Object moved to here,没事我们直接点进去,然后会有一个alert弹出,直接忽略就能进去了。


点一下查看课表就可以把隐藏的按钮显示出来。

点选修课程,然后会有一个窗口弹出,这里可能会被chrome拦截,点地址栏的允许弹出窗口就行了。

随便选一个项目,然后点选定,这时主窗口的课程列表就会更新。

随便点一个课程然后又会有一个弹出窗口,同时会有不允许选课的alert弹出。

这时我们不要点确定,否则窗口就会被关闭。复制这个窗口地址栏的网址,新建一个标签页打开。弹出alert后就可以直接点确定,不出意外的话这个标签页应该不会被关闭。

但是这个页面仍然不允许选课,没事,依照刚才的思路,一定是有东西被隐藏了。我们通过开发人员工具可以发现,关闭按钮前面还有两个button的样式都被设为了DISPLAY:NONE

把这两个button的DISPLAY属性都取消掉,关闭按钮前面就会出现两个空白的按钮。尝试点第一个按钮,就会弹出如下提示。

同时我们想要的选课界面就出来了。

选中单选框并选中不预定教材,然后点点选定按钮提交,就会用保存成功的提示。

我们回到之前的页面查看我们的已选课程:

已选课程里面已经有了我们刚才选的课。

更大胆的想法

教务系统网页提交信息时都会同时提交ViewState,虽然没有学过ASP,但通过查询资料,我觉得这个地方大有文章可做。

尝试进行base64解码,结果里面出现了明文,说明没有经过加密。

资料:

当 ASP .NET 中的表单被提交时,表单会随所有表单值一同重新出现。如何做到的呢?这是由于 ASP .NET 维持了您的 ViewState。ViewState 会在页面被提交到服务器时指示其状态。通过在每张页面中的一个 <form runat="server">控件中放置一个隐藏域,我们就可以定义页面的状态了。

之后我专门查了关于这个VIEWSTATE里面的猫腻,发现了这个ViewState里面有不少可以利用的漏洞。

其实ViewState 真正的问题在与其潜在的反序列化漏洞风险。ViewState 使用ObjectStateFormatter 进行反序列化,虽然ViewState 采取了加密和签名的安全措施。但是一旦泄露web.config,获取其加密和签名所用的密钥和算法,我们就可以将ObjectStateFormatte 的反序列化payload 进行同样的加密与签名,然后再发给服务器。这样ASP.NET在进行反序列化时,正常解密和校验,然后把payload交给ObjectStateFormatter 进行反序列化,触发其反序列化漏洞,实现RCE。

由此,我们就可以在ViewState里进行XSS注入以实现跨站脚本攻击,从而在服务器上运行任意代码(我是这么理解的)。即使服务端开启了安全验证,我们仍然可以使用其他手段获取签名密钥以实现注入。

不过目前因为知识范围有限,暂时还没有进行相关的实验,以后有机会可以在教务系统上实验一下。

参考资料