文章目录
一、访问控制简介
访问控制决定了用户是否可以执行某个操作或访问某个资源。访问控制的三个关键组件:身份认证、会话管理和访问控制。访问控制依赖于 身份认证和 会话管理。
- 身份认证:确认用户的身份。
- 会话管理:确定后续的HTTP请求是否由同一个用户发起。
常见的访问控制类型:
- 垂直访问控制:不同类型的用户拥有不同的功能权限。如:管理员可以修改或删除任何用户的账户,而普通用户没有这些权限。
- 水平访问控制:不同用户拥有对同一类型资源的不同子集的访问权限。
如:银行应用允许用户查看自己的交易记录和进行支付,但不能访问其他用户的账户。 - 上下文相关访问控制:根据应用程序的状态或用户与应用程序的交互情况,限制对功能和资源的访问。如:电商网站在用户完成支付后,禁止用户修改购物车内容。
二、垂直越权
垂直越权:低权限用户——高权限用户,如:普通用户可以访问管理员页面并删除用户账户。
2.1 Unprotected functionality
当应用程序未对敏感功能实施任何保护时,就会导致垂直权限提升。常用攻击方式:URL 泄露(管理功能的 URL 可能泄露在 robots.txt 文件中)、暴力破解(扫描路径)。
2.1.1 Lab: Unprotected admin functionality(URL泄露)
访问./robots.txt
,即可知道管理员路径
删除用户carlos
即可
2.1.2 Lab: Unprotected admin functionality with unpredictable URL
关键:应用程序将管理功能隐藏在一个难以猜测的URL中,但是在js脚本中可能出现包含管理功能的url。
在响应包的js脚本中写有管理功能路径/admin-ujhl88
2.2 Parameter-based access control methods
应用程序在用户登录时确定其访问权限或角色,并将这些信息存储在用户可控的位置(例如隐藏字段、Cookie 或查询字符串参数)。如:
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
2.2.1 Lab: User role controlled by request parameter
使用wiener:peter
正常登录,管理员路径在/admin
,正常情况以当前的身份是不可访问该路径的。
查看数据包,服务端判断是不是admin
用户,是通过cookie
中的Admin
的值进行判断的。修改该值即可垂直越权。
2.2.2 Lab: User role can be modified in user profile
使用wiener:peter
正常登录,管理员路径在/admin
,正常情况以当前的身份是不可访问该路径的。
Update email
功能处更新email,可以看到返回 "roleid": 1
。
重新更改email
,在body部分添加"roleid": 2
,可以看到返回
再访问/admin
,即可垂直越权。
2.3 Broken access control resulting from platform misconfiguration
背景:一些应用程序在平台层实施访问控制,通过限制特定URL和HTTP方法的访问来保护资源。
如果平台配置错误,可能导致访问控制被绕过。应用程序框架可能支持非标准HTTP头(例如X-Original-URL
和X-Rewrite-URL
),允许覆盖原始请求中的URL。
使用
X-Original-URL
或X-Rewrite-URL
,实际访问的URL是X-Original-URL
指定的URL,而不是请求行中的URL。
2.3.1 Lab: URL-based access control can be circumvented
访问/admin
,显示Access denied
,且是文字,说明这段响应来源于前端系统。
这里说的前端系统是:反向代理、负载均衡器、Web 应用防火墙、CDN、API 网关和前端服务器等。
访问/
,同时添加请求头X-Original-Url: /invalid
(告诉服务器的后端系统实际访问/inalid
),说明服务器的后端系统支持X-Original-Url
。
使用X-Original-Url: /admin
绕过服务器的前端系统的限制。
删除carlos
时,不能将参数放在X-Original-Url
中。
2.3.2 Lab: Method-based access control can be circumvented
一些网站允许使用不同的HTTP方法执行相同的操作,这可能导致访问控制被绕过。
登录admin
用户和wiener
用户,在admin用户中将carlos
升权限的数据包中,将cookie替换为wiener
的cookie,可以发现Unauthorized
。
将POST
方法改为GET
方式,成功实现
2.4 Broken access control resulting from URL-matching discrepancies
不同网站对路径的匹配规则可能不同,导致访问控制机制失效。
- 大小写敏感性:一些网站可能容忍路径的大小写不一致,例如
/ADMIN/DELETEUSER
可能被映射到/admin/deleteUser
。 - 文件扩展名:如果开发者启用了
useSuffixPatternMatch
选项(Spring 框架),路径中的任意文件扩展名可能被忽略。如:/admin/deleteUser.anything
可能被映射到/admin/deleteUser
。 - 尾部斜杠:一些系统可能将
/admin/deleteUser
和/admin/deleteUser/
视为不同的路径。
三、水平越权
水平越权:允许用户访问属于其他用户的资源,通常通过修改请求中的参数值实现。
3.1 Lab: User ID controlled by request parameter
登录wiener:peter
,修改参数id
的值即可。
3.2 Lab: User ID controlled by request parameter, with unpredictable user IDs
一些应用程序使用不可预测的参数值(如GUIDs
)来标识用户,而不是递增的数字。如:
https://insecure-website.com/myaccount?id=550e8400-e29b-41d4-a716-446655440000
登录wiener:peter
,发现使用不可预测的参数值来标识用户。
发现一篇由carlos
发布的文章,点开可以看到链接:userId=a6d080ad-ef1d-40da-ac2e-416c5182fa7e
,则获取到carlos
的身份值。
3.3 Lab: User ID controlled by request parameter with data leakage in redirect
即使应用程序检测到用户无权访问资源并返回登录页面的重定向,响应中仍可能包含目标用户的 敏感数据,从而导致攻击成功。
将id
改为carlos
即可获取该用户信息。
四、水平越权变为垂直越权
水平权限提升攻击 以通过获取管理员账户的访问权限,转变为垂直权限提升攻击。
4.1 Lab: User ID controlled by request parameter with password disclosure
将id
改为administrator
,即可获取管理员用户的密码
登录管理员账号删除carlos
即可。
4.2 Lab: Insecure direct object references
不安全的直接对象引用(IDOR):当应用程序使用用户提供的输入直接访问对象(如文件、数据库记录等),并且攻击者可以修改输入以获取未授权访问时,就存在 IDOR 漏洞。
在Live chat
的View transcript
功能中,会下载一个2.txt
文件,而carlos
的密码存在1.txt
文件中。
基于 Referer 头的访问控制
一些网站根据 HTTP 请求中的Referer
头实施访问控制。例如:网站对主管理页面/admin
实施了严格的访问控制,但对子页面(如/admin/deleteUser
)仅检查Referer
头。如果Referer
头包含主管理页面的URL(如/admin
),则允许请求。