序言:
经朋友反应学校ACM竞赛答题系统存在漏洞,于是花了3个小时帮朋友解决了这个问题。
BUG重现
经朋友描述,学校oj在2021年3月份经过大佬改动,将原来竞赛和作业模块分开使用,如下图:
问题是在作业模块页面点击分页功能的页码会跳转到竞赛模块的页面,而不是当前模块的其他页面,bug检查如下:
竞赛页面
竞赛模块get访问的页面是contest.php,如下图:
竞赛页面的分页模块a
标签href
属性内容如下图:
可以看出它的原理是get
方式访问page=
页面,以访问指定页面。
作业页面
作业模块独立出来,修改的逻辑是在contest.php
后面添加homework
参数,如下图:
作业页面的分页模块a
标签href
属性内容如下图:a
标签href
属性与竞赛页面相同,因为作业页面分页逻辑是用的竞赛页面的分页逻辑,其后端代码在为a
标签href
属性赋值的时候赋的值是contest.php?page=
,而没有携带homework
参数。
根据一般分页思路点页面上作业模块访问的应该是作业的第一页,所以为该页面添加参数page=1
,使得访问链接为:http://172.23.79.51/contest.php?homework&page=1
,访问的页面果然是直接点击作业模块进入的页面,如下图:
由此多了一个修复的思路,为a
标签的href
属性添加一个homework
参数,使得点击页码访问到携带参数homework
的页面,如下http://172.23.79.51/contest.php?homework&page=
,思路有了接下来就是行动。
BUG修复
有了思路,然后就是看后端代码了,因为学校oj是搭在学校服务器了,所在就在朋友搭在本地的oj系统上修改了之后再实际为oj修改源码。
用vscode
打开项目源码,然后搜索a
标签的title
属性,找到该模块的源码,分析源码,可以看出其分页模块分为三个部分,上一页、页码数字、下一页,如下图:
根据修复思路需要判断一下当前访问的url是否携带homework
参数,这个功能实现有很多方式,js、php都可以,因为该页面是php直接输出到前端的,所以直接在后端判断效率会更快一些,查看当前访问url携带的参数用的是$_SERVER["QUERY_STRING"],其返回一个string
,获取到的是http://172.23.79.51/contest.php?
之后的参数,然后判断homework参数是否在其中即可。用到phpperg_match()
函数,该函数检测指定模式是否在一个字符串内出现。$url=$_SERVER["QUERY_STRING"]
,if条件内容设置为如下if(perg_match('/homework/i',$url))
,如果符合这个条件则为li标签下的a
的href
属性添加homework
参数,具体代码再补充。经过测试该方法可行,问题顺利解决,总耗时3小时。