什么是访问控制?
访问控制是对有权执行操作或访问资源的人员或内容施加约束。在 Web 应用程序的上下文中,访问控制依赖于身份验证和会话管理:
- 身份验证确认用户是他们所说的人。
- 会话管理可识别同一用户正在发出哪些后续 HTTP 请求。
- 访问控制确定是否允许用户执行他们尝试执行的操作。
访问控制被破坏很常见,并且通常存在严重的安全漏洞。访问控制的设计和管理是一个复杂而动态的问题,它将业务、组织和法律约束应用于技术实现。访问控制设计决策必须由人工做出,因此出错的可能性很高。
!
垂直权限提升
如果用户可以访问不允许他们访问的功能,则这是垂直权限提升。例如,如果非管理用户可以访问管理页面,他们可以在其中删除用户帐户,则这是垂直权限提升。
未受保护的功能
最基本的是,当应用程序不对敏感功能强制实施任何保护时,就会出现垂直权限提升。例如,管理功能可能从管理员的欢迎页面链接,但不能从用户的欢迎页面链接。但是,用户可以通过浏览到相关的管理 URL 来访问管理功能。
例如,网站可能在以下 URL 上托管敏感功能:
https://insecure-website.com/admin
任何用户都可以访问它,而不仅仅是在其用户界面中具有功能链接的管理用户。在某些情况下,管理 URL 可能会在其他位置公开,例如文件: robots.txt
https://insecure-website.com/robots.txt
即使 URL 未在任何地方公开,攻击者也可能能够使用单词列表来暴力破解敏感功能的位置。
在某些情况下,通过为其提供不太可预测的 URL 来隐藏敏感功能。这就是所谓的“隐蔽安全”的一个例子。但是,隐藏敏感功能并不能提供有效的访问控制,因为用户可能会以多种方式发现混淆的 URL。
假设一个应用程序在以下 URL 上托管管理功能:
https://insecure-website.com/administrator-panel-yb556
攻击者可能无法直接猜到这一点。但是,应用程序可能仍会将 URL 泄露给用户。URL 可能会在 JavaScript 中披露,该 JavaScript 根据用户的角色构建用户界面:
<script>
var isAdmin = false;
if (isAdmin) {
...
var adminPanelTag = document.createElement('a');
adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
adminPanelTag.innerText = 'Admin panel';
...
}
</script>
如果用户是管理员用户,则此脚本会添加指向用户 UI 的链接。但是,包含 URL 的脚本对所有用户都是可见的,无论其角色如何。
基于参数的访问控制方法
某些应用程序在登录时确定用户的访问权限或角色,然后将此信息存储在用户可控制的位置。这可能是:
- 一个隐藏的字段。
- Cookie。
- 预设查询字符串参数。
应用程序根据提交的值做出访问控制决策。例如:
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
这种方法是不安全的,因为用户可以修改他们无权访问的值和访问功能,例如管理功能。
水平权限提升
如果用户能够访问属于其他用户的资源,而不是他们自己的该类型的资源,则会发生水平权限提升。例如,如果员工可以访问其他员工以及他们自己的记录,则这是横向权限提升。
水平权限提升攻击可能使用与垂直权限提升类似的攻击方法。例如,用户可以使用以下 URL 访问自己的帐户页面:
https://insecure-website.com/myaccount?id=123
如果攻击者将参数值修改为其他用户的参数值,则可能会访问其他用户的帐户页面以及相关的数据和功能。id
注意
这是不安全的直接对象引用 (IDOR) 漏洞的一个示例。当用户控制器参数值用于直接访问资源或功能时,就会出现此类漏洞。
在某些应用程序中,可利用的参数没有可预测的值。例如,应用程序可能使用全局唯一标识符 (GUID) 来标识用户,而不是递增数字。这可以防止攻击者猜测或预测其他用户的标识符。但是,属于其他用户的 GUID 可能会在引用用户的应用程序中的其他位置(例如用户消息或评论)中公开。
水平到垂直权限提升
通常,通过损害特权更高的用户,可以将水平权限提升攻击转变为垂直权限提升。例如,水平升级可能允许攻击者重置或捕获属于其他用户的密码。如果攻击者以管理用户为目标并破坏其帐户,则他们可以获得管理访问权限,从而执行垂直权限提升。
攻击者或许能够使用已针对水平权限提升描述的参数篡改技术访问其他用户的帐户页面:
https://insecure-website.com/myaccount?id=456
如果目标用户是应用程序管理员,则攻击者将获得对管理帐户页面的访问权限。此页面可能会泄露管理员的密码或提供更改密码的方法,或者可能提供对特权功能的直接访问。


