preface :
Breacher是由python写的多线程管理员后台爆破工具
出于练手的目的,打算用golang重新造个轮子.
github:Breacher-Go
并发:
python里面自然用得多的是多线程.
而go里面自然要用到goroutine
go goroutine
语法:
在Go语言中,每一个并发的执行单元叫作一个goroutine
当一个程序启动时,其主函数即在一个单独的goroutine
中运行,我们叫它main goroutine
。
新的goroutine
会用go
语句来创建。
在语法上,go语句是一个普通的函数或方法调用前加上关键字go
。
go语句会使其语句中的函数在一个新创建的goroutine
中运行。而go语句本身会迅速地完成。
1 | f() // call f(); wait for it to return |
在Go语言中,语言本身就已经实现和支持了并发,所以写起并发来相当方便.
goroutine的优势:
gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。
它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。
简单的并发方案1
简单的做法:
-
将需要处理的Url分成n等份
-
开启n个goroutine去消费掉url
-
将需要处理的Url分成n等份
1 | func divided(links []string, goroutineNum int) [][]string { |
2.开启n个goroutine去消费掉url
1 | dividedLinks := divided(collected_path, 5) |
速度比较:
自身速度比较:
go 不用并发消耗的时间:
不同网络环境下的消耗时间:
-
elapsed time: 1.951978378s
(5个goroutine) -
elapsed time: 11.353934431s
-
elapsed time: 35.50535812s
(5个goroutine) -
elapsed time: 2m32.608078161s
与python的速度比较:
python:
2个线程:74.5581650734s
go:
2个goroutine
elapsed time: 1m10.233281137s
速度几乎是一样的,并非是想象中那样,go会比python快很多.
question: 什么场景下goroutine会比python的thread有优势?
减少误报:
最快的方式:
最快的方式就是用head
请求,然后通过response code
判断,如果是200
则认为存在.
但是这样在实际应用过程中,很有可能会产生大量的误报.
使用御剑爆破网站路径的时候,同理也会产生大量的误报.
例子:
Response code是200
大量误报:
误报结果:
原因:
暂时能想到的原因有:
-
网站本身会自定义错误或者404页面
-
网站有防护设备,会自动重定向到别的页面
解决方案:
找到管理员的后台的目的,通常是为了暴力破解,尝试用弱密码进入到管理员的后台.
那么就是有个共同点就是有登录页面
密码框常用到是input
标签的 type属性设为password
解决方案:
-
用
get
方法获取登录页面源码 -
Response code 为200的同时,页面源码含有
type="password"
结果确实是大大减少了误报
大字典的情况下,
get
方法的速度肯定会比head
方法慢很多,哎,速度与准确性常常难以并存啊~减少误报的同时,则会产生漏报问题…
refs:
question:
-
什么场景下goroutine会比python的thread有优势?
-
减少误报的同时如何减少漏报?