测试权限提升
ID |
---|
WSTG-ATHZ-03 |
总结
本节介绍将权限从一个阶段升级到另一个阶段的问题。在此阶段,测试人员应验证用户无法以允许权限提升攻击的方式在应用程序内修改其权限或角色。
当用户访问的资源或功能超过通常允许的资源或功能时,就会发生权限提升,并且应用程序应该已经阻止了这种提升或更改。这通常是由应用程序中的缺陷引起的。结果是,应用程序执行操作的权限比开发人员或系统管理员预期的权限要多。
升级的程度取决于攻击者被授权拥有哪些权限,以及成功利用漏洞时可以获得哪些权限。例如,允许用户在成功验证后获得额外权限的编程错误会限制升级的程度,因为用户已经被授权拥有某些权限。同样,远程攻击者在没有任何身份验证的情况下获得超级用户权限,则升级程度更高。
通常,当可以访问授予更高权限账户的资源(例如,获取应用程序的管理权限)时,人们会提到垂直升级,当可以访问授予类似配置账户的资源时(例如,在网上银行应用程序中,访问与其他用户相关的信息)时,人们会提到水平升级。
测试目标
- 识别与权限操作相关的注入点。
- Fuzz 或其他尝试绕过安全措施。
如何测试
测试角色/权限操作
在用户可以在数据库中创建信息(例如,付款、添加联系人或发送消息)、可以接收信息(账户对账单、订单详细信息等)或删除信息(删除用户、消息等)的应用程序的每个部分中,都需要记录该功能。测试人员应该尝试以另一个用户的身份访问这些函数,以验证是否可以访问一个不应该被用户的角色/权限允许的函数(但可以作为另一个用户允许)。
操纵用户组
例如:
以下 HTTP POST 允许属于 grp001
的用户访问订单 #0001:
POST /user/viewOrder.jsp HTTP/1.1
Host: www.example.com
...
groupID=grp001&orderID=0001
验证不属于 grp001
的用户是否可以修改 groupID
、 orderID
参数的值并获取对该特权数据的访问权限。
用户配置文件的操纵
例如:
以下服务器的答案在身份验证成功后返回给用户的 HTML 中显示一个隐藏字段。
HTTP/1.1 200 OK
Server: Netscape-Enterprise/6.0
Date: Wed, 1 Apr 2006 13:51:20 GMT
Set-Cookie: USER=aW78ryrGrTWs4MnOd32Fs51yDqp; path=/; domain=www.example.com
Set-Cookie: SESSION=k+KmKeHXTgDi1J5fT7Zz; path=/; domain= www.example.com
Cache-Control: no-cache
Pragma: No-cache
Content-length: 247
Content-Type: text/html
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Connection: close
<form name="autoriz" method="POST" action = "visual.jsp">
<input type="hidden" name="profile" value="SysAdmin">\
<body onload="document.forms.autoriz.submit()">
</td>
</tr>
如果测试者将 profile
变量的值修改为 SysAdmin
?可以成为管理员吗?
条件值的操纵
例如:
在服务器发送错误消息(作为一组答案代码的特定参数中的值)的环境中,如下所示:
@0`1`3`3``0`UC`1`Status`OK`SEC`5`1`0`ResultSet`0`PVValid`-1`0`0` Notifications`0`0`3`Command Manager`0`0`0` StateToolsBar`0`0`0`
StateExecToolBar`0`0`0`FlagsToolBar`0
服务器向用户提供隐式信任。它认为用户将使用上述消息回答,关闭会话。
在这种情况下,请验证是否无法通过修改参数值来提升权限。在此特定示例中,通过修改PVValid
值从 -1
到 0
(无错误条件),可以以 administrator 身份向服务器进行身份验证。
操纵 IP 地址
一些网站会根据 IP 地址限制访问或计算登录尝试失败的次数。
例如:
X-Forwarded-For: 8.1.1.1
在这种情况下,如果网站使用 X-forwarded-For
的值作为客户端 IP 地址,测试人员可能会更改 HTTP X-forwarded-For
标头的 IP 值以解决 IP 源标识问题。
测试 Vertical Bypassing 授权架构
垂直授权绕过特定于攻击者获得比他们自己的角色更高的角色的情况。此旁路的测试侧重于验证如何为每个角色实施垂直授权架构。对于应用程序执行的每个功能、页面、特定角色或请求,有必要验证是否可以:
- 访问应仅由更高角色用户访问的资源。
- 对应仅由拥有更高或特定角色身份的用户操作的资源操作函数。
对于每个角色:
- 注册用户。
- 根据两个不同的角色建立和维护两个不同的会话。
- 对于每个请求,将会话标识符从原始标识符更改为另一个角色的会话标识符,并评估每个请求的响应。
- 如果权限较弱的会话包含相同的数据,或者指示对更高权限的函数执行了成功的操作,则应用程序将被视为易受攻击。
银行站点角色方案
下表说明了银行站点上的系统角色。每个角色都绑定了事件菜单功能的特定权限:
角色 | 许可权限 | 其他权限 |
---|---|---|
管理员 | 完全控制 | 删除 |
经理 | 修改、添加、读取 | 添加 |
员工 | 读取、修改 | 修改 |
客户 | 只读 |
如果满足以下条件,该应用程序将被视为易受攻击:
- 客户可以操作管理员、经理或员工职能;
- 员工用户可以操作经理或管理员功能;
- 经理 可以操作管理员功能。
假设deleteEvent
函数是应用程序的管理员帐户菜单的一部分,并且可以通过请求以下 URL 来访问它:https://www.example.com/account/deleteEvent
。然后,在调用deleteEvent
函数时,会生成如下 HTTP 请求:
POST /account/deleteEvent HTTP/1.1
Host: www.example.com
[other HTTP headers]
Cookie: SessionID=ADMINISTRATOR_USER_SESSION
EventID=1000001
有效响应:
HTTP/1.1 200 OK
[other HTTP headers]
{"message": "Event was deleted"}
攻击者可能会尝试执行相同的请求:
POST /account/deleteEvent HTTP/1.1
Host: www.example.com
[other HTTP headers]
Cookie: SessionID=CUSTOMER_USER_SESSION
EventID=1000002
如果攻击者请求的响应包含相同的数据{"message": "Event was deleted"}
,则应用程序容易受到攻击。
管理员页面访问
假设管理员菜单是管理员帐户的一部分。
如果管理员以外的任何角色可以访问管理员菜单,则应用程序将被视为易受攻击。有时,开发人员仅在 GUI 级别执行授权验证,而让函数没有授权验证,因此可能会导致漏洞。
URL 遍历
尝试遍历网站并检查是否有一些页面可能错过授权检查。
例如:
/../.././userInfo.html
白盒子
如果 URL 授权检查仅通过部分 URL 匹配完成,则测试人员或黑客可能会通过 URL 编码技术绕过授权。
例如:
startswith(), endswith(), contains(), indexOf()
弱 SessionID
弱会话 ID 算法可能容易受到暴力破解攻击。例如,一个网站用 MD5(Password + UserID)
作 sessionID。然后,测试人员可能会猜测或为其他用户生成 sessionID。