短信轰炸漏洞的相关排查

黄鹏宇 275 2024-03-24

image-1711268803432

前言

根据上述漏洞通报,对我们各产品的短信验证码限流逻辑排查,存在几个问题,总结如下:
一、未做限流
二、限流逻辑在并发情况下存在漏洞
三、限流逻辑不完备

问题具体描述

一、未做限流

存在大量接口未做限制,整改方案略。

二、限流逻辑在并发情况下存在漏洞

示例一

screenshot

由于13,16行不是原子操作,存在并发情况下,count始终为0,形成短信轰炸效果。

image-1711269696611

整改建议

将读、写逻辑,替换为redis.incr()操作

after-1711270025476

三、限流逻辑不完备

现有各项目的限制,基本上只限制了重复"手机号"的发送,对于请求方的IP,未做限制。此漏洞会导致接口的盗刷。
建议将IP的请求数量也设为限制条件。

测试代码

import requests
import threading
url = "http://192.168.5.56:4224/appoint/apply/checkAndSendVerifyCode?activityID=1721446289622528000&userPhone="

def sendCode(i):
    if(i%2==0):    
         phone = "17685837371"
    else:
         phone = "13148085727"
    r = requests.get(url+phone)
    print(r.json())


def main():
    # 多线程发送
    threads = []
    for i in range(60):  
        t = threading.Thread(target=sendCode, args=(i,))
        threads.append(t)
        t.start()
 
    for t in threads:
        t.join()  # 等待所有线程完成
 
if __name__ == "__main__":
    main()