一个电子商务网站它有 2 个资产target.com
admin.target.com
target.com
是面向用户的门户,用户可以去那里购买物品。admin.target.com
基本上是卖家的管理门户,卖家可以在其中列出他们的物品,跟踪订单、客户信息等。
我通常使用 Autorize 进行测试,如果权限较低的用户能够访问管理端点,Autorize 将把它标记为“已绕过”。
通过将普通用户 cookietarget.com
放入 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 将端点标记为“绕过”,这意味着即使是普通用户也能够发出此请求并访问我的商店的订单信息。
但是,当我将该请求发送到中继器并尝试使用用户 cookie 发出请求时,出现了错误。
授权表示绕过,中继器表示禁止,我认为这是授权中的一个故障,因此继续进行。在我测试该程序的整个一周时间里,这种情况一直在发生。Autorize 一直显示GetOrders
端点为“已绕过”,但是当我将请求发送到中继器并测试时,它给了我错误403 forbidden
。此时,我确信这不是 Autorize 的问题,我只是忽略了一些东西。然后我明白了Autorize 和 Repeater 之间的唯一区别是时间间隔,虽然他们都有相同的 cookie/token。Autorize 立即呼叫管理端点。而我从中继器发出请求则需要一些时间。为了验证我的理论:GetOrders
我使用管理员令牌向端点发出了请求。
POST /graphql
主机:admin.target.com
身份验证:Bearer admin
{“operationName”:“GetOrders”,“variables”:“shop_id”:“X”},“query”:“query X”}
然后立即使用用户令牌发出相同的请求。
POST /graphql
主机:admin.target.com
身份验证:持有者用户
{ “operationName”:“GetOrders”,“variables”:{ “shop_id”:“X” },“query”:“query X” }
我能够获得该商店的所有订单信息,包括客户详细信息。因此,如果攻击者在普通商店管理员使用其管理门户时同时发出请求,攻击者只需使用即可获取属于任何商店的所有订单/客户信息shop_id
一个可公开访问的 ID。
创建一个简单的 bash 脚本,该脚本将GetOrders
全天向端点发出持续请求每当管理员访问他们的门户时,订单/客户信息就会被缓存 3/4 秒的窗口,从而允许攻击者获取这些信息并绕过所有访问控制限制。
同时我admin.target.com
以 adminUser 身份登录并正常访问admin.target.com/orders
代表管理员在后台发出了graphql 请求,GetOrders
该请求可缓存 3/4 秒。缓存的响应最终被一分钟前出现 403 错误的同一个入侵者获取。
更多网络安全优质免费学习资料与干货教程加
送渗透工具、技术文档、书籍,面试题、视频(基础到进阶。环境搭建,HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等)、应急响应笔记、学习路线。
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。