本文分享的Writeup是某流行电子商务购物网站的一个参数篡改漏洞(Parameter Tampering),作者利用该漏洞可以更改购物车中商品数量为负数,通过最终的正负支付金额平衡,实现以最低价格甚至是免费方式购物。以下是相关分享。
漏洞原因
近期,我收到了一份针对某流行电子商务购物网站的测试邀请,正好,我平时也经常在这个网站上购物,所以我欣然接受了这次邀请。由于网站方希望能发现一些影响业务方面的漏洞,所以我首先想到的就是测试参数篡改漏洞(Parameter Tampering)。
参数篡改(Parameter Tampering):此类攻击是基于对客户端和服务器之间交换参数的操纵控制,它通过修改Web应用交互中存储在cookies、提交请求、隐藏表单字段或URL查询字符串中涉及的数据参数,如用户凭证、权限、产品价格、数量等,来实现控制和更改Web应用功能。参数篡改攻击的目的是为了获取利益,或利用中间人攻击来深入攻击其他人。
在这里,参数篡改涉及的漏洞无疑就是价格操纵了,这是当今很多电子商务网站在线购物车和支付网关中存在的普遍漏洞。
出于保密原因,我们把目标电子商务网站称为redacted.com。该网站存在的主要问题在于,它们只对用户购物车中的某件商品数量做了最大上限:10件,但却忘记对其商品数量下限做出限制,因此,任何人可以把购物车中的某件商品数量减少至负数,从而在购物车中添加负数的商品数量和支付金额。
漏洞影响
由于目标电子商务网站存在业务逻辑错误,因此我可以篡改购物车中的某些商品数量至负数,则当支付商品时,不同正负数量的商品件数产生的不同正负价值的支付金额相抵,导致我能以非常低的价格,或甚至是免费来购买某些商品。
漏洞复现
访问目标购物网站redacted.com,任意打开一件商品,把它添加进购物车。比如,我在其中添加了一件单价为599 ₹ 的T恤衫,在该过程中,抓包分析,拦截其流量,然后把该件商品数量更改为-10。那该商品支付金额就是:
支付金额: -10 * 599 ₹ = -5990 ₹
注意,这件负数商品最后其实是用来相抵的,并不会出现在最终购买成功的单据中,请继续往下看。
要平衡上述购物车中的支付金额,我又从中添加了单价为399 ₹的7双鞋子,该商品支付金额为:
支付金额: 7*399 ₹ =2793 ₹
现在,购物车中商品的支付金额还需要一些正数价格,所以,我又向其中添加了单价为399 ₹的8条牛仔裤,其金额为:
支付金额: 8*399 ₹ = 3192 ₹
那么,这样一来,购物车中总的商品支付金额就成为了:
支付金额: -5990 ₹ +2793 ₹ + 3192 ₹ = -5 ₹
但是,最后它却会报错,原来是由于消费税(GST)等原因,购物车中的最低支付金额为350 ₹,所以还需要在结账这关上进一步构造。
接下来,我又向购物车中添加进了单价为599₹ 的T恤衫一件,所以支付金额594₹,加上消费税(GST)329₹,最终支付金额为:923 ₹。
我进一步选择了收货地址,找到了付款方式,并通过信用卡付款,成功支付了该订单。最后,我发现买到的商品为7双鞋子、8条牛仔裤和1件T恤衫。也就是说,这些商品本来的价格应该是:7*399 ₹ +8*399₹ +599₹ =6584 ₹,而我却用923₹就买到了!当然,你也可以对商品数量进行一些其它价格构造,实现低价或免费购物。漏洞上报后,目标网站方非常重视,及时进行了修复并给予了我大笔奖励。
经验总结
1、不要太相信浏览器端中的控件信息,不要太相信浏览器客户端的验证和存储数据;
2、把添加进购物车中的商品支付金额与提交到服务器后端的实际金额进行一个MD5哈希比较,如果两者存在不同,则可能存在参数篡改漏洞;
3、去验证一些超出正常范围的字符或数据类型,如输入负数数量等,越出Web应用的最大最小限制去做测试,去考虑问题。
*参考来源:medium,clouds编译整理,转载请注明来自FreeBuf.COM