我的第一个赏金漏洞 — 原型污染

admin 2024年10月24日14:47:03评论25 views字数 2762阅读9分12秒阅读模式

介绍

在这篇文章中,我将带您了解我是如何发现原型污染漏洞的,这导致我获得了 175 美元的奖励。让我们开始吧!

发现漏洞

我已经进行漏洞猎捕大约 2 年了,通常针对漏洞披露计划(VDP),因为它们相对容易被攻击,并且我可以从中学到更多东西。在过去的 6 到 7 个月里,我开始参加漏洞赏金计划,因为在从 VDP 工作中积累了一些自信。

这是一个在 Bugcrowd 上的公开程序,但我不能透露目标的名称,我将其称为 redacted.comredacted.com 是一个 Web3 区块链游戏平台,您可以通过玩游戏赚取加密货币(我无法透露其名称)。您可以使用这些加密货币购买名为 CRYSTALS 的游戏内货币。您可以使用水晶购买不同的角色、神秘盒子等。

经过数小时的点击,我发现了一个兑换码功能。

我的第一个赏金漏洞 — 原型污染img

所以我首先尝试输入随机代码,结果显示该代码不存在。它在响应中反映了我们输入的代码。

当我输入一个兑换码并提交时,我在 Burp Suite 中捕获到了以下请求:

我的第一个赏金漏洞 — 原型污染img

失败的兑换码请求使用了一个随机代码。

后端服务器使用 Node.js,这在程序描述中有所说明。

我喜欢处理 JSON 输入和输出区域,因为它们通常容易受到各种注入攻击。

接下来进行攻击…

原型污染

原型污染是一种漏洞,发生在 JavaScript 中,当攻击者能够操纵或修改内置对象的原型(如 ObjectArray 等)时。JavaScript 使用原型在对象之间共享属性和方法,通过改变原型,攻击者可能会将恶意属性注入到所有从该原型继承的对象中。

假设有一个 isAdmin 标志用于控制对管理功能的访问。如果对象的原型可以被污染,攻击者可能会注入一个 isAdmin: true 属性,从而使自己获得未授权的访问权限。

app.post('/auth', (req, res) => { let user = {}; Object.assign(user, req.body); // Merging user-controlled data without sanitization if (user.isAdmin) { return res.send('Welcome Admin!'); } else { return res.send('Invalid'); }});

这个后端代码显示了一个名为“auth”的易受攻击的端点,它接受 JSON 输入。如果我们输入任何 JSON 数据,它将被合并到用户对象中,而没有任何验证。因此,以下有效载荷将利用这一点:

{"__proto__": {"isAdmin": true}}

这个 JSON 输入将把用户对象的 isAdmin 原型更改为 true,从而允许未经授权的访问。

这是对原型污染的简单介绍,现在让我们进入目标场景。

利用过程

在这里,当我们输入一个代码并提交时,它会以 JSON 格式发送到服务器,例如:

{"code":"testcode123"}

在后端,检查可能看起来像这样(仅仅是我的假设):

app.post('/redeem', (req, res) => { let redemptionRequest = {}; Object.assign(redemptionRequest, req.body); // Merging request body into redemptionRequest object let redeemableItem = database.find(item => item.code === redemptionRequest.code); if (redeemableItem) { if (!redeemableItem.redeemed) { // Mark the item as redeemed redeemableItem.redeemed = true; userAccount.addItem(redeemableItem.item, redeemableItem.item_count); // Respond with success return res.json({ id: redeemableItem.id, created_at: redeemableItem.created_at, updated_at: new Date().toISOString(), code: redeemableItem.code, item: redeemableItem.item, item_count: redeemableItem.item_count }); } else { return res.status(400).send('Code already redeemed'); } } else { return res.status(400).send('Invalid code'); }});

原型污染可能导致后端错误地匹配可兑换的代码或跳过某些验证逻辑。

当我发送有效负载 {"code":{"__proto__":{"foo":"bar"}}} 时,redemptionRequest 中的 code 字段可能会由于被污染的原型导致意外行为。服务器可能会绕过某些检查,因为被污染的原型链可能会干扰比较过程中的 redemptionRequest.code(即 item.code === redemptionRequest.code),从而导致兑换一个原本不应针对该特定代码的有效项目。

这只是我对后端逻辑的假设,我仍然不确定这将如何发生。
现在,当我发送该请求时,收到了以下有效响应:
我的第一个赏金漏洞 — 原型污染

img
成功使用原型污染兑换了一个代码。
这使我的钱包中增加了1500个CRYSTALS,而实际上并没有兑换有效的代码。
我的第一个赏金漏洞 — 原型污染

img
这个攻击只能在每个账户上执行一次,因为如果我们尝试再次注入,它会显示“代码 [Object object]”已被兑换。
所以我创建了另一个账户来学习我可以利用这个漏洞领取哪些奖励,结果发现我能够获得一个付费游戏的免费通行证。
我的第一个赏金漏洞 — 原型污染

img

报告

我迅速在 Bugcrowd 上报告了这个漏洞,并被评估为 P4 漏洞,因为攻击者无法控制可以兑换的奖励。
报告日期:2024年9月13日
审核日期:2024年9月24日
奖金发放日期:2024年9月24日
我的第一个赏金漏洞 — 原型污染

img

结论

我其实在接触这个目标时感到非常害怕,因为这是一个 Bugcrowd 上的公开项目,并且是一个基于 Web3 的目标。但我没有放弃自己的直觉,继续进行了攻击。
以上内容由白帽子左一翻译并整理。原文:https://1-day.medium.com/175-prototype-pollution-vulnerability-my-first-bounty-197738a32330

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。

原文始发于微信公众号(白帽子左一):赏金猎人 | 我的第一个赏金漏洞 — 原型污染

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月24日14:47:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   我的第一个赏金漏洞 — 原型污染https://cn-sec.com/archives/3309519.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息