2021-02-08 15:11:43 +08:00
|
|
|
package WebScan
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/md5"
|
|
|
|
"fmt"
|
2024-12-18 22:00:18 +08:00
|
|
|
"github.com/shadow1ng/fscan/Common"
|
2021-02-08 15:11:43 +08:00
|
|
|
"github.com/shadow1ng/fscan/WebScan/info"
|
|
|
|
"regexp"
|
|
|
|
)
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// CheckDatas 存储HTTP响应的检查数据
|
2021-02-08 15:11:43 +08:00
|
|
|
type CheckDatas struct {
|
2024-12-19 14:49:45 +08:00
|
|
|
Body []byte // 响应体
|
|
|
|
Headers string // 响应头
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// InfoCheck 检查URL的指纹信息
|
2022-02-17 14:37:06 +08:00
|
|
|
func InfoCheck(Url string, CheckData *[]CheckDatas) []string {
|
2024-12-19 14:49:45 +08:00
|
|
|
var matchedInfos []string
|
2021-02-08 15:11:43 +08:00
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// 遍历检查数据
|
2022-02-17 14:37:06 +08:00
|
|
|
for _, data := range *CheckData {
|
2024-12-19 14:49:45 +08:00
|
|
|
// 规则匹配检查
|
2021-02-08 15:11:43 +08:00
|
|
|
for _, rule := range info.RuleDatas {
|
2024-12-19 14:49:45 +08:00
|
|
|
var matched bool
|
|
|
|
var err error
|
|
|
|
|
|
|
|
// 根据规则类型选择匹配内容
|
|
|
|
switch rule.Type {
|
|
|
|
case "code":
|
|
|
|
matched, err = regexp.MatchString(rule.Rule, string(data.Body))
|
|
|
|
default:
|
|
|
|
matched, err = regexp.MatchString(rule.Rule, data.Headers)
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
2024-12-19 14:49:45 +08:00
|
|
|
|
|
|
|
// 处理匹配错误
|
|
|
|
if err != nil {
|
|
|
|
Common.LogError(fmt.Sprintf("规则匹配错误 [%s]: %v", rule.Name, err))
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// 添加匹配成功的规则名
|
|
|
|
if matched {
|
|
|
|
matchedInfos = append(matchedInfos, rule.Name)
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// MD5匹配检查暂时注释
|
|
|
|
/*
|
|
|
|
if flag, name := CalcMd5(data.Body); flag {
|
|
|
|
matchedInfos = append(matchedInfos, name)
|
|
|
|
}
|
|
|
|
*/
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// 去重处理
|
|
|
|
matchedInfos = removeDuplicateElement(matchedInfos)
|
2021-02-08 15:11:43 +08:00
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// 输出结果
|
|
|
|
if len(matchedInfos) > 0 {
|
2025-01-01 07:18:36 +08:00
|
|
|
result := fmt.Sprintf("发现指纹 目标: %-25v 指纹: %s", Url, matchedInfos)
|
2025-05-12 21:59:16 +08:00
|
|
|
Common.LogInfo(result)
|
2024-12-19 14:49:45 +08:00
|
|
|
return matchedInfos
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
2024-12-19 14:49:45 +08:00
|
|
|
|
2025-04-05 17:44:52 +08:00
|
|
|
return []string{}
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// CalcMd5 计算内容的MD5并与指纹库比对
|
2021-02-08 15:11:43 +08:00
|
|
|
func CalcMd5(Body []byte) (bool, string) {
|
2024-12-19 14:49:45 +08:00
|
|
|
contentMd5 := fmt.Sprintf("%x", md5.Sum(Body))
|
|
|
|
|
|
|
|
// 比对MD5指纹库
|
|
|
|
for _, md5Info := range info.Md5Datas {
|
|
|
|
if contentMd5 == md5Info.Md5Str {
|
|
|
|
return true, md5Info.Name
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
}
|
2024-12-19 14:49:45 +08:00
|
|
|
|
2021-02-08 15:11:43 +08:00
|
|
|
return false, ""
|
|
|
|
}
|
|
|
|
|
2024-12-19 14:49:45 +08:00
|
|
|
// removeDuplicateElement 移除切片中的重复元素
|
|
|
|
func removeDuplicateElement(items []string) []string {
|
|
|
|
// 预分配空间
|
|
|
|
result := make([]string, 0, len(items))
|
|
|
|
seen := make(map[string]struct{}, len(items))
|
|
|
|
|
|
|
|
// 使用map去重
|
|
|
|
for _, item := range items {
|
|
|
|
if _, exists := seen[item]; !exists {
|
|
|
|
seen[item] = struct{}{}
|
2021-06-17 20:32:53 +08:00
|
|
|
result = append(result, item)
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|
|
|
|
}
|
2024-12-19 14:49:45 +08:00
|
|
|
|
2021-06-17 20:32:53 +08:00
|
|
|
return result
|
2021-02-08 15:11:43 +08:00
|
|
|
}
|