逻辑漏洞挖掘之支付漏洞(刷钱、0元购)分析
支付漏洞简介
支付漏洞是 高风险漏洞 也属于 逻辑漏洞,通常是通过 篡改价格、数量、状态、接口、用户名等传参,从而造成 小钱够买大物 甚至可能造成 0元购买商品 等等,凡是 涉及购买、资金等方面的功能处 就有可能存在支付漏洞。文中如有错误的地方,还望各位大佬在评论区指正。
快捷支付原理
商户网站接入支付结果,有两种方式,一种是通过 浏览器进行跳转通知,一种是 服务器端异步通知。
浏览器跳转通知
基于用户访问的浏览器,如果用户在银行页面支付成功后,直接关闭了页面,并未等待银行跳转到支付结果页面,那么商户网站就收不到支付结果的通知,导致支付结果难以处理。而且浏览器端数据很容易被篡改而降低安全性(这种方式数据经过了客户端浏览器,极大的可能性被第三方恶意修改)
服务器端异步通知
该方式是支付公司服务器后台直接向用户指定的异步通知URl发送参数,采用POST或者GET的方式。商户网站接受异部参数的URL对应的程序中,要对支付公司返回的支付结果进行签名验证,成功后进行支付逻辑处理,如验证金额、订单信息是否与发起支付时一致,验证正常则对订单进行状态处理或为用户进行网站内入账等。
常见的支付漏洞
提前购买
攻击者发现预售商品,如:
http://www.domain.com/mall/item/401
找到可以购买的商品,如:
http://www.domain.com/mall/item/184
通过将goods_id改为401 然后提交
注:有些提前购买校验本地时间,可以通过修改本地终端时间来实现提前购买
修改订单金额
支付三步曲——>订购、订单、付款
三个步骤当中的随便一个步骤进行修改价格测试,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验,那么问题就会存在,其修改的金额值可以尝试小数目
或者尝试负数
。
1 | 实例: |
修改支付模板
没有对支付模板的值跟实际订单支付状态进行校验,导致点击支付时抓包修改决定支付或未支付的参数为支付模板的值从而达到支付成功,有时候将商品价格修改为0.01
、0.1
、1
元时,都会显示支付失败,这时通过选择低价商品价格来实现低价购买,也可以通过遍历选择处最低价格。
实例:
1 | http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2015-0102292 |
修改商品数量
商品没有对购买的数量参数进行限制,导致可随意修改,最常见的修改方式是改成 负数或者小数、大人修改成儿童。
案例1
分别选了一个26元和一个27元的U盘。
然后我吧26这个U盘数量改成了 “-1” 结果商品总金额变成了1元。如图
接下我选择了,在线支付,通过支付宝付款1元,然后奇迹就出现了。
案例2
跟团游模块,预定一个成人一个儿童票,可以看到一个成人票价是980
修改数据包,把成人票类型改成儿童票
然后就会发现支付金额380
1 | 相关实例: |
无限制试用
通过修改 特殊传参(如:id,pay,test) 来达到无限制试用。
案例:
1 | http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2016-0188155 |
修改附属值
- 修改优惠劵金额/数量
- 修改积分金额
- 修改运费金额
- 修改赠送的数量/积分
越权支付
通过修改一些 特殊传参(如:id,username,openid) 来达到用他人的资金来干购买自己的商品。
实例: