介绍
在这篇文章中,我将带您了解我是如何发现原型污染漏洞的,这导致我获得了 175 美元的奖励。让我们开始吧!
发现漏洞
我已经进行漏洞猎捕大约 2 年了,通常针对漏洞披露计划(VDP),因为它们相对容易被攻击,并且我可以从中学到更多东西。在过去的 6 到 7 个月里,我开始参加漏洞赏金计划,因为在从 VDP 工作中积累了一些自信。
这是一个在 Bugcrowd 上的公开程序,但我不能透露目标的名称,我将其称为 redacted.com。redacted.com 是一个 Web3 区块链游戏平台,您可以通过玩游戏赚取加密货币(我无法透露其名称)。您可以使用这些加密货币购买名为 CRYSTALS 的游戏内货币。您可以使用水晶购买不同的角色、神秘盒子等。
经过数小时的点击,我发现了一个兑换码功能。
所以我首先尝试输入随机代码,结果显示该代码不存在。它在响应中反映了我们输入的代码。
当我输入一个兑换码并提交时,我在 Burp Suite 中捕获到了以下请求:
失败的兑换码请求使用了一个随机代码。
后端服务器使用 Node.js,这在程序描述中有所说明。
我喜欢处理 JSON 输入和输出区域,因为它们通常容易受到各种注入攻击。
接下来进行攻击…
原型污染
原型污染是一种漏洞,发生在 JavaScript 中,当攻击者能够操纵或修改内置对象的原型(如 Object
、Array
等)时。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
),从而导致兑换一个原本不应针对该特定代码的有效项目。
报告
结论
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。
原文始发于微信公众号(白帽子左一):赏金猎人 | 我的第一个赏金漏洞 — 原型污染
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论