记一次代码逻辑漏洞查找过程-永远不要相信用户的输入

###今天朋友说自己网站被攻击,具体说是:

  1. 网站做了提现限制200元起的验证,余额为0元的用户却提现了0元
  2. 某用户通过微信支付0.01元买到了1000元的商品
  3. 某用户余额为0元,却购买到了单价1000元的商品47个,并且自己余额变成47000,该商品从原来47个的库存变成了94个

环境: windows+thinkphp 3.2,类似个人商城系统,能够余额,微信,支付宝银行卡支付,提现和充值都是人工打款

由于商品库存被修改,朋友担心是有人入侵了系统,修改了数据库字段,原来做程序的员工离职了,找我来看看

###先从最简单提现的来看
看了js和php,发现后台逻辑并没有验证200元限制,只是在前台用js``alert();验证了一下。。分分钟都能绕过直接post请求

###然后是微信支付0.01买了1000元的商品
用微信支付试了一下,表面上并没有什么问题,走了一遍流程

选择数量->提交订单->选择支付方式->发起支付请求->支付->完成订单

很常规的支付流程,但是我曹,这二货在选择支付的时候把总价明文放在了html页面。然后把订单ID和总价post给微信,生成支付二维码,重点是微信回调支付完成的时候也没有验证,造成的后果就是,可以修改html页面的val来控制需要支付的金额,但是订单号不变,本来1000元的订单,把金额改成0.01,于是支付了0.01购买了1000元的商品

###然后是第三个。。。
这个更奇葩。。。原因是有人故意将自己选择的商品数量改成了负数,也就是-47,然后库存47减去-47,于是库存变成了94,自己的余额从0元减去负的47*1000,就是47000了。。。

###真如那句话

永远不要相信用户的输入

文章目录