一、nuclei是什么
Nuclei 是一个快速、灵活、可扩展的开源漏洞扫描工具,用于发现 Web 应用程序中的安全问题。它允许安全研究人员和渗透测试人员轻松地定义和执行定制的漏洞扫描任务。
Nuclei 使用模板来定义漏洞扫描任务。这些模板是基于 YAML 格式的,允许用户根据需要定制扫描规则和操作。Nuclei 官方社区包含一个内置的模板库,其中包含常见的漏洞检测规则,例如 XSS、SQL 注入、路径遍历等。
Nuclei3版本以上迎来了重大更新,官方开始支持nuclei作为sdk的形式,嵌入到开发者自己的工具当中。当然,目前仅限于golang语言。
二、获取nuclei SDK
要将 nuclei 作为库添加到go项目中,可以使用以下命令:
go get -u github.com/projectdiscovery/nuclei/v3/lib
如果有IDE环境的话,也可以直接引用,让IDE自动拉取sdk:
import nuclei "github.com/projectdiscovery/nuclei/v3/lib"
三、编写代码
新建一个main.go文件,首先引用nuclei sdk包
package main
import (
"fmt"
nuclei "github.com/projectdiscovery/nuclei/v3/lib"
"github.com/projectdiscovery/nuclei/v3/pkg/output"
)
声明一个main函数,使用sdk包扫描一个目标:
func main(){
// 创建nuclei引擎对象,设置只扫描http服务漏洞模板
ne, err := nuclei.NewNucleiEngine(
nuclei.WithTemplateFilters(nuclei.TemplateFilters{ProtocolTypes: "http"}),
)
if err != nil {
panic(err)
}
// 设置扫描目标,这里是一个字符串切片,可以同时扫描多个
ne.LoadTargets([]string{"http://example.com"}, false)
// 设置扫描出漏洞的回调函数,用results变量保存漏洞
results := make([]*output.ResultEvent, 0)
WriteCallback := func(event *output.ResultEvent) {
if len(event.Response) > 10240 {
event.Response = event.Response[:10240]
}
results = append(results, event)
}
// 执行扫描
err = ne.ExecuteWithCallback(WriteCallback)
if err != nil {
panic(err)
}
defer ne.Close()
// 打印漏洞个数
fmt.Println(len(results))
}
四、运行样例代码
go run main.go
五、更多设置
nuclei3 sdk提供了丰富的扫描参数设置,例如:
// 设置UA
ne.GetExecuterOptions().Options.CustomHeaders = []string{"User-Agent: test hello"}
// 不缓存
ne.GetExecuterOptions().DoNotCache = true
// 每次扫描前尝试更新官方社区模板库
ne.GetExecuterOptions().Options.UpdateTemplates = true
更多设置请查看手册:
nuclei package - github.com/projectdiscovery/nuclei/v3/lib - Go Packages