Portswigger Labs — Portswigger Labs — Access Control Control
字数 2290 2025-08-18 11:36:53
PortSwigger访问控制漏洞教学文档
目录
- 未经保护的管理页面
- 通过请求参数控制用户角色
- 用户角色可在用户配置文件中修改
- 通过请求参数控制用户ID
- 不安全的直接对象引用
- 可绕过的基于URL的访问控制
- 可绕过的基于方法的访问控制
- 多步骤流程中的访问控制缺失
- 基于Referer的访问控制
未经保护的管理页面
漏洞描述:管理页面未受保护,可通过简单方式直接访问。
发现方法:
- 检查
/robots.txt文件,可能包含管理页面路径 - 查看页面源代码,可能包含隐藏的管理页面URL
利用步骤:
- 访问
/robots.txt文件 - 拼接发现的路径直接访问管理页面
- 或通过查看页面源代码发现类似
/admin-4mbdyv的管理路径
防御措施:
- 对管理页面实施严格的访问控制
- 避免在客户端代码中暴露管理路径
- 使用随机生成的管理路径并妥善保护
通过请求参数控制用户角色
漏洞描述:用户角色通过Cookie中的参数直接控制,可被篡改。
发现方法:
- 登录普通用户账户(如wiener)
- 尝试访问管理页面(
/admin),观察返回401未授权 - 检查Cookie,发现
admin=false参数
利用步骤:
- 登录普通账户
- 修改Cookie中的
admin=false为admin=true - 重新访问管理页面
- 成功访问后执行管理操作(如删除用户)
防御措施:
- 不要在客户端存储敏感权限信息
- 服务器端应独立维护用户权限状态
- 对管理操作实施双重验证
用户角色可在用户配置文件中修改
漏洞描述:用户角色通过修改个人资料时的响应参数控制。
发现方法:
- 登录普通账户
- 修改邮箱,观察响应包中的
roleid参数 - 尝试修改
roleid值
利用步骤:
- 登录普通账户
- 修改邮箱,捕获请求
- 在响应中修改
roleid为更高权限值(如从1改为2) - 或直接在请求中添加
roleid:2参数 - 再次访问管理页面验证权限提升
防御措施:
- 服务器端应验证用户是否有权修改角色
- 避免通过客户端参数控制权限
- 实施最小权限原则
通过请求参数控制用户ID
漏洞描述:用户ID通过请求参数直接控制,可能导致信息泄露。
变体1 - 简单ID控制:
- 登录普通账户(如wiener)获取API key
- 修改请求中的
id参数为其他用户(如carlos) - 获取目标用户的API key
变体2 - 随机ID:
- 查找目标用户(carlos)发布的帖子
- 从帖子中获取用户ID(不再是简单用户名)
- 使用该ID获取API key
变体3 - 重定向数据泄露:
- 将请求中的
id改为目标用户 - 观察302跳转响应,可能包含敏感数据
变体4 - 密码泄露:
- 登录普通账户,发现密码字段
- 修改
id为administrator - 将password字段的type改为text显示密码
防御措施:
- 实施严格的用户数据隔离
- 服务器端验证请求用户身份
- 避免在客户端暴露敏感信息
- 对敏感操作实施二次验证
不安全的直接对象引用
漏洞描述:通过可预测的引用直接访问受限资源。
发现方法:
- 使用聊天功能,查看聊天记录
- 发现下载的文件名为数字.txt(如1.txt, 2.txt等)
利用步骤:
- 枚举文件名(如1.txt, 2.txt等)
- 直接访问这些文件
- 可能获取包含密码等敏感信息的文件
防御措施:
- 使用不可预测的引用标识符
- 实施访问控制检查
- 记录和监控异常访问模式
可绕过的基于URL的访问控制
漏洞描述:通过修改HTTP头绕过URL访问控制。
发现方法:
- 直接访问
/admin,返回权限不足 - 尝试使用
X-Original-URL头部
利用步骤:
- 将URL改为
/ - 添加
X-Original-URL: /admin头部 - 或使用浏览器获取删除接口,放入
X-Original-Url中
防御措施:
- 避免依赖URL路径进行访问控制
- 检查所有可能的请求头
- 实施基于角色的访问控制
可绕过的基于方法的访问控制
漏洞描述:通过修改HTTP方法绕过访问控制。
发现方法:
- 使用管理员账户登录
- 访问管理面板,升级用户(carlos)
- 捕获请求
利用步骤:
- 在无痕窗口登录普通用户(wiener)
- 将普通用户的cookie替换到管理员请求中
- 初始尝试返回401
- 将方法从POST改为GET
- 修改username为wiener
- 成功执行特权操作
防御措施:
- 对所有敏感操作实施严格的方法检查
- 不依赖HTTP方法作为安全控制
- 实施CSRF保护
多步骤流程中的访问控制缺失
漏洞描述:多步骤流程中某一步缺少访问控制。
利用步骤:
- 类似于基于方法的访问控制漏洞
- 但无需更改请求方法,直接替换cookie即可
防御措施:
- 对多步骤流程的每一步实施访问控制
- 维护流程状态服务器端
- 验证流程完整性
基于Referer的访问控制
漏洞描述:仅通过Referer头实施访问控制。
发现方法:
- 直接复制特权URL到普通账户访问,返回401
- 识别系统检查Referer头
利用步骤:
- 捕获特权请求(如提升权限)
- 替换为普通用户的cookie
- 保持Referer头不变
- 成功绕过访问控制
防御措施:
- 不依赖Referer头进行安全决策
- Referer头容易被伪造或缺失
- 实施基于会话的访问控制
总结
访问控制漏洞的核心问题是服务器未能正确验证用户权限。防御时应遵循:
- 实施最小权限原则
- 服务器端验证所有请求
- 避免依赖客户端提供的信息做安全决策
- 对敏感操作实施多重验证
- 记录和监控异常访问模式