一、背景

  公司新产品体验,发现不少交互、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浪费公司的钱的更多相关文章

  1. Unity利用SMSSDK实现短信验证码(附代码)

    最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...

  2. 利用WeX5给手机APP增加短信验证码功能

    帖子来源:http://bbs.wex5.com/thread-70908-1-1.html 遇到一个手机APP项目客户要求注册到APP上的用户手机号必须是真实的通过X5平台整合短信发送平台接口完成了 ...

  3. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  4. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  5. App开发(Android与php接口)之:短信验证码

    最近和同学们一起开发一个自主项目,要用到短信验证码,在网上搜索了很久,看到一个推荐贴,提到了很多不错的短信服务商.经过测试,帖子中提到的服务商他们的短信到达率和到达速度也都不错.最后,由于经费问题,我 ...

  6. atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc

    atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...

  7. flask开发restful api系列(5)-短信验证码

    我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...

  8. thinkphp整合系列之短信验证码、订单通知

    现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appi ...

  9. java接入创蓝253短信验证码

    说明 项目是springboot框架 1.短信配置文件 包含验证码发送路径.用户名.密码 chuanglan.requesturl= chuanglan.account= chuanglan.pswd ...

随机推荐

  1. sql 与 mysql 链接数据库

  2. Character

    Character a = new Character(); Character.isUpperCase(a) 判断给点的字符是否是大写字符 Character.isLowerCase(a) 判断给定 ...

  3. mysql8操作命令(持续更新)

    mysql服务管理 查看服务状态 systemctl status mysqld.service 启动服务 systemctl start mysqld.service 关闭服务 systemctl ...

  4. LeetCode数组查找问题

    简单的二分查找法:(Leetcode704): 注意条件(low<=high) public int search(int[] nums, int target) { int low=0; in ...

  5. spring-petclinic性能调优实战(转)

    1.spring-petclinic介绍 spring-petclinic是spring官方做的一个宠物商店,结合了spring和其他一些框架的最佳实践. 架构如下: 1)前端 Thymeleaf做H ...

  6. Java 学习笔记- classpath classpath*

    转自:https://blog.csdn.net/javaloveiphone/article/details/51994268 1.src不是classpath, WEB-INF/classes,l ...

  7. Xgboost GPU 加速

    import xgboost as xgb import numpy as np from sklearn.datasets import fetch_covtype from sklearn.mod ...

  8. php动态获取网页图片路径~

    <?phpheader("Content-type:text/html;charset=utf-8"); 请求的url $url = 'http://dsc.taobaocd ...

  9. react项目中实现悬浮(hover)在按钮上时在旁边显示提示

    <i className={classNames({ 'device-icon': true, 'camera-icon': true, 'camera-icon-hover-show-intr ...

  10. ubuntu安装QGIS

    参考官网https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu 但是官网写的太繁琐分散,没有按每个OS集中写cli安装完整过 ...