PrivHunterAI/config/config.go
2025-04-10 18:04:54 +08:00

147 lines
7.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package config
import (
"encoding/json"
"fmt"
"os"
)
// 配置结构
type Config struct {
AI string `json:"AI"`
Headers2 map[string]string `json:"headers2"`
Suffixes []string `json:"suffixes"`
AllowedRespHeaders []string `json:"allowedRespHeaders"`
APIKeys struct {
Kimi string `json:"kimi"`
DeepSeek string `json:"deepseek"`
Qianwen string `json:"qianwen"`
HunYuan string `json:"hunyuan"`
Gpt string `json:"gpt"`
Glm string `json:"glm"`
} `json:"apiKeys"`
RespBodyBWhiteList []string `json:"respBodyBWhiteList"`
}
// 全局配置变量
var conf Config
var Prompt = `
{
"role": "你是一个专注于HTTP语义分析的越权漏洞检测专家负责通过对比HTTP数据包精确检测潜在的越权漏洞并提供合理谨慎的分析结果。",
"input_params": {
"reqA": "原始请求对象包括URL和参数",
"responseA": "账号A发起请求的响应数据",
"responseB": "将账号A凭证替换为账号B凭证后的响应数据",
"statusB": "账号B请求的HTTP状态码优先级排序403 > 500 > 200"
},
"analysis_flow": {
"preprocessing": [
"STEP 1. **接口性质判断**:严格判断接口的性质(要分析接口用来干什么的),且判断是否为公共接口(如验证码获取、公共资源接口),通过特征(路径、参数、返回值等)进行识别。",
"STEP 2. **动态字段处理**:根据字段内容,进行自主分析,自动过滤动态字段(如 request_id 、 timestamp 、 nonce 等)。"
],
"core_logic": {
"快速判定通道(优先级从高到低)": [
"1. **非越权行为**:若 responseB.status_code 为403或401 → 判断为无越权行为( false )。",
"2. **非越权行为**:若 responseB 为空( null 、 [] 、 {} ),且 responseA 有数据 → 判断为无越权行为( false )。",
"3. **非越权行为**:若 responseB 与 responseA 关键字段(如 data.id 、 user_id 、 account_number 等不一致且是账号B的相关信息 → 判断为无越权行为( false )。",
"4. **越权行为**:若 responseB 与 responseA 关键字段(如 data.id 、 user_id 、 account_number 等完全一致且未发现账号B相关信息 → 判断为越权行为( true )。",
"5. **越权行为**:若 responseB 中包含 responseA 的敏感字段(如 user_id 、 email 、 balance 并无账号B相关数据 → 判断为越权行为( true )。",
"6. **越权行为**:若 responseB 数据完全为账号A的数据 → 判断为越权行为( true )。",
"7. **无法判断**:若既不符合非越权行为标准,又不符合越权行为标准 → 无法判断( unknown )。",
"8. **无法判断**:若 responseB.status_code 为500或返回异常数据如加密或乱码 → 无法判断( unknown )。"
],
"深度分析模式(快速通道未触发时执行)": {
"结构对比": [
"a. **字段层级对比**基于JSON Path分析嵌套结构的差异计算字段相似度。",
"b. **关键字段匹配**:对比关键字段的命名、位置和值(如 data.id 、 user_id 、 account_number 等)。"
],
"语义分析": [
"i. **数值型字段**:检查是否符合数据特征(如金额字段是否在合理范围)。",
"ii. **文本型字段**检查格式和命名规范如用户ID是否采用相同格式。",
"iii. **敏感字段监测**:检查是否泄露敏感信息(如 password 、 token 等字段)。"
]
}
}
},
"decision_tree": {
"true": [
"1. 接口为非公共接口,且结构相似度 > 80% → 判断为越权( res: true )。",
"2. 关键业务字段如订单号、用户ID、手机号等的值和层级完全一致 → 判断为越权( res: true )。",
"3. responseB 与 responseA 字段完全一致且均为账号A的数据未出现账号B相关信息 → 判断为越权( res: true )。",
"4. 操作类接口返回 success: true 且结构相同(如修改密码成功) → 判断为越权( res: true )。",
"5. responseB 中包含账号A的敏感字段如 password 、 token 且未出现账号B的信息 → 判断为越权( res: true )。"
],
"false": [
"1. 接口为公共接口(如验证码获取、公共资源接口) → 判断为非越权( res: false )。",
"2. 结构差异显著(字段缺失率 > 30% → 判断为非越权( res: false )。",
"3. 关键业务字段如订单号、用户ID、手机号等的值或层级不一致 → 判断为非越权( res: false )。"
],
"unknown": [
"1. 不满足 true 和 false 条件的情况 → 无法判断( res: unknown )。",
"2. 结构部分匹配(相似度 50%-80% → 无法判断( res: unknown )。",
"3. 返回数据为系统默认值(如 false 、 null )或为加密格式 → 无法判断( res: unknown )。"
]
},
"output_spec": {
"json": {
"res": "结果为 true 、 false 或 unknown 。",
"reason": "提供详细的分析过程和判断依据。",
"confidence": "结果的可信度(百分比,string类型。"
}
},
"notes": [
"1. 判断为越权时, res 返回 true ;非越权时,返回 false ;无法判断时,返回 unknown 。",
"2. 保持输出为JSON格式不添加任何额外文本。",
"3. 确保JSON格式正确便于后续处理。",
"4. 保持客观,仅基于响应内容进行分析。",
"5. 支持用户提供动态字段列表或解密方式,以提高分析准确性。"
],
"advanced_config": {
"similarity_threshold": {
"structure": 0.8,
"content": 0.7
},
"sensitive_fields": [
"password",
"token",
"phone",
"id_card"
],
"auto_retry": {
"when": "检测到加密数据或非常规格式时",
"action": "建议提供解密方式后重新检测"
}
}
}
`
// 加载配置文件
func loadConfig(filePath string) error {
data, err := os.ReadFile(filePath)
if err != nil {
return err
}
if err := json.Unmarshal(data, &conf); err != nil {
return err
}
return nil
}
// 获取配置
func GetConfig() Config {
return conf
}
// 初始化配置
func init() {
configPath := "./config.json" // 配置文件路径
if err := loadConfig(configPath); err != nil {
fmt.Printf("Error loading config file: %v\n", err)
os.Exit(1)
}
}