基于 Json 、自定义Go脚本、fofa的快速验证扫描引擎,可用于快速验证目标是否存在该漏洞。
注意:Json模式后续不再维护,因为扩展性太差,请使用 代码模式
使用场景:
本工具仅面向合法授权的企业安全建设行为,如您需要测试本工具的可用性,请自行搭建靶机环境。
为避免被恶意使用,本项目不提供任何poc,不存在漏洞利用过程,不会对目标发起真实攻击和漏洞利用。
在使用本工具进行检测时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿对非授权目标进行扫描。
如您在使用本工具的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。
在安装并使用本工具前,请您务必审慎阅读、充分理解各条款内容,限制、免责条款或者其他涉及您重大权益的条款可能会以加粗、加下划线等形式提示您重点注意。 除非您已充分阅读、完全理解并接受本协议所有条款,否则,请您不要安装并使用本工具。您的使用行为或者您以其他任何明示或者默示方式表示接受本协议的,即视为您已阅读并同意本协议的约束。
-email // fofa的email (必须)
-key // fofa的key (必须)
-vul // poc/exp文件,文件后缀为.go (必须)
-mod // 指定poc/exp这两种模式 (必须)
-proxy // burpsuite 代理,用于方便写poc/exp (必须)
-coroutine // 最大并发量,越大扫描速度越快,取决于你CPU性能 (非必须,不填默认为200)
-maxFofaSize // fofa最大检索数 (必须)
-detectionMode // 是否开启探测模式,若开启则先发送一个包,根据响应包匹配指纹
-builtinFingerprint // 为 true 时不使用用户输入的语句,而是使用 GoPoc 内置的指纹库去跑 [优点是内置指纹庞大,有7k条,缺点是扫描速度直线下降,因为要对庞大指纹库进行匹配]
------------------------------------
例如
-email
xxxxxxxxxxx@gamil.com
-key
fdgdfhfgdhdfgdhfghfdg
-vul
D:\Coding\Github\GoPoc\main\User\test.go
-mod
poc
-proxy
http://127.0.0.1:8082
-coroutine
3
-maxFofaSize
300
-detectionMode
false
-builtinFingerprint
true
利用模式:
Json 模式:被废弃,但保留对应源码
go 模式
在 main\User 文件夹下新建一个 文件名.go 文件,然后 config 文件指定该 go 文件即可,go 文件的内容如下[只做样例说明,真正的文件请看 dvwaSqlScan.go 文件]:
```go package User
import ( "GoPoc/main/Developer/AllFormat" "GoPoc/main/Developer/HttpAbout" "GoPoc/main/User/Utils" "net/http" "strings" )
var Json string var Poc func(hostInfo string, client http.Client) bool var Exp func(expResult Format.ExpResult, client http.Client) Format.ExpResult
// Poc 编写,以 dvwa 靶场的sql注入为例 func init() { // 有代码使用代码,无代码使用json // 如果存在代码,可以不写Json格式(即Json格式有架构,但内容为空).但必须存在 fofa语句 // 此处的json只是说明json的使用方式,与代码模式并无关联 Json = `{ // 值非必须,如果值为false则不进行代理检测,适用于内部或工作使用的脚本,默认进行代理检测,防止粗心导致喝茶 "CheckIP":"true", // 值非必须,如果有值则使用这个协程数,否则使用全局协程数,全局协程数不写也行,默认使用200 "Coroutine":"10", // 值非必须,如果有值则不使用fofa查询,而直接访问该File对应的文件,比如url.txt "File":"", // 值非必须,如果有值则不使用fofa查询,而直接访问该Url,比如 http://www.baidu.com ,要带http://或https:// "Url":"https://www.baidu.com", // 必须,表明想要查找的fofa语句. "Fofa":"body=\"Login :: Damn Vulnerable Web Application\"", "Uri" : "/dvwa/" // 这个uri指的是探测模式是所要访问的uri // 请求包 "Request":{ // 请求方法 "Method": "GET", // 请求路径,这里分别请求两个uri "Uri": [ "/robots.txt", "/hello.txt" ], // 自定义 header 头 "Header":{ "Accept-Encoding":"gzip" } }, // 响应包 "Response":{ // 定义多个Group之间的关系,有AND和OR这两种,其中AND是都满足漏洞才存在,OR是其中一个条件满足即可. "Operation":"OR", // 判断条件 "Group":[ // 条件1 { // 支持正则表达式 "Regexp": ".*?", "Header":{ // 状态码 "Status": "200" }, // response Body ,同样是支持多个Body,当都符合时为True "Body":[ "Hello World", "wahaha" ] }, // 条件2 { "Header":{ // 状态码 "Status": "200" } } ]
} }`
getSessionByLogin := func(hostInfo string) (string, error) {
// 发起登录请求 --> 302跳转 --> 获取请求包中的session , 并返回
config := HttpAbout.NewHttpConfig()
config.Uri = "/dvwa/"
resp, err := HttpAbout.SendHttpRequest(hostInfo, config)
if err != nil {
return "", err
}
config.Header["Cookie"] = resp.Header["Set-Cookie"][0]
config.Body = "username=admin&password=password&Login=Login&user_token=" + Utils.RandomStringByModule(24, 1)
config.Uri = "/dvwa/login.php"
resp, err = HttpAbout.SendHttpRequest(hostInfo, config)
if err != nil {
return "", err
}
if !strings.Contains(resp.Body, "Welcome :: Damn Vulnerable Web ") {
return "", err
}
return resp.Header["Set-Cookie"][0], nil
}
// 建议: 函数名+随机命名
sendLoginByToken455445 := func(hostInfo string) (Format.CustomResponseFormat, error) {
var err error
var customResponse Format.CustomResponseFormat
config := HttpAbout.NewHttpConfig()
config.Header["Cookie"], err = getSessionByLogin(hostInfo) // (非强制) 自定义Header头
if err != nil {
return customResponse, nil
}
config.Header["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
config.Header["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0" // (非强制) 如果不写的话随机从默认URL列表上选取一个
config.TimeOut = 5 // (非强制) 如果不写的话默认值为 5秒
config.Method = "GET" // (非强制) 如果不写的话默认值为 GET方式
//config.Body = `123` // (非强制) 如果不写的话默认值为 ""
config.Uri = "/dvwa/index.php" // (非强制) 如果不写的话默认值为 ""
config.IsRedirect = true // (非强制) 如果不写的话默认值为 false,即返回的响应包数据为重定向前的响应包
return HttpAbout.SendHttpRequest(hostInfo, config)
}
// 建议: 函数名+随机命名
sendSqlPayload5251552 := func(hostInfo string) (Format.CustomResponseFormat, error) {
config := HttpAbout.NewHttpConfig()
config.Header["Cookie"] = "security=low; PHPSESSID=1abcbe73869e90560e9061ca636c813e"
config.Uri = "/dvwa/vulnerabilities/sqli/?id=%27&Submit=Submit#"
return HttpAbout.SendHttpRequest(hostInfo, config)
}
// 如果使用代码模式, Poc函数为必须,其中的参数固定
Poc = func(hostInfo string) bool {
resp, err := sendLoginByToken455445(hostInfo)
if err != nil {
return false
}
if !strings.Contains(resp.Body, "Welcome to Damn") {
return false
}
resp, err = sendSqlPayload5251552(hostInfo)
return err == nil && strings.Contains(resp.Body, "You have an error in your SQL syntax;")
}
// 如果使用代码模式, Exp函数为必须,其中的参数固定
// Exp 你可以尝试自己写一下:
Exp = func(expResult Format.ExpResult) Format.ExpResult {
return expResult
}
}
```
md
1. 使用go模式时必须存在 Poc/Exp 函数
2. 如果存在代码,可以不写Json格式(即Json格式有架构,但内容为空).但必须存在 fofa语句

1. 基于 fofa 规则匹配对应产品,匹配成功后才开始使用POC,避免发送无用包
2. POC 易编写,只需要会看http响应包和http回显包即可
$ claude mcp add GoPoc \
-- python -m otcore.mcp_server <graph>