一, 背景
公司新产品体验, 发现不少交互, 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 不分大小均记录, 有利于经验的整理, 线上回题回溯, 背锅时的有理有据反驳!
努力提升知识广度, 开拓眼界, 增加思维的深度!
祝各位端午节快乐!
来源: https://www.cnblogs.com/findyou/p/9186693.html