微同商城小程序越权漏洞分析
去年八月份挖的,已获得CNVD编号,近期准备跳槽决定拿出来水一下。
项目介绍
微同商城是Gitee平台上建站系统中排名第一的开源微信小程序商城(前后端开源:uniapp+Java),拼团、秒杀、优惠券、积分购物、直播卖货、分销等功能。
项目地址
http://fly2you.cn/
https://gitee.com/fuyang_lipengjun/platform
环境搭建:
部署方案1:后台:http://doc.fly2you.cn/start
部署方案2:微信小程序+后台:https://mp.weixin.qq.com/s/leAe8mYv46AcUU8Bcn_ULg
部署+测试工具:
后台:idea+mysql+redis+tomcat
前台:微信官方开发者工具+postman
注意事项:
运行小程序需要配置platform-admin\src\main\resources\dev/platform.properties文件中的wx.appId、wx.secret、wx.mchId(支付功能需要)
涉及小程序测试账号的申请参考:https://mp.weixin.qq.com/
漏洞复现
缺陷代码位置:platform-api\src\main\java\com\platform\api\ApiOrderController
缺陷方法:confirmOrder
代码审计过程中,发现微信小程序中用户确认收货方法confirmOrder存在越权漏洞。越权漏洞源于用户确认收货的方法中涉及订单的主键orderId传递到了前台并且可控,缺陷代码如下:
跟进orderService.queryObject和orderService.update方法,发现未校验传入的orderId是否属于当前登录用户本身,因此存在越权漏洞。
1、使用微信开发者工具运行小程序,开启调试器。
2、进入 我的—>订单列表
3、点击待收货的订单,进入订单详情页面,再点击确认收货
4、刚才提到开启了调试器,可获取到确认收货方法的请求confirmOrder,如下
5、点击confirmOrder,右键选择 Copy - Copy as cURL (bash)
6、打开Postman(测试工具),在Postman 中选择 File—>Import —>Paste Raw Text,将复制的 cURL bash 命令粘贴进去,点击Continue再点击import完成导入。
7、选择Body,修改orderId的VALUE为20(非当前登录用户的)
备注1:当前小程序登录用户为测试员1号,为了证明越权漏洞的存在,将orderId的值替换为其他用户的,若执行成功,则证明漏洞存在。
备注2:本项目数据库nideshop_order表中默认只有一条id为20的数据,下图测试员1号的数据需要自己添加进去。
8、点击Send,Response返回确认收货成功。
9、登录后台管理系统,发现发货状态为已收货,越权漏洞复现完成!
修复建议
增加权限校验,即判断confirmOrder方法中传递的orderId是否属于当前登录用户。