Portswigger Labs — Portswigger Labs — Access Control Control
字数 2290 2025-08-18 11:36:53

PortSwigger访问控制漏洞教学文档

目录

  1. 未经保护的管理页面
  2. 通过请求参数控制用户角色
  3. 用户角色可在用户配置文件中修改
  4. 通过请求参数控制用户ID
  5. 不安全的直接对象引用
  6. 可绕过的基于URL的访问控制
  7. 可绕过的基于方法的访问控制
  8. 多步骤流程中的访问控制缺失
  9. 基于Referer的访问控制

未经保护的管理页面

漏洞描述:管理页面未受保护,可通过简单方式直接访问。

发现方法

  1. 检查/robots.txt文件,可能包含管理页面路径
  2. 查看页面源代码,可能包含隐藏的管理页面URL

利用步骤

  1. 访问/robots.txt文件
  2. 拼接发现的路径直接访问管理页面
  3. 或通过查看页面源代码发现类似/admin-4mbdyv的管理路径

防御措施

  • 对管理页面实施严格的访问控制
  • 避免在客户端代码中暴露管理路径
  • 使用随机生成的管理路径并妥善保护

通过请求参数控制用户角色

漏洞描述:用户角色通过Cookie中的参数直接控制,可被篡改。

发现方法

  1. 登录普通用户账户(如wiener)
  2. 尝试访问管理页面(/admin),观察返回401未授权
  3. 检查Cookie,发现admin=false参数

利用步骤

  1. 登录普通账户
  2. 修改Cookie中的admin=falseadmin=true
  3. 重新访问管理页面
  4. 成功访问后执行管理操作(如删除用户)

防御措施

  • 不要在客户端存储敏感权限信息
  • 服务器端应独立维护用户权限状态
  • 对管理操作实施双重验证

用户角色可在用户配置文件中修改

漏洞描述:用户角色通过修改个人资料时的响应参数控制。

发现方法

  1. 登录普通账户
  2. 修改邮箱,观察响应包中的roleid参数
  3. 尝试修改roleid

利用步骤

  1. 登录普通账户
  2. 修改邮箱,捕获请求
  3. 在响应中修改roleid为更高权限值(如从1改为2)
  4. 或直接在请求中添加roleid:2参数
  5. 再次访问管理页面验证权限提升

防御措施

  • 服务器端应验证用户是否有权修改角色
  • 避免通过客户端参数控制权限
  • 实施最小权限原则

通过请求参数控制用户ID

漏洞描述:用户ID通过请求参数直接控制,可能导致信息泄露。

变体1 - 简单ID控制

  1. 登录普通账户(如wiener)获取API key
  2. 修改请求中的id参数为其他用户(如carlos)
  3. 获取目标用户的API key

变体2 - 随机ID

  1. 查找目标用户(carlos)发布的帖子
  2. 从帖子中获取用户ID(不再是简单用户名)
  3. 使用该ID获取API key

变体3 - 重定向数据泄露

  1. 将请求中的id改为目标用户
  2. 观察302跳转响应,可能包含敏感数据

变体4 - 密码泄露

  1. 登录普通账户,发现密码字段
  2. 修改id为administrator
  3. 将password字段的type改为text显示密码

防御措施

  • 实施严格的用户数据隔离
  • 服务器端验证请求用户身份
  • 避免在客户端暴露敏感信息
  • 对敏感操作实施二次验证

不安全的直接对象引用

漏洞描述:通过可预测的引用直接访问受限资源。

发现方法

  1. 使用聊天功能,查看聊天记录
  2. 发现下载的文件名为数字.txt(如1.txt, 2.txt等)

利用步骤

  1. 枚举文件名(如1.txt, 2.txt等)
  2. 直接访问这些文件
  3. 可能获取包含密码等敏感信息的文件

防御措施

  • 使用不可预测的引用标识符
  • 实施访问控制检查
  • 记录和监控异常访问模式

可绕过的基于URL的访问控制

漏洞描述:通过修改HTTP头绕过URL访问控制。

发现方法

  1. 直接访问/admin,返回权限不足
  2. 尝试使用X-Original-URL头部

利用步骤

  1. 将URL改为/
  2. 添加X-Original-URL: /admin头部
  3. 或使用浏览器获取删除接口,放入X-Original-Url

防御措施

  • 避免依赖URL路径进行访问控制
  • 检查所有可能的请求头
  • 实施基于角色的访问控制

可绕过的基于方法的访问控制

漏洞描述:通过修改HTTP方法绕过访问控制。

发现方法

  1. 使用管理员账户登录
  2. 访问管理面板,升级用户(carlos)
  3. 捕获请求

利用步骤

  1. 在无痕窗口登录普通用户(wiener)
  2. 将普通用户的cookie替换到管理员请求中
  3. 初始尝试返回401
  4. 将方法从POST改为GET
  5. 修改username为wiener
  6. 成功执行特权操作

防御措施

  • 对所有敏感操作实施严格的方法检查
  • 不依赖HTTP方法作为安全控制
  • 实施CSRF保护

多步骤流程中的访问控制缺失

漏洞描述:多步骤流程中某一步缺少访问控制。

利用步骤

  1. 类似于基于方法的访问控制漏洞
  2. 但无需更改请求方法,直接替换cookie即可

防御措施

  • 对多步骤流程的每一步实施访问控制
  • 维护流程状态服务器端
  • 验证流程完整性

基于Referer的访问控制

漏洞描述:仅通过Referer头实施访问控制。

发现方法

  1. 直接复制特权URL到普通账户访问,返回401
  2. 识别系统检查Referer头

利用步骤

  1. 捕获特权请求(如提升权限)
  2. 替换为普通用户的cookie
  3. 保持Referer头不变
  4. 成功绕过访问控制

防御措施

  • 不依赖Referer头进行安全决策
  • Referer头容易被伪造或缺失
  • 实施基于会话的访问控制

总结

访问控制漏洞的核心问题是服务器未能正确验证用户权限。防御时应遵循:

  1. 实施最小权限原则
  2. 服务器端验证所有请求
  3. 避免依赖客户端提供的信息做安全决策
  4. 对敏感操作实施多重验证
  5. 记录和监控异常访问模式
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头容易被伪造或缺失 实施基于会话的访问控制 总结 访问控制漏洞的核心问题是服务器未能正确验证用户权限。防御时应遵循: 实施最小权限原则 服务器端验证所有请求 避免依赖客户端提供的信息做安全决策 对敏感操作实施多重验证 记录和监控异常访问模式