新思路解锁🔓
这篇漏洞报告是我最喜欢的漏洞发现之一,因为这是一个非常出乎意料的问题导致的鉴权绕过。
当时我正在测试一个电商网站。它有 2 个资产 (网站均使用化名) target.com
、admin.target.com
target.com
是面向用户的门户站点,用户可以在这里购买物品。 admin.target.com
是卖家的管理门户站点,卖家可以在这里管理他们的物品,跟踪订单、客户信息等。
我正在测试越权漏洞,通过在 burp 中使用 Autorize 插件进行测试。
如果权限较低的用户能够访问卖家管理站点接口,Autorize 将把它标记为“已绕过”。
我将target.com
的普通用户 cookie 放入 Autorize,用它来检查普通用户是否可以访问管理端点admin.target.com
。
但在我的测试期间发生了一些奇怪的事情。
每次我访问 https://admin.target.com/orders
,会发出以下 GraphQL 请求。
POST /graphql
主机:admin.target.com
{“operationName”:“GetOrders”,“variables”:“shop_id”:“X”},“query”:“query X”}
这个请求的响应包含我店铺的所有订单信息,这是符合预期的行为。
Autorize 将端点标记为“绕过”,这代表普通用户也能够通过这个请求来访问道我的商店的订单信息。
于是我马上用将请求发送到burp的repeater中来重发请求,我再次测试使用普通用户 cookie 发出请求,但是 403 了?
WTF! 嗯🤔
Autorize 显示可以绕过,但是我测试的时候响应的是403禁止,好吧,可能是插件的bug吧!
然后在我接下来测试这个网站的程好几天里,这个"BUG"一直在发生。Autorize 一直显示GetOrders
端点为“已绕过”,但是当我将请求发送到repeater并测试时,响应的就是403 forbidden
。
此时此刻,我觉得真的太奇怪了,我觉得可能不是 Autorize 的问题,也许我忽略了什么。我对比了一下Autorize 和 Repeater 发出的请求,他们之间的唯一区别是请求时间。
虽然他们都有相同的 cookie/token, 但是实际测试中 Autorize 会立即请求卖家管理系统的接口,而我从repeater发出请求则是一段时间之后。
为了验证我的理论:
GetOrders
我使用管理员令牌向端点发出了请求。
POST /graphql
Host: admin.target.com
Auth:Bearer admin
{"operationName":"GetOrders","variables":{"shop_id":"X"},"query":"query X"}
然后立即使用用户令牌发出相同的请求。
POST /graphql
Host: admin.target.com
Auth:Bearer user
{"operationName":"GetOrders","variables":{"shop_id":"X"},"query":"query X"}
这一次我是真的能够用 ''普通用户的权限'' 获得商店的所有订单信息,包括客户详细信息❕❕
真相大白
所以情况是:服务器的GetOrders
接口在很短的时间 (3/4 秒内) 缓存了响应。
如果攻击者在卖家访问接口的同时发出请求,攻击者只需使用shop_id
就可以获取属于任何店铺的所有订单/客户信息,而且shop_id
一个可公开访问获取到的 ID。
攻击者只需要GetOrders
创建一个简单的脚本,对不同的 shop_id
发出持续请求, 只要卖家访问了这个接口,订单/客户信息就会被缓存 3/4 秒的窗口,攻击者就可以绕过所有访问控制限制批量获取这些敏感信息。
原文始发于微信公众号(不懂安全):一个值钱的漏洞报告 之 由于缓存配置错误导致的鉴权绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论