【安全测试】如何利用短信验证码BUG浪费公司的钱
一、背景
公司新产品体验,发现不少交互、UI、功能设计上的小问题。于是花了点时间随意挑了几个功能深入的玩了一下,顺手提了BUG。接口层,看了一下接口文档,简单测了一下接口,BUG其实还挺严重的,后面详细分析,为了顾及服务器后台大佬(架构师)的面子,费时费力在APP测试短信验证码服务器与APP整体处理逻辑,提交BUG如下:
- BUG:

- 解决结果:

哎!TX背景的架构师的解决结果,让我稍许失望。
二、BUG分析
1、先说结论:重点是可以短时间(1、2分钟)之内把短信平台的预充值费用全部用完
1). 单手机号码可发送短信:40条+
2).可多手机号,短时间操作无限制发送短信验证码
3).对用户影响:可做短信炸弹恶意骚扰用户
4).对公司影响:短时间耗尽充值平台费用,导致注册、登录功能不可用;大量垃圾短信影响公司形象
2、第一个问题:单号码没有限制条数
a、06.12号当天实测,可以30来条,每15条换了一个通知号码而已
b、06.14号当天实测,确实超过15条是提示超出频率限制。(内心OS:我有当时短信截图,并有12号的其中部分日志在手,日志在手...)

测试想要不背锅,哥就大发慈悲教一条:不管大小BUG均记录在案,严重问题尽可能全的保留界面截图、日志文件等直接证据。
补充:一般第三方短信平台已有限制每个号码每天发送频率与条数:一般10条左右/天,1分钟内不超过2条
3、第二个问题:同设备、同IP、多号码请求无限制
a、文档设计,我们直接看业务层接口设计就能发现致命的缺陷!
- 接口文档

- 模拟请求

