在本节中,我们将讨论什么是访问控制安全性,描述特权升级以及访问控制可能引起的漏洞类型,并概述如何防止这些漏洞。
访问控制(或授权)是对谁(或什么)可以执行尝试的操作或访问他们所请求的资源的约束条件的应用。 在web应用程序的上下文中,访问控制取决于身份验证和会话管理:
损坏的访问控制是一个经常遇到且通常很关键的安全漏洞。 访问控制的设计和管理是一个复杂而动态的问题,将业务、组织和法律约束应用于技术实施。 访问控制设计决策必须由人决定,而不是技术,而且潜在的错误可能性很高。
从用户的角度来看,访问控制可以分为以下几类:
垂直访问控制是一种机制,用于限制对其他类型的用户不可用的敏感功能的访问。
使用垂直访问控制,不同类型的用户可以访问不同的应用程序功能。 例如,管理员可能能够修改或删除任何用户的帐户,而普通用户无权访问这些操作。 垂直访问控制可以是安全模型的更细粒度的实现,这些模型旨在执行业务策略,例如职责分离和最低特权。
水平访问控制是一种机制,用于将资源的访问限制为专门允许访问这些资源的用户。
水平访问控制是一种机制,用于将资源的访问限制为专门允许访问这些资源的用户。
上下文相关的访问控制根据应用程序的状态或用户与应用程序的交互来限制对功能和资源的访问。
上下文相关的访问控制可防止用户以错误的顺序执行操作。 例如,零售网站可能会阻止用户在付款后修改购物车中的内容。
当用户实际上可以访问某些资源或执行某些他们不应该访问的资源时,存在中断的访问控制漏洞。
如果用户可以访问他们被禁止访问的功能,那么这就是垂直特权升级。 例如,如果非管理用户实际上可以访问可以删除用户帐户的管理页面,则这是垂直特权升级。
在最基本的情况下,如果应用程序不对敏感功能实施任何保护,则会出现垂直特权升级。 例如,管理功能可以从管理员的欢迎页面链接,而不是从用户的欢迎页面链接。 但是,用户可能直接通过直接浏览到相关的管理员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和HTTP方法的访问来在平台层实施访问控制。 例如,一个应用程序可能配置如下规则:
DENY: POST, /admin/deleteUser, managers
对于管理员组中的用户,此规则拒绝访问URL / admin / deleteUser上的POST方法。 在这种情况下,各种事情都会出错,从而导致访问控制绕过。
某些应用程序框架支持各种非标准HTTP标头,这些标头可用于覆盖原始请求中的URL,例如X-Original-URL和X-Rewrite-URL。 如果网站使用严格的前端控件来限制基于URL的访问,但是应用程序允许通过请求标头覆盖URL,则可以使用如下请求来绕过访问控制:
POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...
与请求中使用的HTTP方法有关的替代攻击可能会出现。 上面的前端控件基于URL和HTTP方法限制访问。 某些网站在执行操作时可以使用其他HTTP请求方法。 如果攻击者可以使用GET(或其他)方法对受限制的URL执行操作,则他们可以绕过在平台层实现的访问控制。
当用户能够访问属于另一个用户的资源而不是他们自己的那种类型的资源时,就会出现横向特权升级。 例如,如果一个员工只应该能够访问自己的工作和工资记录,但实际上也可以访问其他员工的记录,那么这就是横向特权升级。
横向特权升级攻击可能使用与垂直特权升级类似的利用方法。 例如,用户通常可以使用如下网址来访问自己的帐户页面:
https://insecure-website.com/myaccount?id=123
现在,如果攻击者将id参数值修改为另一个用户的ID参数值,则攻击者可能会访问具有相关数据和功能的另一个用户的帐户页面。
在某些应用程序中,可利用参数没有可预测的值。 例如,应用程序可以使用全局唯一标识符(GUID)来代替用户,而不是递增数字。 在这里,攻击者可能无法猜测或预测另一个用户的标识符。 但是,属于其他用户的GUID可能会在引用用户的应用程序的其他位置公开,例如用户消息或评论。
在某些情况下,应用程序会检测到何时不允许用户访问资源,并将重定向返回到登录页面。 但是,包含重定向的响应可能仍包含一些属于目标用户的敏感数据,因此攻击仍然成功。
通常,通过损害特权较高的用户,可以将横向特权升级攻击转变为纵向特权升级。 例如,横向升级可能允许攻击者重置或捕获属于另一个用户的密码。 如果攻击者以管理用户为目标并破坏了他们的帐户,则他们可以获取管理访问权限,从而执行垂直特权升级。
例如,攻击者也许可以使用针对横向特权升级已经描述的参数篡改技术来访问另一个用户的帐户页面:
https://insecure-website.com/myaccount?id=456
如果目标用户是应用程序管理员,则攻击者将有权访问管理帐户页面。 该页面可能会泄露管理员密码或提供更改密码的方法,或者可能提供对特权功能的直接访问。
不安全的直接对象引用(IDOR)是访问控制漏洞的子类别。 当应用程序使用用户提供的输入直接访问对象并且攻击者可以修改输入以获得未经授权的访问时,就会发生IDOR。 尽管它只是许多实现错误的一个例子,并且可能导致访问控制被规避,但它在OWASP 2007十佳中的出现使它得到了普及。
许多网站通过一系列步骤来实现重要功能。 当需要捕获各种输入或选项时,或者当用户需要在执行操作之前查看并确认详细信息时,通常会执行此操作。 例如,用于更新用户详细信息的管理功能可能涉及以下步骤:
有时,网站将对其中某些步骤实施严格的访问控制,而忽略其他步骤。 例如,假设访问控制已正确应用于第一步和第二步,但不适用于第三步。 实际上,该网站假定用户只有完成了正确控制的第一步后,才可以进入第3步。 在这里,攻击者可以跳过前两个步骤并直接使用所需参数提交对第三步的请求,从而获得未经授权的功能访问。
某些网站的访问控制基于HTTP请求中提交的Referer标头。 通常,浏览器会将Referer标头添加到请求中,以指示发起请求的页面。
例如,假设应用程序对/ admin上的主管理页面强加了强制性的访问控制,但是对于/ admin / deleteUser之类的子页面,用户仅检查Referer标头。 如果Referer标头包含主要的/ admin URL,则允许该请求。
在这种情况下,由于Referer标头可以被攻击者完全控制,因此他们可以伪造对敏感子页面的直接请求,提供所需的Referer标头,从而获得未经授权的访问。
一些网站根据用户的地理位置对资源实施访问控制。 例如,这可以适用于适用州法律或业务限制的银行应用程序或媒体服务。 通常可以通过使用Web代理,VPN或操纵客户端地理定位机制来规避这些访问控制。
通常,可以采用深度防御方法并应用以下原则来防止访问控制漏洞: