从业者-有缺陷的假设-复用端点的弱隔离
# 实验室:复用端点的弱隔离
# 题目
此实验室 根据用户的输入对用户的权限级别 做出了有缺陷的假设。因此,你可以利用其帐户管理功能的逻辑,来访问任意用户的帐户。要解决实验室问题,请访问administrator
帐户并删除carlos
用户。
你可以使用以下凭据登录到自己的帐户:wiener
:peter
- name: 实验室-从业者
desc: 复用端点的弱隔离 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-weak-isolation-on-dual-use-endpoint
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
根据题意,可得实验目标:
- 该实验室的 用户鉴权 中存在逻辑缺陷,能够访问站点上 任意用户的账户。
- 利用逻辑缺陷,访问 administrator 用户的账户面板,然后删除 carlos 用户。
点击 “Access the lab” 进入实验室。

点击 “My account” 进入登录页面。

输入题目中提供的用户名和密码 并进行登录。

登录之后,可以看到账户页面信息,并且存在 邮箱更新 和 密码更改 两个功能。

在网站的/admin
路径处 存在管理界面,只允许管理员身份访问。

回到账户页面,使用密码更改功能,尝试修改 administrator 用户的密码。

提交表单之后,当前用户名从 wiener 变为了 administrator,同时提示更改失败。

再试一次,这次启用浏览器代理,然后提交表单。

这是更改密码的请求数据包,包含五个参数,其中包括用户名、当前密码、新密码、确认新密码。

尝试修改或删除数据包中的 username 参数,会影响当前显示的用户名。

那如果删除 current-password(当前密码) 参数呢?
密码更改成功...

尝试使用新密码登录 administrator 账户。

登录成功,点击 “Admin panel” 进入管理界面。

点击 “Delete” 删除 carlos 账户。

删除成功,实验完成。

# 修复建议
我想,服务端的漏洞代码应该是这样写的(以 PHP 为例):
if (isset($_POST['current-password'])) {
# 如果POST中存在current-password参数, 则校验密码是否正确
...省略
}
# 更改密码
$username = $_POST['username'];
$password = $_POST['new-password-1'];
change($username, $password)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
只要删除 POST 中的 current-password 参数,程序就不会进入 if 代码块,不会判断当前密码是否正确,然后直接执行下方的更改操作。
修复:
if (isset($_POST['current-password'])) {
# 如果POST中存在current-password参数, 则校验密码是否正确
...省略
} else {
# 如果不存在该参数, 返回错误信息
return '请输入当前密码!';
}
# 更改密码
...
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
编辑 (opens new window)