支付漏洞
0x00 前言
支付漏洞属于逻辑漏洞的一种,存在支付漏洞会造成较大危害,一般存在于在线商城类、旅游门票、车票类、积分兑换类等涉及支付相关的站点
网站支付两种方式:
1、浏览器跳转(古老、危险)
待用户在支付成功后从支付页面跳转回来,以此作为判断。不安全、数据容易被篡改。
2、服务器端异步通知(常见)
通过后台特定渠道与支付公司进行数据验证,采用POST或GET的方式,验证订单支付的金额、签名、返回信息与生成的订单是否一致等。
0x01 测试方法
1、改金额
一般的支付流程包括 选购商品、订单生成、提交付款 三个部分
可以尝试修改任意一个部分的金额信息,如果验证不当,就会存在价格被篡改的情况。
2、改支付状态
可以修改订单中的其他信息,如在对商品进行付款时时,修改一个已经支付的订单值,服务器就会返回订单已支付成功的状态,达到绕过支付。
可以利用这个方法尝试 支付绕过、小金额买大金额商品等
3、改支付账户
发现商品传参中包含账户id或其他信息时,尝试修改这些信息,扣其他账户的钱购买商品
4、改商品数量
传参中包含商品数量时,尝试修改为0或负数。或者尝试一次购买多个商品,将金额大的那件商品数量改为负数,抵消掉其他金额小的商品的价格。
5、改优惠券数量
传参中包含优惠券的相关信息时尝试修改,如修改优惠券的数量、价格,抵消掉商品原有价格
6、除了PC端,尝试移动端网页、app、小程序等。
0x02 实战复现
以某在线家电商城为例
提交订单时,只对商品金额、数量参数做了简单计算验证,并且参数可控,导致支付漏洞
1、登录后,在主页面挑选一个商品
以这款价格49的打印机为例
2、点击进入商品页面并加入购物车
提示添加进货单成功
3、点击购物车,查看进货单
4、选中商品,点击去结算
5、新增一个收货地址
6、开启抓包,在下方点击提交订单
7、两个关键参数 num和totalFee,分别表示商品数量和总金额
8、修改num的值为-1
提示参数错误,计算到的订单总价为-4800,而指定总价为5000
而这两个参数的值是可以控制的,所以根据提示,构造两个参数相等且为负数,并且选择支付方式为钱包支付
9、构造参数并支付
修改num=-1、totalFee=-4800
10、放包
在个人中心查看订单
0x03 防御措施
1、后端检验每一项值,包括支付状态、价格、签名等信息
2、控制好账户权限,避免越权支付
3、与第三方支付平台核对
4、支付参数进行加密
5、金额超过阈值进行人工审核