我们先来认识一下模拟实验,该模拟实验提供了一个简单的高校教务系统。
模拟实验
教务系统:谁能改成绩?
点击“启动模拟”,先看看学生账号张伟在默认页面下能做什么。
按模拟器下方的提示,把地址栏里的身份参数从 student 改成 admin,观察页面多了哪些操作入口,再把《计算机网络》的成绩改成及格分数并保存。
打开模拟器后,右上角显示当前登录的是学生 张伟 (20240001),《计算机网络》考了 59 分,页面上没有任何改分数的按钮。但如果你看一眼模拟器顶部的地址栏,会发现当前的网址是:
campus.example/portal?role=student
网址问号 ? 后面的 role=student 是 URL 参数,意思是“角色=学生”。写这个网站的程序员图省事,没有在服务器后台核对当前登录的张伟到底是不是管理员,而是直接看网址里的 role 参数是什么:退化成了参数写着 student 就显示普通成绩单,写着 admin 就把管理员界面显示出来。
而网址栏里的内容是我们可以自己更改的。所以只要我们把地址栏里的 role=student 改成 role=admin 再跳转,原本只能查分的页面就会多出“成绩录入”功能,只读的 59 分也变成了可以修改的输入框。
像这样绕过限制、拿到了不属于自己权限的数据或功能,就叫越权访问(Broken Access Control)。如果是同级别的用户互相看对方的数据(比如把网址里的学号改成室友的学号,看到了室友的成绩单),叫水平越权;像刚才这样普通学生拿到了管理员的改分功能,则叫垂直越权。
要防止越权,服务器不能相信浏览器传过来的身份参数,而必须在后台根据当前的登录会话(Session)来判断“当前登录的人是谁”(身份认证,Authentication),以及“这个人有没有权限做这件事”(访问控制,Authorization)。
注意
本模块模拟器和靶机里的学校名称、学号与成绩都是虚构的教学数据。在现实中对任何网站或系统做安全测试,都必须事先拿到系统所有者的书面授权,不能随便拿外面的真实网站练手。