在线支付

1、漏洞简介


随着网民越来越习惯于网上购物,出现了越来越多的电商网站,在线交易平台等。 其中必然涉及在线支付的流程,而这里面存在很多的逻辑问题。 由于这里涉及到金钱,如果设计不当,很有可能产生诸如0元购买商品之类的严重漏洞。

2、漏洞成因


支付过程中可直接修改数据包中的支付金额

这种漏洞是支付漏洞中最常见的。 开发人员为了方便,直接在支付的关键步骤数据包中直接传递需要支付的金额。 而这种金额后端没有做校验,传递过程中也没有做签名,导致可以随意篡改金额提交。

没有对购买数量进行限制

产生的原因是开发人员没有对购买的数量参数进行严格的限制。 这种同样是数量的参数没有做签名,导致可随意修改,经典的修改方式就是改成负数。 当购买的数量是一个负数时,总额的算法仍然是“购买数量x单价=总价”。 所以这样就会导致有一个负数的需支付金额。 若支付成功,则可能导致购买到了一个负数数量的产品,并有可能返还相应的积分/金币到你的账户上。

也有将数量改成一个超大的数。结果可能导致商品数量或者支付的金额超过一定数值而归0。

请求重放

未对订单唯一性进行验证,导致购买商品成功后,重放其中请求,可以使购买商品一直增加。

其他参数干扰

由于对商品价格,数量等以外的其它会影响最终金额参数(如:运费)缺乏验证导致最终金额可被控制。

3、漏洞检测及利用


检测方法

无通用的检测方法

利用

突破限制超量购买限量商品。

低价、免费购买付费商品。部分漏洞甚至可在购买商品过程中获得金钱、积分等利益。

4、实际案例

5、漏洞修复


对传递的金钱,数量等对最后支付金额会产生影响的所有参数做签名。并且注意签名算法不可被猜测到。使被修改过的数据无法通过验证。

对重要的参数进行校检和有效性验证。

注意验证订单的唯一性,防止重放攻击。

6、相关资源