安全研发启蒙课:合理使用协程优化YAK插件

引言

协程是一种轻量级的线程,可以在单个线程中实现并发执行。与线程不同的是,协程之间的切换成本非常低,可以在不阻塞线程的情况下实现高并发,非常适合用在漏洞扫描等需要高并发的场景。

Yaklang支持通过go关键字创建协程,与go类似。但是对于没学过golang的同学来说还是有上手难度的,所以本篇文章就介绍下如何简化在一些基础场景下协程的使用。

协程池

类比线程池我们可以使用Yaklang写一个简单的协程池,我们使用生产者-消费者模式来实现。

一般在YAK插件中发包场景对并发有需求,由于只有发包过程是网络IO,所以我们使用一个生产者对应多个消费者,如下

安全研发启蒙课:合理使用协程优化YAK插件_第1张图片

代码如下

NewThreadPool = func(size){ inputChan = make(chan var) var consumer wg = sync.NewWaitGroup() threadPool = { "consumer":f =>{ consumer = (id,data)=>{ try { f(id, data) } catch err { log.warn("run consumer error: %v"%err) } } return threadPool }, "productor":f=>{ try { f(inputChan) } catch err { log.warn("run productor error: %v"%err) } return threadPool }, "start":()=>{ for id = range size{ wg.Add(1) go func(id){ for data in inputChan{ if consumer{ consumer(id,data) }else{ log.warn("not set consumer for data: %v"%data) } } wg.Done() }(id) } return threadPool }, "wait":()=>{ close(inputChan) wg.Wait() } } return threadPool } pool = NewThreadPool(10).consumer((id,data)=>{ println(data) }).start() pool.productor((c)=>{ c <- "data" }) pool.closeInputChan() pool.wait()

``

NewThreadPool函数参数是线程数量,返回的是一个对象,这个对象包含以下几个方法:

  • consumer: 用于设置任务处理函数,即消费者,通过该方法传递一个函数,该函数用于处理从输入通道中读取的任务数据;

  • productor: 用于设置任务生成函数,即生产者,通过该方法传递一个函数,该函数用于向输入通道中写入任务数据;

  • start: 用于启动线程池,即开始从输入通道中读取任务数据,并交给任务处理函数处理;

  • wait: 用于等待所有任务处理完成,即等待所有线程执行完毕。

使用流程大概如下,线性的流程很简单安全研发启蒙课:合理使用协程优化YAK插件_第2张图片

优化Fastjson插件

先回顾下 Fastjson 插件的检测逻辑:

安全研发启蒙课:合理使用协程优化YAK插件_第3张图片

流程中有三次需要发送Payload,第一次通过InetSocketAddress检测Dnslog回显,第二次测试低版本Payload,第三次测试高版本Payload。我们可以使用协程池对这三次发包过程进行优化。

部分代码如下:``

pool = NewThreadPool(10) // 10个线程 pool.consumer((id,data)=>{ // 每次从任务管道读取到任务后都会调用 consumer ok = sendPayload(data...) // sendPayload是发包函数,这里的 data 是数组,使用...可以对数组解包作为参数 if ok{ yakit.Info("目标存在漏洞") } }).start()// 设置线程数和consumer后启动 pool.productor(c=>{ for _,dnslogPayload = range dnslogPayloads{ c <- [dnslogPayload,true] // 需要检测的目标放进任务管道 } }) pool.wait() // 等待任务完成 yakit.Info("扫描结束")

``

完整代码已经在Yakit插件商店更新,有需要学习或使用的可以直接去插件商店直接下载。

总结

对于一些频繁需要发包操作的插件,我们可以通过协程去实现并发操作,来优化插件的使用体验,对于使用协程不太熟悉的同学可以使用例子中使用的协程池操作。

频繁需要发包操作的插件,我们可以通过协程去实现并发操作,来优化插件的使用体验,对于使用协程不太熟悉的同学可以使用例子中使用的协程池操作。

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

你可能感兴趣的:(安全)