不懂先生

web后端实践(修补学校oj的分页bug)
序言:经朋友反应学校ACM竞赛答题系统存在漏洞,于是花了3个小时帮朋友解决了这个问题。BUG重现经朋友描述,学校o...
扫描右侧二维码阅读全文
02
2022/03

web后端实践(修补学校oj的分页bug)

序言:

经朋友反应学校ACM竞赛答题系统存在漏洞,于是花了3个小时帮朋友解决了这个问题。

BUG重现

经朋友描述,学校oj在2021年3月份经过大佬改动,将原来竞赛和作业模块分开使用,如下图:
27856-4s0ism3y56v.png
问题是在作业模块页面点击分页功能的页码会跳转到竞赛模块的页面,而不是当前模块的其他页面,bug检查如下:

竞赛页面

竞赛模块get访问的页面是contest.php,如下图:
61300-enk5vur4hhl.png
竞赛页面的分页模块a标签href属性内容如下图:
26672-3apigtgvk78.png
可以看出它的原理是get方式访问page=页面,以访问指定页面。

作业页面

作业模块独立出来,修改的逻辑是在contest.php后面添加homework参数,如下图:
40776-kfuzx0i7e9.png
作业页面的分页模块a标签href属性内容如下图:
41220-4ac3qcud0ho.png
a标签href属性与竞赛页面相同,因为作业页面分页逻辑是用的竞赛页面的分页逻辑,其后端代码在为a标签href属性赋值的时候赋的值是contest.php?page=,而没有携带homework参数。
根据一般分页思路点页面上作业模块访问的应该是作业的第一页,所以为该页面添加参数page=1,使得访问链接为:http://172.23.79.51/contest.php?homework&page=1,访问的页面果然是直接点击作业模块进入的页面,如下图:
38672-143ytipcec8i.png
由此多了一个修复的思路,为a标签的href属性添加一个homework参数,使得点击页码访问到携带参数homework的页面,如下http://172.23.79.51/contest.php?homework&page=,思路有了接下来就是行动。

BUG修复

有了思路,然后就是看后端代码了,因为学校oj是搭在学校服务器了,所在就在朋友搭在本地的oj系统上修改了之后再实际为oj修改源码。
vscode打开项目源码,然后搜索a标签的title属性,找到该模块的源码,分析源码,可以看出其分页模块分为三个部分,上一页、页码数字、下一页,如下图:63016-tzj9p6y7ovj.png
根据修复思路需要判断一下当前访问的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标签下的ahref属性添加homework参数,具体代码再补充。经过测试该方法可行,问题顺利解决,总耗时3小时。

Last modification:March 27th, 2022 at 12:19 pm

Leave a Comment