【juice-shop】★★★ Manipulate Basket:向他人购物车添加商品

通过 JSON 参数污染(重复 BasketId 字段),绕过购物车所有权验证,向其他用户的购物车添加商品。

【juice-shop】★★★ Manipulate Basket:向他人购物车添加商品

0x01 任务简报

💡 提示 (Hints)
1. 在将商品放入购物车时,请留意 HTTP 流量。
2. 向他人购物车添加更多相同商品的行为不构成解决方案。同样地,从他人购物车中窃取商品也不行。
3. 这项挑战需要比同类挑战更复杂的篡改手段。

0x02 实战:复现漏洞

📝 第一步:注册两个测试账户

1
2
3
4
5
账户 1:
1@1.com / 11111

账户 2:
2@2.com / 22222

🔍 第二步:抓取购物车请求

打开 Burp Suite,分别用两个账户各添加一次商品到购物车,捕获请求包。

账户 1 请求

账户 2 请求

📊 第三步:分析请求体

观察请求体内容,包含以下关键字段:

  • ProductId — 商品 ID
  • BasketId — 购物车 ID
  • quantity — 数量

当前状态:

  • 用户 1 的 BasketId:6
  • 用户 2 的 BasketId:7

请求体分析

💉 第四步:利用 JSON 参数污染

使用用户 2 的身份,将请求发送到 Repeater。直接修改 BasketId 为用户 1 的购物车 ID(6)会返回 401 错误。

关键技巧: 使用 JSON 参数污染,在请求体中重复添加 BasketId 字段

1
2
3
4
5
6
{
    "ProductId": 1,
    "BasketId": 7,
    "BasketId": 6,
    "quantity": 1
}

当 JSON 解析器遇到重复的键时,通常会使用最后一个值6),从而绕过购物车所有权验证。

参数污染请求

发送请求,成功向用户 1 的购物车添加商品。

✅ 第五步:完成挑战

成功向他人购物车添加商品,挑战完成。


总结

这个挑战的核心在于 JSON 参数污染

技巧 说明
重复参数 在 JSON 中重复定义同一个键
解析器行为 不同的 JSON 解析器处理重复键的方式不同
绕过验证 后端验证使用第一个值,但处理时使用最后一个值
第一时间没想起来有这个操作,看来还是经验太少了……

继续某位可爱大佬的教诲培养直觉(


参考

使用 Hugo 构建
主题 StackJimmy 设计