新手区 测试小故事一则,逆向思考真的很重要。

我去催饭 · 2018年11月19日 · 最后由 徐汪成 回复于 2018年11月23日 · 2279 次阅读

场景:

新用户注册界面。需要填写手机号,图形验证码,短信验证码,然后有个立即注册的按钮。我在设计测试用例的时候,只是考虑了一些常规的功能场景,比如数据长度、类型,是否可以执行 sql 注入类语句,以及绕过前端直接通过接口访问,一些可能的并发等,不细讲了。我还特意考虑了恶意用户通过脚本大量刷我们的短信验证码请求,造成短信成本提高的可能。

本来我以为这就够了,然而安全测试的同学一眼就看出了问题。在这个拉新成本越来越高的当下,注册页面不仅承载着拉新的任务,同时,他还可能存在着暴露客户信息的风险!

举个例子:一个正常的用户输入手机号,图形验证码,点击发送短信验证码,我们会校验手机号规则,校验图形验证码,然后查数据库校验,看这个手机号之前有没有注册过我们的 app。如果查到了,服务端就返回查询结果,前端展示给用户 “该手机号已经注册过”,同时取消短信验证码的请求。

乍一看没毛病,已经注册过了,就没必要花几分钱一条的短信验证码了不是?漏洞恰恰就在这里,我们的竞争对手,完全可以通过号码库大量穷举的方式来测试我们的注册接口,通过抓包工具屏蔽掉图形验证码的访问请求,直接暴力请求短信验证码接口,通过接口返回的信息,判断这个手机号是不是已经注册了这个 app,然后就可以得出一个结论,这个号码的主人可能有我们的产品相关的需求,然后就可以发动电话攻势抢客户了。我们本来考虑的节省短信费的手段,恰恰成为了可能丢失用户的隐患。

问题暴露了。解决之道却还很长,我们考虑了将图形验证码逻辑进行修改,只要请求了短信验证码接口,就将图形验证码置为失效状态;另外不论用户是否已经注册过,都将他引导到客户端下载页等等,想完全避免信息泄露不太可能,但是至少提高了用户非正常操作的成本。

今晚发高质量贴的大佬好多,我反反复复改了好几遍还是不太满意。只是感觉这是个可以分享的点,忍不住记录下来。文笔排版都欠佳,各位见谅,求轻喷。Or2

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复 时间 点赞

简单的安全测试用例一枚

遍历漏洞

11楼 已删除

刚刚试了几个网站,都是这样的,点击发送验证码的时候就提示已经注册过了。。

其对于这种问题,首先可以进行频率限制,避免大量请求;
还要就是可以对请求数据进行风险分析,短时间内出现大量这种的请求,直接进行拦截处理

为了安全,失了易用。安全都是两面性的。
另,图形验证码服务端都不校验的吗,很好奇怎么绕过

你说的这个已经超出测试人员应该考虑的内容了。。。这个是产品经理的思考范畴了~

6楼 已删除
zlp 回复

确实,什么锅都往测试身上甩,我们可背不动啊~~

arrow 回复

做了请求频率和 IP 限制,但是不能规避大规模分布式跑脚本这种情况,只能说防一般的攻击手段吧

子凡 回复

原本的图形验证码逻辑存在漏洞,用户在输入了正确的图形验证码后会产生一个有效的鉴权 id,持续若干时间。在这个时间段内,都可以发送短信验证码的请求。我们在前端做了设置,只要用户点击了发送短信验证码,就同时触发一个刷新图形验证码的请求。但是没有考虑到攻击者可以通过接口绕开前端的限制,直接调用短信验证码的请求,达到刷我们用户信息的目的。

如果是希望用户多注册,个人觉得应该不仅仅限于绑定手机号。
如果需要强关联用户,可以必须绑手机号。
当然也可以第三方登录,后面再做强绑手机。
关于注册都是加密报文,除非模拟手机点点点,靠发包可以的话,那你们应用基本安全都有问题。

magicyang 回复

只是端外注册,核心还是要在 app 内注册

这个问题可不是一般测试能够考虑的到,就算是开发估计也不会想到。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册