b、设计缺陷简单分析
1)、此接口为直接请求,基本没有其它前置接口处理(除了接入层路由)。
协议说明:APP请求走socket协议到接入层,再由其将请求内容改成http转发给业务层 --本次不讨论这个
缺陷1:无请求来源识别
缺陷2:同设备、同IP恶意请求,无法做限制 --此处原以为接入层有做,但我今天实测了一下未发现
缺陷3:无数据篡的改校验
缺陷4:单号码有加发送频率限制(刚加),同设备更换号码发送频率无限制
缺陷5:单号码有加15条/天的限制(刚加),同设备多号码(不停更换号码)短信发送可无限制
以上接口没有对外暴路,相对安全一点。但安全隐患是存在的,后面会讲实操如何实际测试,对是测试!
4、第三个问题:短信炸弹
之前没有单号码的条数限制、发送频率的限制,
现在有了,就不能任性发,此问题作废,但稍稍解释一下。
- 无条数限制:一天发个几十条给你,一个网站几十条,多几个网站你就跪了,有没有经历过某宝卖家的骚扰?
- 无发送频率的限制:一分钟2条,如果没有限制,段时间就可以给你来个几十上百条,手机响个不停,15条一个号码,黑名单你都拉不过来
5、第四个问题:浪费钱,影响形象
短信验证码是为了用户快速登录,没有达到预期,都是浪费钱!故从这个角度说,没有安全措施,就是浪费钱!还不停给用户不需要的垃圾短信!
6、第五个衍生的问题:验证码与登录逻辑的安全缺陷
- 登录接口的Bug:
在测登录接口时试了,输错试过250次短信验证码(数字是巧合,嗯!),最后一次正确,依旧可以登录成功!what?怎么有这么牛X的操作???
- 验证码是4位数:
单看4位数验证码,没有一点问题对吧?
手机在用户手里,你也收不到,几位还是不一样?NO!!!
首先,4位验证码有10^4=10000种可能,验证码3分钟内有效。
其次,登录无错误次数限制
就问一句:你能不能在180秒破解登录,就1W种可能!
答案:so eazy!
三、如何浪费公司的钱
其他扯淡的吹嘘的玩意都不说,实操怎么浪费公司钱(短信费用)!!!(啊!~~老板听我解释,不是你想的那样!)
假设我非公司员工,不了解协议与逻辑,有什么办法呢,多的是,先提两种:
- 第一种方式(笨方法):
第一步:随机生成10W+手机号码
第二步:装Android虚拟机,安装产品APP
第三步:adb模拟(android自动化工具appnium什么的也行)
1)、app启动 : adb shell am start -n com.xxx.xxx/.xxx
2)、输入手机号: adb shell input text 15900000000 --手机号可以从文件中读取
3)、点击发送验证码:adb shell input tap 100 300 --发送验证码按钮位置是固定的
4)、Kill APP(可绕过60秒倒计时) :adb shell am force-stop com.xxx.xxx
第四步:循环以上三个步骤
说明:
1、可以写成bat,mac可以写成sh
2、吃饱了,试了一下,一个虚拟机大约5秒左右一条短信,可以启多个虚拟机一起跑,达到1秒1条
3、多个虚拟机使用以下命令: "adb -s 虚拟机 shell 命令"
4、以上adb还是有些慢,最好的方法是用monkeyrunner写(python语言)
5、这两次测试浪费了公司不少钱,少说也有10RMB++大大额巨款
- 第二种方式(抓包模拟):
第一步:随机生成10W+手机号码
第二步:Android手机(或虚拟机)安装产品APP
第三步:抓包模拟
1)、Android手机连接电脑共享wifi
2)、开启抓包工具,比如wireshark
3)、输入手机号,点击发送验证码
4)、重得以上步骤多次,找到规律破解
5)、python脚本或其他工具模拟请求
说明:
1、此方法成功率靠运气,不少APP都是有加密等各种措施防止中间人攻击
2、此方法需要一定实力,有代码或其它功底,第一种方式,完全不有压力
3、如里是不小心得到了接口协议文档的,直接跑接口,完美!!!
四、感触
想了很多,有很多想说,
写到这时突然发现,准备写的感触稍稍过于偏激,
好久不曾热血与冲动。
深呼吸...1分钟....................................................................................
还是来点鸡汤!
安全无小事,认真对待你发现的每一个BUG,也许错过它,就是公司破产的第一步!
BUG不分大小均记录,有利于经验的整理、线上回题回溯、背锅时的有理有据反驳!
努力提升知识广度,开拓眼界,增加思维的深度!
祝各位端午节快乐!
【安全测试】如何利用短信验证码BUG浪费公司的钱的更多相关文章
- Unity利用SMSSDK实现短信验证码(附代码)
最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...
- 利用WeX5给手机APP增加短信验证码功能
帖子来源:http://bbs.wex5.com/thread-70908-1-1.html 遇到一个手机APP项目客户要求注册到APP上的用户手机号必须是真实的通过X5平台整合短信发送平台接口完成了 ...
- Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结
Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码 用户操作 ,比如 ...
- Django商城项目笔记No.5用户部分-注册接口-短信验证码
Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...
- App开发(Android与php接口)之:短信验证码
最近和同学们一起开发一个自主项目,要用到短信验证码,在网上搜索了很久,看到一个推荐贴,提到了很多不错的短信服务商.经过测试,帖子中提到的服务商他们的短信到达率和到达速度也都不错.最后,由于经费问题,我 ...
- atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...
- flask开发restful api系列(5)-短信验证码
我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...
- thinkphp整合系列之短信验证码、订单通知
现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appi ...
- java接入创蓝253短信验证码
说明 项目是springboot框架 1.短信配置文件 包含验证码发送路径.用户名.密码 chuanglan.requesturl= chuanglan.account= chuanglan.pswd ...
随机推荐
- vue-cli ——解决多次复用含有Echarts图表组件的问题
在vue项目里,组件复用是一件很开心的事,可以节省很多时间去排版,达到事半功倍效果,但是昨晚在vue-cli项目里组件复用时发现基于Echarts图表的组件不能够复用,昨晚捯饬了很久,终于还是解决了这 ...
- cxgrid 非编辑状态下复制当前列的值 真折腾人
1.自带的CTRL +C 只能复制整行,不知是不是版本问题. 2.有分组这个代码就不行了 s:= G1DBView.DataController.Values[G1DBView.Controller. ...
- Linux的文件系统
根文件系统(rootfs): root filesystem LSB, FHS: (FileSystem Heirache Standard) /etc, /usr, /var, /root, /ho ...
- 封装一个通用的正则,不再为test和replace所烦恼,eval很棒~
- Linux vsftpd 安装配置使用
1.安装 yum install vsftpd 2.配置 允许root登陆: /etc/vsftpd/user_list文件中把root那一行删除或者注释掉 /etc/vsftpd/ftpusers文 ...
- Kali Linux Xfce版美化虚拟机镜像
起因 这两天来学校把硬盘基本全部清空了,所以以前的虚拟机就需要重新安装了. Kali 一直用的是 xfce 版本,至于为什么用这个版本,是因为我感觉 gnome3 在虚拟机上表现欠佳.当然,默认的 g ...
- Bytom Kit开发辅助工具介绍
Bytom Kit是一款为了帮助开发者更简单地理解Bytom的开发辅助工具,集合了校验.标注.解码.测试水龙头等功能. 该工具用python语言封装了一套比原的API和7个工具方法,如果有开发需求可以 ...
- J2EE笔记
J2EE的优势 J2EE允许公司把一些通用的.很繁琐的服务端任务交给中间件供应商去完成.这样开发人员可以集中精力在如何创建商业逻辑上,相应地缩短了开发时间.高级中间件供应商提供以下这些复杂的中间件服务 ...
- Flutter安装之后cmd运行错误解决
当把Flutter环境变量配置之后,打开cmd输入:flutter 出现如下错误: 'MySQL' is not recognized as an internal or external comma ...
- 使用Spring MVC实现数据绑定
使用Spring MVC实现数据绑定 ——Spring MVC支持将表单参数自动绑定在映射方法的参数. ①绑定标量数据 前端代码: <form action="${pageContex ...