防止对网络上受限资源的欺诈性访问?

信息安全 Web应用程序 网络服务 授权
2021-08-17 22:28:58

我正在开发一个 Web 应用程序和一个 Web API,我已经被警告过一个看似基本的漏洞:不检查执行操作的用户是否对正在访问的资源具有足够的权限。我找不到资源或任何最佳实践。

这是一个场景:
访问银行帐户详细信息的 URI 是domain.com/details/1234,其中 1234 是用户 ID。恶意用户可以看到 URI 模式并尝试访问domain.com/details/1230. 如果什么都不做,因为他已经登录,他会看到另一个用户的详细信息。

首先,这种漏洞和相关攻击有名称吗?其次,防止这种情况的最佳做法是什么?在看起来相当简单的网络上,我们可以简单地检查会话/ID cookie 以与所请求资源的所有者进行比较。但该 API 将由无法使用 cookie 的移动应用程序使用。什么是保护 API 的好方法?

2个回答

您确定移动应用程序没有任何可用的 cookie,通常是这种情况。这也称为水平特权升级如果您只能查看其他用户的详细信息,我还会添加用户枚举。

如果您想检查这些请求是如何执行的,您可以在手机和互联网之间放置一个代理(如 ZAP 或 Burp),以查看它实际传递给服务器的内容。

最好的做法是永远不要将会话 ID 放在 GET 请求中。我们有 cookie 和移动应用程序支持 cookie 是有原因的,就像任何其他应用程序一样。我见过的大多数移动银行应用程序都使用带有 JSON 的 REST API,它不一定使用 cookie(但可以,尽管它不是完全无状态的)。查询通常使用一种私钥或令牌进行签名。

为避免该漏洞,必须以某种方式每个请求进行身份验证并验证身份验证这相当于提供会话 cookie,无论您是在 GET URL 中执行,例如

domain.com/details/1234

1234您的用户(以及他的会话)在哪里,或者在 POST 或 JSON 请求中。

在上面,您有身份验证,但没有经过验证。任何人都可以声称自己是用户 1234。

您可以添加一个单独的 cookie,它仍然会公开用户 ID:

domain.com/details/1234:db81390fb2befd1dd839c37ab39d699cddb8d65b

或者你把所有东西都打包在 cookie 中:

domain.com/db81390fb2befd1dd839c37ab39d699cddb8d65b/details

上面的优点是您可以在检查请求后在内部重写请求

domain.com/details/1234

这样安全层“后面”的应用程序就可以保持不变。

安全层将提取 cookie,验证它是否有效(它可以包含自己的加密签名和随机数,以避免重放攻击),并从与 cookie 相关的会话中恢复用户 ID 1234 并将其传递。

第一次进行身份验证时,会生成一个新会话并将其关联到 cookie。如果您使用“足够大”的 cookie,则可以对其添加随机化:

1. The mobile app requests the user details:

domain.com/db81390fb2befd1dd839c37ab39d699cddb8d65b/details

2. The server destroys cookie db813... and replies with JSON:

{
    'cookie': '926c8a7699c367d3da9370f433189a20b06f8f3d',
    ...other details...
}

3. The next request will have to contain cookie 926c8... to be accepted.

在上述场景中,您可以通过向应用程序添加状态感知来进一步加强安全性。例如,当您收到上述 JSON 时,移动应用程序处于“显示详细信息”状态,并且在该状态下,只允许非常有限的转换次数。例如,您可能无法从那里一步转换到“更改用户密码”屏幕。

这意味着如果攻击者能够拦截 JSON 请求,并尝试使用它来访问更改密码功能:

domain.com/926c8a7699c367d3da9370f433189a20b06f8f3d/newpassword

它可以被认定为非法过渡。newpassword方法将“看到”先前的状态不是“用户配置文件”或“安全菜单”而是“显示详细信息”,这不是密切相关的,然后可以中止连接。

然后,攻击者必须首先从 Details 转换到 Main Menu,然后从那里转换到 User Profile,从而重新生成 cookie 一次或两次,从而切断合法用户合法用户应用程序不知道其状态现在不同步,并且可能会尝试使用其拥有的 cookie。这种cookie 重用可以被检测到,并作为 cookie 被故意截取的证据。您将无法可靠地判断谁是攻击者和谁是受害者,但您可以中止这两个连接。