摘要:本文是《DVWA从入门到精通》系列的第十六篇,带你全面掌握Authorisation Bypass(授权绕过)模块的攻防全流程。从认证与授权的核心区别出发,逐步讲解Low、Medium、High三个级别的攻击手法与源码分析,并深入探讨Impossible级别的终极防御方案。文章包含直接对象引用(IDOR)、垂直权限提升、水平权限提升、API端点未授权访问、Burp Suite数据包篡改等高阶技术,以及严格的访问控制检查、最小权限原则、统一的权限验证中间件等企业级防御策略,让你真正做到“知其然更知其所以然”。
一、什么是授权绕过?
1.1 认证(Authentication)vs 授权(Authorization)
在理解授权绕过之前,必须先分清两个极易混淆的核心概念:
| 概念 | 英文 | 含义 | 生活类比 |
|---|---|---|---|
| 认证 | Authentication | “你是谁?”——验证用户身份 | 出示身份证,证明你是你本人 |
| 授权 | Authorization | “你能做什么?”——验证用户权限 | 根据你的身份,决定你能进入哪些区域 |
用一个生活化的例子来理解:
想象你去一栋写字楼。在一楼大厅,你向保安出示了工牌(认证——证明你是公司员工)。保安确认后让你进入大楼。但是,你的工牌权限只能让你进入1-10楼的办公区,而11楼是财务部,需要更高权限。如果你没有财务部的授权却偷偷溜进了11楼,这就是授权绕过。
认证解决了“你是谁”的问题,授权解决了“你能做什么”的问题。认证通过不代表授权正确——一个用户即使成功登录了系统,也可能通过某些手段访问到超出其权限范围的资源。
从技术角度来看:
授权绕过(Authorisation Bypass)是一种严重的安全漏洞,攻击者通过利用系统的漏洞或错误配置,绕过正常的访问控制机制,获得未经授权的访问权限。这种漏洞可能导致敏感信息泄露、数据篡改、系统破坏等严重后果。
1.2 授权绕过的常见类型
授权绕过漏洞通常表现为以下几种形式:
| 类型 | 说明 | 示例 |
|---|---|---|
| 垂直权限提升 | 低权限用户获取高权限功能 | 普通用户访问管理员后台 |
| 水平权限提升 | 用户访问同级其他用户的数据 | 用户A查看用户B的订单信息 |
| 直接对象引用(IDOR) | 通过修改URL参数访问未授权资源 | ?id=1改为?id=2查看他人资料 |
| 功能级访问控制缺失 | 隐藏但未禁用的管理功能可被直接访问 | 直接输入管理页面的URL |
| API端点未授权 | API接口缺乏权限验证 | 直接调用管理API修改数据 |
1.3 模块目标
DVWA的Authorisation Bypass模块模拟了一个用户管理系统:
正常情况:只有管理员(admin)可以访问用户管理页面,查看和修改所有用户的信息
攻击目标:作为非管理员用户(如
gordonb),实现用户管理的功能核心挑战:找到系统中授权检查的漏洞,绕过权限限制
二、准备工作
2.1 靶场环境
确保DVWA已部署并正常运行:
访问地址:
http://你的服务器IP/dvwa/login.php准备两个测试账号:
管理员账号:
admin/password普通用户账号:
gordonb/abc123
2.2 必备工具
| 工具 | 用途 |
|---|---|
| 浏览器(Chrome/Firefox) | 访问靶场,观察菜单变化 |
| Burp Suite | 抓包分析、修改请求参数(Medium/High级别必需) |
2.3 基础知识储备
理解HTTP请求方法(GET、POST)
了解Cookie和Session的基本概念
熟悉浏览器的开发者工具
三、Low级别:菜单隐藏≠权限控制
3.1 安全级别设置
将DVWA Security设置为Low级别,然后以普通用户gordonb登录DVWA。
3.2 观察变化:菜单消失了!
使用gordonb(密码abc123)登录后,观察左侧菜单栏——“Authorisation Bypass”这个选项消失了。
这说明系统在前端隐藏了管理功能的入口。但是——前端隐藏 ≠ 后端禁止。
3.3 核心漏洞:URL直接访问
虽然菜单被隐藏了,但每个漏洞模块实际上对应一个固定的子路径。管理员能访问的页面路径是:
http://靶机IP/vulnerabilities/authbypass/普通用户虽然看不到菜单入口,但只要知道这个路径,就可以直接在浏览器地址栏中输入并访问!
攻击步骤:
以普通用户
gordonb登录DVWA在浏览器地址栏直接输入:
http://靶机IP/vulnerabilities/authbypass/页面成功加载,显示用户管理列表——普通用户成功访问了管理员功能!
3.4 更深层的漏洞:API接口也未授权
除了页面本身,Low级别中用于获取用户数据的API接口也同样没有任何权限保护。
访问以下路径同样可以获取所有用户的数据:
http://靶机IP/vulnerabilities/authbypass/get_user_data.php页面直接返回了数据库中所有用户的JSON数据。
3.5 源码分析
查看Low级别的核心代码:
<?php /* Nothing to see here for this vulnerability, have a look instead at the dvwaHtmlEcho function in: * dvwa/includes/dvwaPage.inc.php */ ?>这段代码意味着什么?
Low级别的页面源码中没有任何授权检查的代码。页面本身不包含任何权限验证逻辑——任何人都可以访问。
访问控制仅依赖于前端菜单的显示/隐藏,而后端完全没有实施任何权限检查。这就是典型的功能级访问控制缺失漏洞。
3.6 Low级别总结
| 缺陷 | 说明 |
|---|---|
| 仅前端隐藏菜单 | 菜单隐藏不等于权限控制 |
| 无后端授权检查 | 页面源码中没有任何权限验证 |
| API接口未授权 | 数据接口同样可被直接访问 |
| URL可预测 | 模块路径有固定规律,可被猜测 |
四、Medium级别:页面拦住≠接口拦住
4.1 安全级别设置
将DVWA Security切换为Medium级别,仍以普通用户gordonb登录。
4.2 观察变化:页面进不去了
在Medium级别下,尝试直接访问/vulnerabilities/authbypass/:
http://靶机IP/vulnerabilities/authbypass/页面显示“Unauthorised”(未经授权)——这次被拦住了!
4.3 源码分析:页面级别的权限检查
查看Medium级别的核心代码:
<?php /* Only the admin user is allowed to access this page. Have a look at these two files for possible vulnerabilities: * vulnerabilities/authbypass/get_user_data.php * vulnerabilities/authbypass/change_user_details.php */ if (dvwaCurrentUser() != "admin") { print "Unauthorised"; http_response_code(403); exit; } ?>Medium级别的变化:
| 改进 | 说明 |
|---|---|
| 增加了管理员身份检查 | 只有admin用户才能访问主页面 |
| 返回403状态码 | 未授权访问被明确拒绝 |
| 提示查看两个文件 | 代码注释中暗示了可能的突破口 |
4.4 关键发现:API接口仍然未授权!
Medium级别的源码注释中特别提到了两个文件:
vulnerabilities/authbypass/get_user_data.php vulnerabilities/authbypass/change_user_details.php攻击思路:
虽然主页面index.php做了权限检查,但数据获取接口get_user_data.php和修改接口change_user_details.php可能没有同样的检查!
攻击步骤:
第一步:直接访问数据接口
http://靶机IP/vulnerabilities/authbypass/get_user_data.php页面成功返回了所有用户的JSON数据!
第二步:Burp 构造合法 POST 请求修改用户资料
打开BurpSuite,开启代理拦截
浏览器开启代理,访问修改用户界面
http://靶机IP/vulnerabilities/authbypass/change_user_details.php修改请求方法为post
通过get获取的用户数据,构造合法 POST 请求修改用户资料
{"id":"3","first_name":"YSYX","surname":"YYYY"} //修改id为3的用户的姓和名点击放行,验证修改成功
4.5 攻击原理分析
Medium级别的漏洞本质是:授权检查只覆盖了主页面,但没有覆盖所有相关的API接口。
当开发人员必须在复杂的系统中构建授权矩阵时,他们很容易忽略在每个地方添加正确的检查,尤其是那些无法通过浏览器直接访问的地方,例如API调用。
4.6 Medium级别总结
| 改进 | 局限性 |
|---|---|
| 主页面增加了管理员检查 | API接口没有同样的检查 |
| 返回403禁止访问 | 攻击者可绕过页面直接调用接口 |
| 比Low级别有所提升 | 授权检查覆盖不完整 |
五、High级别:GET拦住≠POST拦住
5.1 安全级别设置
将DVWA Security切换为High级别,仍以普通用户gordonb登录。
5.2 观察变化:GET请求被拦了
在High级别下,尝试直接访问get_user_data.php:
http://靶机IP/vulnerabilities/authbypass/get_user_data.php页面显示“Unauthorised”——GET请求被拦截了。
5.3 源码分析
查看High级别的核心代码:
<?php /* Only the admin user is allowed to access this page. Have a look at this file for possible vulnerabilities: * vulnerabilities/authbypass/change_user_details.php */ if (dvwaCurrentUser() != "admin") { print "Unauthorised"; http_response_code(403); exit; } ?>High级别的变化:
| 改进 | 说明 |
|---|---|
get_user_data.php也加了检查 | 数据获取接口被保护了 |
仅提示change_user_details.php | 暗示修改接口可能是突破口 |
5.4 攻击方法:POST请求绕过
虽然GET请求被拦截了,但change_user_details.php接口可能接受POST请求,而POST请求的权限检查可能与GET不同。
攻击步骤:
第一步:使用Burp Suite抓包
配置好Burp Suite代理,准备拦截和修改请求。
第二步:构造POST请求
直接向change_user_details.php发送POST请求,尝试修改用户数据:
第三步:观察响应
服务器成功处理了请求,用户信息被修改!
5.5 攻击原理分析
High级别的漏洞本质与Medium级别类似,但更隐蔽:GET请求被拦截了,但POST请求没有被拦截。
开发人员可能只检查了$_GET请求的权限,而忽略了$_POST请求同样需要进行授权验证。
5.6 High级别总结
| 改进 | 局限性 |
|---|---|
get_user_data.php增加了检查 | change_user_details.php的POST请求未检查 |
| GET请求被拦截 | POST请求可以绕过 |
| 覆盖面更广 | 请求方法层面的检查不完整 |
六、Impossible级别:终极防御方案
6.1 安全级别设置
将DVWA Security切换为Impossible级别。
6.2 源码分析
查看Impossible级别的核心代码:
<?php /* Only the admin user is allowed to access this page */ if (dvwaCurrentUser() != "admin") { print "Unauthorised"; http_response_code(403); exit; } ?>6.3 Impossible级别的防御机制
乍一看,Impossible级别的代码与Medium/High级别看起来几乎一样——都是检查当前用户是否为admin。
但关键在于:
所有入口都被保护:不仅是主页面,所有相关的API接口、文件都统一进行了权限检查
统一的权限验证机制:不存在“漏网之鱼”
没有可绕过的接口:所有可能被直接访问的端点都实施了相同的检查
6.4 安全启示
Impossible级别传达了一个重要的安全原则:
“没有绝对安全的防护,但是一定要做好安全防护措施”。
对于授权控制来说,这意味着:
| 原则 | 说明 |
|---|---|
| 统一入口 | 所有功能点使用统一的权限验证机制 |
| 全面覆盖 | 不遗漏任何API接口、文件或请求方法 |
| 服务端强制 | 不依赖前端隐藏,所有检查在服务端完成 |
| 最小权限 | 只授予完成任务所需的最低权限 |
6.5 为什么Impossible级别无法被绕过?
| 攻击方式 | Impossible级别的防护 | 攻击者能否达成 |
|---|---|---|
| URL直接访问 | 所有页面统一权限检查 | ❌ 被拦截 |
| API接口直接调用 | 所有接口统一权限检查 | ❌ 被拦截 |
| POST请求绕过 | 所有请求方法统一检查 | ❌ 被拦截 |
| 前端菜单隐藏 | 不依赖前端控制 | ❌ 后端强制检查 |
统一、全面、强制的权限检查,使得授权绕过攻击在Impossible级别下完全不可行。
七、防御授权绕过的最佳实践
通过DVWA四个级别的对比,我们可以总结出防御授权绕过的最佳实践:
7.1 必须实施的防御措施
| 措施 | 说明 | 优先级 |
|---|---|---|
| 统一的访问控制机制 | 所有页面和API使用统一的权限验证中间件 | ⭐⭐⭐⭐⭐ |
| 服务端强制检查 | 不依赖前端隐藏,所有检查在服务端完成 | ⭐⭐⭐⭐⭐ |
| 覆盖所有请求方法 | GET、POST、PUT、DELETE等全部检查 | ⭐⭐⭐⭐⭐ |
| 覆盖所有端点 | 页面、API接口、静态资源等全部覆盖 | ⭐⭐⭐⭐⭐ |
7.2 推荐的辅助措施
| 措施 | 说明 | 优先级 |
|---|---|---|
| 最小权限原则 | 只授予用户完成任务所需的最低权限 | ⭐⭐⭐⭐⭐ |
| 基于角色的访问控制(RBAC) | 明确定义角色和权限矩阵 | ⭐⭐⭐⭐ |
| 参数验证和加密 | 对URL参数和请求参数进行严格验证 | ⭐⭐⭐⭐ |
| 日志和监控 | 记录所有访问和修改操作 | ⭐⭐⭐ |
7.3 常见误区
在实际开发中,以下做法不能有效防御授权绕过:
❌仅在前端隐藏菜单/按钮:攻击者可以直接输入URL访问(如Low级别)
❌仅保护主页面:API接口可能被直接调用(如Medium级别)
❌仅拦截GET请求:POST请求可能被绕过(如High级别)
❌分散的权限检查:不同功能使用不同的检查逻辑,容易遗漏
八、授权绕过的实战检测思路
在实际的渗透测试中,如何快速发现授权绕过漏洞?
8.1 检测步骤
识别功能角色:确定系统中存在哪些角色(管理员、普通用户、访客等)
映射功能点:列出所有页面、API接口和功能
低权限测试:使用低权限账号访问高权限功能
直接URL访问:尝试直接输入管理页面的URL
API接口测试:尝试直接调用管理API
请求方法变换:尝试用不同的HTTP方法(GET、POST、PUT等)
参数篡改:修改请求中的用户ID等参数
8.2 常见检测手法
| 检测手法 | 说明 | DVWA对应级别 |
|---|---|---|
| 直接URL访问 | 输入管理功能路径 | Low |
| API接口调用 | 直接访问数据接口 | Medium |
| 请求方法变换 | GET改POST | High |
| 参数遍历 | 修改ID参数 | 水平权限提升 |
| Cookie篡改 | 修改用户标识 | 会话劫持 |
8.3 关键测试点
在实际测试中,以下位置最容易出现授权绕过:
隐藏的管理页面:
/admin、/manage、/system等API接口:
/api/users、/api/admin等文件上传接口:可能被用于上传WebShell
用户资料修改接口:可能修改其他用户的信息
配置修改接口:可能修改系统配置
九、总结
本文系统学习并实战复现了 Web 授权绕过漏洞的原理、分类与防御方案。本章首先明确了认证与授权的核心区别:认证用于校验用户身份、解决 “你是谁” 的问题,授权用于管控用户权限、解决 “你能做什么” 的问题;同时梳理了授权绕过的常见漏洞类型,包含垂直权限提升、水平权限提升、IDOR 未授权访问、功能级访问控制缺失、API 接口未授权等主流场景。随后逐级完成 DVWA 授权绕过模块的攻防实战:Low 级别仅在前端隐藏管理菜单,后端未部署任何权限校验,攻击者可直接通过访问 URL 绕过前端限制进入管理页面;Medium 级别虽对主页面增加了管理员权限校验,但后端get_user_data.php、change_user_details.php等核心 API 接口缺失权限判断,存在接口未授权访问漏洞;High 级别完善了部分接口防护,对get_user_data.php请求做了权限校验,但仍存在防护遗漏,change_user_details.php的 POST 请求依旧可以绕过权限限制;Impossible 级别构建了完整的授权防御体系,对所有页面、所有后端接口、全部请求方法统一强制校验权限,全方位杜绝授权绕过风险。最后本章总结了授权漏洞的核心防御最佳实践,包括搭建统一访问控制机制、服务端强制校验权限、全覆盖所有业务端点与请求方法、严格遵循最小权限原则等。授权绕过属于典型的 Web 业务逻辑漏洞,并非代码注入类缺陷,核心成因是开发设计疏漏导致权限校验缺失或不完整。通过本模块的分级学习,我们不仅掌握了授权绕过漏洞的挖掘与利用方法,更建立了系统化的权限设计思维。在实际生产环境中,依托统一权限校验中间件、全覆盖接口端点校验、落实最小权限原则的组合防御方案,能够从架构层面彻底规避授权绕过漏洞,保障 Web 业务访问安全。
重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。