前言
一些情况下,我们需要通过并发来发现验证漏洞,而在服务端有拦截策略的情况下,使用单台服务器进行并发是不可取的
因此我们需要多台服务器来同时实现并发,此处抛开axiom
不谈,主要记录一下我快速实现多台服务器同时并发的思路(不用复杂编程语言,仅依赖于服务器shell,做到最简化)。
第一版
我能想到的,最简单的,就是直接写shell来实现
- 发起请求用
curl
- 实现并发用
for循环
+nohup
- 多台服务器同时启动,写个
while true
,然后用if
判断是否超过某个时间(需要保证服务器都在同一时区) - 结果可以在
nohup.out
中查看
demo如下:
while true; do
if [[ `date +%s` -gt 10位时间戳 ]];then
for i in {1..6}
do
nohup curl语句 &
done
break
fi
done
效果如下:
先用date +%s
看一下当前的时间戳,然后手动+30秒
代码如下:
while true; do
if [[ `date +%s` -gt 1669259050 ]];then
for i in {1..6}
do
nohup curl xxx.com &
done
break
fi
done
实现如下:
从肉眼来看,确实都是一瞬间发起的请求,并发也就完成了。
第二版
上面虽然从肉眼来看,都是同一瞬间发起的请求,但理想很丰满,现实很骨感
实际使用中漏洞验证效果不好,本来一个IP能并发成功5次的,用了这个,反而一共只能成功2-3次了。。。
分析一下原因,刚才的流程如下:
- 发起请求用
curl
- 实现并发用
for循环
+nohup
- 问题:for循环,也有一定的微小延时,实质上并不是同一时间发出去的
- 多台服务器同时启动,写个
while true
,然后用if
判断是否超过某个时间(需要保证服务器都在同一时区) - 结果可以在
nohup.out
中查看
所以,分析后的想法,就是把时间判断和curl单独提取出来,每一个请求都单独判断是否启动,不用for循环一个一个启动,到点直接curl,从而实现并发。
demo如下:
- a.sh
while true; do
if [[ `date +%s` -gt 时间戳 ]];then
curl语句
break
fi
done
- 终端运行代码
for i in {1..6}
do
nohup bash a.sh &
done
实现如下:
总结
主要思路还是三步
- 能发起请求
- 能并发发起请求
- 能在多台服务器上同时并发请求