一、漏洞原理
在绝大部分网站中,都提供短信来进行用户验证,如注册、登录、修改密码、转账等功能,通过短信可以简单便捷地进行用户验证。
但是,如果验证逻辑存在缺陷,导致用户可以无限制请求短信接口,就会造成短信轰炸漏洞,也属于防护功能滥用类漏洞。该漏洞的利用过程也比较简单,即伪装成正常用户,向短信接口发起大量的请求,即可完成攻击过程。短信轰炸漏洞也能造成不小的危害,如会造成短信通道阻塞、短信资源被恶意消耗,如果被灰黑产利用,制作成短信轰炸机,还会造成企业形象受损,若被用户投诉还可能造成接口封禁等威胁。
二、实际问题
相信每个渗透测试工程师在工作中会常常挖掘到短信轰炸漏洞,同时在测试过程中也会遇到一个疑问,一是如何设置短信发送数量的阈值,二是如何设置时间的阈值,简而言之,在多长时间内发送多少条短信才能认定是短信轰炸漏洞。为什么会有这个疑问呢,其实跟实际的工作非常贴合。首先,作为网络安全公司的工程师,目的是为企业提供更好的服务,创造价值。其次,作为监管方,要履行应有的职责,多数情况下也会采纳安全厂商的建议。最后,作为被监管方,要保障业务的安全稳定运行。那么,当一个漏洞的判定标准不同时,就会引发额外的沟通成本。查阅一些相关的资料,重新理解了短信轰炸漏洞的定义。选取具有代表性的互联网公司的安全应急响应中心的安全漏洞及威胁情报处理规范,调研结果如下:
腾讯安全应急响应中心,无限制短信轰炸漏洞;
字节跳动安全应急响应中心,短信轰炸需要能够绕过已有风控策略,造成短时间高强度(5分钟内连续发送50条以上)对同一号码进行轰炸。横向短信轰炸(对不同手机号码发送短信)不收取;
百度安全应急响应中心,普通逻辑设计缺陷。包括但不限于无限制短信邮件等发送等,《百度安全响应中心漏洞奖励处理细节V2.0》;
阿里安全响应中心,轻微的设计缺陷漏洞,如对单个手机的无限短信轰炸漏洞;
快看安全应急响应中心,单一 IP/用户半小时内定向发送超过 50 条短信后无任何限制,利用短信接口无限制向不同手机发送单条短信的行为将被忽略。
综上所述,对于短信轰炸漏洞的定义是在短信发送数量上至少能够连续发送50条以上,那么在时间上是没有明确的标准,欢迎各路大神提供有价值的参考材料。
三、防御思路
短信轰炸漏洞造成的原因大概可以总结为两个,一是没有验证用户是否为正常用户,二是没有限制短信下发的频率,而防御思路也可以根据这两个方面来展开。针对于用户校验方面,可以通过在发送短信验证之前,增加图形验证码或者是滑块验证码。而短信下发频率方面,可以限制单个IP请求频率、限制单个手机号请求频率等等。参考《基金管理公司移动互联网应用程序技术规范》对短信验证码问题提出了几点要求:
应确保手机号的真实性得到验证,用户修改手机号应进行严格的身份验证;
短信验证码发送时,应包含相关业务信息,说明短信验证码用途;
应为短信验证码设置合理的有效期;
短信验证码应随机产生,且长度不小于4位;
短信验证码的使用应遵循一码一用的原则,不允许被重复使用,不允许跨业务跨订单使用;
短信验证码短信的内容不应由用户定制;
需要短信验证码的业务场景,应充分论证其业务的必要性,避免造成短信轰炸。
3.1 图形验证码
造成短信轰炸漏洞的主要原因是攻击者可以编写成自动利用脚本工具,对短信接口进行大量的调用。如果在获取短信验证码前,增加一个图形验证码,只有校验成功才能进行后续操作,也能有效地防御漏洞。如果图形验证码功能增加的逻辑不当,仍然会造成短信轰炸漏洞:
前端验证,图形验证码必须在服务端生成和校验;
验证码复用,验证码必须单次有效,有合理的失效机制;
图形过于简单,可以使用OCR进行图形识别,验证作用也就不复存在了,可以使用需要逻辑判断的图形验证码,如简单的算式等等,都可以增加攻击者自动化攻击的成本。
3.2 滑动验证
相对于简单的图片验证码,滑动验证的方式不仅用户体验会更好,安全性也会更高,因为滑动验证的本质逻辑是用户的拖放轨迹是否符合真实用户的行为特征。但是,滑动验证也并不是完全不可绕过, 在Github 上有不少利用深度学习进行滑动验证项目。其工作原理是,通过对大量的样本数据进行数据标注,即将滑块的位置标注,用目标识别的模型,预测出滑块位置,最后通过轨迹方程,完成滑块验证。同时,滑动验证也需要规范使用的逻辑,如有效性控制,包括了有效时间和有效次数等等。
3.3 限制单个IP请求频率
通过限制IP在单位时间内的请求次数,可以有效阻止某个IP在短时间内对大量用户进行轰炸攻击。一旦用户请求次数超出设定的阈值,则暂停对该IP一段时间内的请求进行响应;若造成大量的恶意请求,也可以将IP加入黑名单,禁止该 IP 的访问请求。然而,通过IP限制的方式,仅仅是增加了攻击成本而已。单一的IP限制很难达到比较好的防御效果,攻击者可以使用代理池等对IP限制进行绕过。
3.4 限制单个手机号请求频率
可以根据业务需求,对手机号在单位时间内的请求次数进行限制,如一天不超过十次等。同时,还需要对两次请求之间的时长做合理限制,时长应该要超过验证码有效期。通过这样的限制,可以有效地解决单个用户遭受短信轰炸的困扰。但是,仅仅通过限制单个手机号的请求频率,依然无法解决所有问题。这样的防御方案仅仅防止了短信轰炸问题,但是攻击者依然可以通过生成随机手机号,对随机用户发送短信,虽然这样的攻击并不会造成轰炸的效果,但是依然会损耗短信资源,造成一定的损失。