从业者-垂直权限提升-基于URL的访问控制
# 实验室:绕过基于URL的访问控制
# 题目
此网站在/admin
处有一个未经身份验证的管理面板,但前端系统已阻止对该路径的外部访问。但是,后端应用程序构建在某个框架上,该框架支持X-Original-URL
标头。
要解决实验室问题,请访问管理面板并删除carlos
用户。
- name: 实验室-从业者
desc: 绕过基于URL的访问控制 >>
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/access-control/lab-url-based-access-control-can-be-circumvented
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
根据题意,可得实验目标:
- 尝试利用标头 X-Original-URL 绕过访问控制,然后访问管理面板并删除 carlos 用户。
点击 “ACCESS THE LAB” 进入实验室。

实验室首页如下,点击右上角的 “Admin panel” 。

访问被拒绝。

捕获一个请求数据包,转发到 Repeater 功能模块。

添加X-Original-URL
标头,参数值为/admin
。再次发送请求数据包,响应内容发生了变化。

查看响应内容,出现了管理面板的信息,说明访问成功。

接着,利用浏览器插件 携带对应的X-Original-URL
标头去访问管理面板,然后点击 Delete 删除 carlos 用户。

删除失败,拒绝访问。
我们只获得了/admin
的访问权限,但是没有/admin/delete
的访问权限。

这简单,将标头中的/admin
修改为/admin/delete?username=carlos
,然后再次访问。
访问虽然成功了,但是程序返回了错误信息 “缺少参数 username ” 。

一般情况下,应用程序会从 URL 中获取 GET 传参,或从请求主体中获取 POST 传参。
但此时,我们的username
参数是放在X-Original-URL
标头里面的,而应用程序并没有从该标头中解析传参。
这好办,我们可以在标头中传递路径/admin/delete
,然后在 URL 中传递参数?username=carlos
,如图。
再次发送数据包,请求成功。

回到浏览器,刷新网页。
用户删除成功,实验完成。

编辑 (opens new window)