随着近些年国内互联网行业与移动通信行业的飞速发展,衍生出了众多让人眼前一亮的新型时代产物,它们的出现也无时无刻地不在改变着我们的生活。例如:逢年过节,再也不用去火车站、汽车站排着长队抢回家的车票了,各式各样的应用程序都具备了网上订票功能;上班下班,也不一定非要坐公交挤地铁了,随处可见的共享单车只需要一个扫码;购物消费,也不用再为了买一个东西顶着烈日走街串巷,只需要在手机上点几下就搞定了。许多企业为了跟上时代的步伐,迎合消费者的习惯,都开始大力发展线上业务。当然随着各个行业竞争态势愈演愈烈,企业为了用户可以方便、快捷地使用他们的应用程序,交易的种类可谓是五花八门、参差不齐,业务代码频繁更迭,导致各类安全风险层出不穷。本文就针对在线支付逻辑缺陷导致的安全问题进行分析和总结。
如果你和笔者一样从事着和信息安全相关的工作,你一定听说这这样的趣闻轶事,例如:一块钱买iphone、免费看演出,那么下文将为各位解开这些“谜题”!
支付逻辑缺陷
类型一:篡改支付报文请求中的关键金额
1.使用某网站的积分购买功能
2. 填写购买的积分,提交订单并使用截断工具截获数据包,修改关键参数
3. 应用程序并没有发现交易金额被篡改,继续跳转到银行的支付页面进行正常支付
4. 这样就使用1块钱购买了价值2500RMB的积分
类型二:关键参数没有对负数做限制
1.在某在线商城购买两个U盘
2.然后将价值26元的U盘数量改成了 “-1” 结果订单总金额叠加后变成了了1元
3.按照正常流程继续支付
4.人工审核也没有进行合理验证,订单顺利通过审核已经进入了拣货阶段
类型三:业务逻辑错误导致支付绕过
1.在某票务网站使用网上购票购买演出门票,选择一个位置
2.将最后一个参数pay修改由02修改为00
3.绕过支付功能,直接获取到票号
安全建议
综上所述,我们可以发现在线支付缺陷引发的安全问题并不复杂,但是稍加利用就可以造成了极大的危害。而在实际开发过程中,开发人员往往为了业务功能的便捷实现,经常会忽略了业务逻辑的安全性,笔者根据以往漏洞产生原理以及修复方案针对在线支付逻辑的缺陷提出以下十点安全建议,仅供参考:
1、在服务器端检查订单的每一个关键参数以及支付状态的真实性;
2、校验价格、数量参数,比如产品数量只能为整数,并限制最大购买数量 ;
3、在第三方支付平台校验实际支付的金额是否与订单金额一致;
4、如果涉及到用户退款,要使用原路、原订单退回。比如:退押金,按用户原支付订单原路退回;
5、关键交易请求使用报文加密、数字签名及验证,这个可以有效的避免数据篡改,重放攻击中的安全问题;
6、金额异常的支付或者订单需进行人工审核。
7、支付交易报文加入token,禁止报文的多次使用引发重放攻击;
8、定期进行业务系统的关键支付模块进行安全性测试;
9、对开发人员进行专项的安全开发培训,形成完善的开发流程,落地适用的开发规范;
10、引入风控措施、成立风控团队,对关键性交易进行实时监控、预警与干预。