这篇文章是关于我最喜欢的发现之一,因为这是一个非常出乎意料的问题。
我正在测试一个电子商务网站。
它有 2 个资产。
和target.com
admin.target.com
target.com
是面向用户的门户,用户可以在其中购买物品。
基本上是卖家的管理门户,他们可以在其中列出他们的商品、跟踪订单、客户信息等。admin.target.com
我正在测试 idor 和访问控制。我通常使用 Autorize 来做这件事。
如果较低权限的用户能够点击管理端点,Autorize 会将其标记为 “bypassed” 。
将普通用户 cookie 放入 Autorize 后,我正在使用 来检查普通用户是否可以访问管理端点。target.com
admin.target.com
在我测试期间发生了一些不寻常的事情。
每次访问终端节点时:
https://admin.target.com/orders
,则正在发出 GraphQL 请求。
POST /graphql Host: admin.target.com {"operationName":"GetOrders","variables":{"shop_id":"X"},"query":"query X"}
响应包含我商店的所有订单信息。
这是预期行为。
然而,奇怪的是,Autorize 将端点标记为“已绕过”,这意味着即使是普通用户也能够发出此请求并访问我商店的订单信息。
但是当我将该请求发送到 repeater 并尝试使用用户 cookie 发出请求时,它给出了一个错误。
嗯🤔
autorize 表示 bypassed ,repeater 表示 forbidden。
我以为这是 autorize 内部的一个小故障,然后继续前进。
在我测试程序的整个星期里,它一直在发生。
Autorize 一直将端点显示为“已绕过”,但是当我过去将请求发送到 repeater 和 test 时,它给了我错误。GetOrders
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"}
然后立即使用 User Token 发出相同的请求。
POST /graphql Host: admin.target.com Auth: Bearer user {"operationName":"GetOrders","variables":{"shop_id":"X"},"query":"query X"}
令我惊讶的是,我能够获得该商店的所有订单信息,包括客户详细信息。
问题
所以发生的事情是:
服务器将响应缓存了 3/4 秒的非常短暂的时间。GetOrders
因此,如果攻击者在普通商店管理员使用其管理员门户的同时发出请求,则攻击者能够仅使用 获取属于任何商店的所有订单/客户信息。shop_id
这是一个可公开访问的 ID。shop_id
利用
创建一个简单的 bash 脚本,该脚本将全天向终端节点发出持续请求GetOrders
每当管理员访问他们的门户时,订单/客户信息会被缓存 3/4 秒,允许攻击者获取它们并绕过所有访问控制限制。
概念验证
我使用用户令牌向 endpoint 运行入侵者请求。GetOrders
它最初给出的回应是由于访问控制到位。403 forbidden
同时,我以 adminUser 身份登录并正常访问admin.target.com
admin.target.com/orders
graphql 请求是代表 admin 在后台发出的,可以缓存 3/4 秒。GetOrders
缓存的响应最终由一分钟前给出 403 错误的同一 intruder 选项卡获取。
该问题被分类为严重问题,并在数小时内立即得到解决。
- 始发于微信公众号(安全狗的自我修养):由于缓存配置错误而绕过授权
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论