在线支付
1、漏洞简介
随着网民越来越习惯于网上购物,出现了越来越多的电商网站,在线交易平台等。 其中必然涉及在线支付的流程,而这里面存在很多的逻辑问题。 由于这里涉及到金钱,如果设计不当,很有可能产生诸如0元购买商品之类的严重漏洞。
2、漏洞成因
支付过程中可直接修改数据包中的支付金额
这种漏洞是支付漏洞中最常见的。 开发人员为了方便,直接在支付的关键步骤数据包中直接传递需要支付的金额。 而这种金额后端没有做校验,传递过程中也没有做签名,导致可以随意篡改金额提交。
没有对购买数量进行限制
产生的原因是开发人员没有对购买的数量参数进行严格的限制。 这种同样是数量的参数没有做签名,导致可随意修改,经典的修改方式就是改成负数。 当购买的数量是一个负数时,总额的算法仍然是“购买数量x单价=总价”。 所以这样就会导致有一个负数的需支付金额。 若支付成功,则可能导致购买到了一个负数数量的产品,并有可能返还相应的积分/金币到你的账户上。
也有将数量改成一个超大的数。结果可能导致商品数量或者支付的金额超过一定数值而归0。
请求重放
未对订单唯一性进行验证,导致购买商品成功后,重放其中请求,可以使购买商品一直增加。
其他参数干扰
由于对商品价格,数量等以外的其它会影响最终金额参数(如:运费)缺乏验证导致最终金额可被控制。
3、漏洞检测及利用
检测方法
无通用的检测方法
利用
突破限制超量购买限量商品。
低价、免费购买付费商品。部分漏洞甚至可在购买商品过程中获得金钱、积分等利益。
4、实际案例
支付过程中可直接修改数据包中的支付金额
没有对购买数量进行限制
请求重放
私密泄漏
其他参数干扰
5、漏洞修复
对传递的金钱,数量等对最后支付金额会产生影响的所有参数做签名。并且注意签名算法不可被猜测到。使被修改过的数据无法通过验证。
对重要的参数进行校检和有效性验证。
注意验证订单的唯一性,防止重放攻击。