如今,移动支付已经成为了主流,无现金支付越来越普遍,我们出门完全不用带纸币,到商店买东西、餐馆吃饭、坐车等都可以用手机支付解决,这给我们带来了很大的便利;我们再也不用担心钱包被偷或者丢掉的问题了,这一定程度上减少了偷盗的犯罪率,为社会的安定做了贡献;也减少了纸币的丢失和损耗,降低了国家货币流通的成本。而移动支付里,当属二维码支付最为流行,像微信支付,支付宝支付,二维码收款等,各行各业只要涉及到支付的问题,都会弄个二维码支付。尽管,二维码支付很方便和安全,但是也存在一定的风险,如果没有理解其本质,不考虑其安全性,将会带来一定的安全风险。下面,就将我的最近一次发现某餐饮企业二维码支付漏洞的经历分享给大家。

     最近发现公司周边的一家餐饮店做得很不错,虽说是快餐,但是每个菜都是小锅现炒的,菜品很美味,第一次吃肯定会让你称赞。和同事一起去这家店吃了10多天之后,趁其充值1000送500的活动,办了一个会员,然后支付的时候可以用会员里的个人二维码支付。某一天,我们吃饭讨论起来了二维码支付的问题,有个同事说,支付这样的动作涉及到钱,企业肯定会重视的,所以这个二维码应该是动态生成的,每次登录会员的时候都会变;我说,可能未必,支付宝支付、微信支付的二维码都是固定的,更何况这个小餐饮企业呢。一番争论不下,同事就说验证一下就可以了,将二维码里面的内容扫出来,如果每次都不一样,那么就是动态生成的,反之不是;不验不知道,一验吓一跳。原来,那个支付的二维码内容扫出来是会员的手机号码,每次扫都是。一下子大家都隐约感觉到了其中可能存在的安全漏洞,因为二维码的内容太简单,支付的时候后台无法确定是否是本人操作(越权漏洞),所以如果我拿别个会员的手机号生成一个二维码,然后将生成的二维码替换我那个二维码,来个“移花接木”,不就可以刷别人会员的钱了,以后每天都可以吃霸王餐啦,想想都很兴奋。为了满足我们的好奇心以及验证我们的推断,我决定亲自去试验。我将试验分成了三步

  第一步:登陆会员之后,将支付二维码截图下来,付款的时候用截图的二维码支付(每次登陆都好慢,好多人不知道可以将二维码截图下来,包括之前我也是),验证一下是否可以正常支付;经过验证是可以的,也是符合预期的。

       第二步:退出会员登陆,看后台有没有做会员在登陆状态才能支付的校验,这也是它唯一能做的安全性校验了;退出会员登陆几天后再去验证,发现还是可以正常支付的。结果似乎已经越来越接近我们的推断了。

       第三步:也就是大招,拿同事的手机号(他也是会员),生成了一个二维码,然后将生成的二维码替换我的二维码;拿做好的二维码去支付,也能正常支付。给大家看一下,原二维码与做好的二维码

                                      

        左边的是原支付界面,右边是我替换二维码之后的界面,这样看二维码的区别还是很大的。不过,现场去支付的时候,收银员是完全注意不到的。这里我把涉及到企业logo相关的信息给模糊掉了,避免给别人造成经济损失。

        经过三步走之后,结果与我们的推断完全一致,可以确定其存在支付漏洞了。下面我就来说说其漏洞产生的原因以及相应的解决方案。

        先说一下二维码,官方解释是:是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,直白一点就是记录一串文字(比如数字,字母等)。相同的二位码包含的信息肯定是相同的,但是相同的信息,根据不同的生成二维码策略,二维码是不一样的,所以我能自己生成二维码,然后支付的时候也能扫出来相同的信息。至于二维码的生成,自己可以写程序生成,也可以直接在网上在线生成。然后说说为什么支付宝支付、微信支付等二维码支付不存在支付漏洞,而这家企业的支付却存在漏洞。因为支付宝支付、微信支付等二维码的内容不是简单的手机号,具有一定的含义,支付的时候也需要用户输入密码确定。其他安全的二维码,有的会对内容做加密处理,或者包含更多唯一的信息等。

       下面说说针对这个漏洞的解决方案,其实也很简单:1、对手机号做坐加密处理,然后用加密后的串生成二维码 2、用登录后的Token和手机号号码生成二维码 ,3、用具有一定规则的一串数字作为串生成二维码,以上是三种常用生成二维码的方法。同时,用户在支付的时候要做校验是否是本人操作等。加上这些处理就能很容易避免支付漏洞了。

        此次经历分享完了,希望能给大家提升一点安全支付的意识,以后自己做二维码支付的时候不会出现安全漏洞。

 

版权声明:本文为pfblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/pfblog/p/10082594.html