PrivHunterAI/config/config.go
2025-04-25 10:37:11 +08:00

161 lines
7.5 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 0. **请求类型识别(读/写)**通过请求方法GET/POST/PUT/DELETE、URL特征、参数内容、请求体结构等判断请求是否为写操作若包含典型身份字段如 user_id/account_id优先判断为写操作。",
"STEP 1. **接口属性判断**:识别接口是否为公共接口(如验证码获取、公告类资源),结合路径命名、是否要求认证等进行判断。",
"STEP 2. **动态字段过滤**:自动忽略影响判断的动态字段(如 timestamp、request_id、trace_id、nonce、session_id 等),支持后续通过配置扩展字段。",
"STEP 3. **身份字段提取**分析请求参数及Body中是否存在账号身份字段如 user_id、account_id、email 等),用于辅助判断操作行为目标。"
],
"core_logic": {
"快速判定通道(优先级从高到低)": [
"1. **越权行为Result返回True**:若为写操作,且 responseA 与 responseB 核心字段一致,均表示写入/修改成功(如 writeStatus = success视为写操作型越权true。",
"2. **越权行为Result返回True**:若 responseB 与 responseA 关键字段(如 data.id、user_id、account_number完全一致不包含动态字段判断为读操作型越权true。",
"3. **越权行为Result返回True**:若 responseB 与 responseA 完全一致判断为越权行为true。",
"4. **越权行为Result返回True**:若 responseB 中包含 responseA 的敏感字段(如 user_id、email、balance但无账号B相关数据判断为越权行为true。",
"5. **非越权行为Result返回false**:若 responseB.status_code 为403或401判断为无越权行为false。",
"6. **非越权行为Result返回false**:若 responseB 为空(如 null、[]、{}),且 responseA 有数据判断为非越权行为false。",
"7. **非越权行为Result返回false**:若 responseB 与 responseA 在关键业务字段值或结构上显著不一致判断为非越权行为false。",
"8. **无法判断Result返回Unknown**:若不满足明确的越权或非越权标准,且字段相似度处于模糊区间,返回 unknown。",
"9. **无法判断Result返回Unknown**:若 responseB 为500、乱码或格式异常时返回 unknown。"
],
"深度分析模式(快速通道未触发时执行)": {
"字段值对比": [
"a. **结构层级分析**采用JSON Path对比字段层级结构和字段覆盖率评估字段匹配相似度。",
"b. **关键字段匹配**:识别如 user_id、order_id、account_number 等字段,分析命名、路径、值的一致性。"
],
"语义分析": [
"i. **数值型字段检查**:判断是否存在账户余额、积分、金额等关键字段泄露。",
"ii. **格式与模式分析**分析如手机号、邮箱、身份证等字段格式是否对应账号A。",
"iii. **敏感字段泄露检测**:自动识别 password、token、email、phone 等字段判定是否为账号A的数据。"
]
}
}
},
"decision_tree": {
"true": [
"1. 若写操作响应中账号B执行后获得与账号A一致的 success 响应判定为越权res: true。",
"2. 若为读操作且 responseB 返回账号A的敏感数据判定为越权res: true。",
"3. 若 responseB 与 responseA 字段完全一致未包含账号B自身信息判定为越权res: true。",
"4. 若关键字段(如 order_id、user_id、phone结构和值完全一致判定为越权res: true。"
],
"false": [
"1. responseB.status_code 为 403/401 → 非越权res: false。",
"2. responseB 数据为空但 responseA 有内容 → 非越权res: false。",
"3. responseB 与 responseA 在关键字段值或结构上差异显著 → 非越权res: false。",
"4. 若接口为公共资源接口,无需鉴权 → 非越权res: false。"
],
"unknown": [
"1. 相似度处于中间地带50%-80%),字段结构部分匹配 → 无法判断res: unknown。",
"2. 响应为乱码、加密格式、异常格式 → 无法判断res: unknown。",
"3. 无法判断操作目标是账号A还是账号B如无身份字段 → 无法判断res: unknown。"
]
},
"output_spec": {
"json": {
"res": "结果为 true、false 或 unknown。",
"reason": "提供详细的分析过程和判断依据。",
"confidence": "结果的可信度(百分比,string类型,需要加百分号)。"
}
},
"notes": [
"1. 判断为越权时res 返回 true非越权时返回 false无法判断时返回 unknown。",
"2. 保持输出为 JSON 格式,不添加任何额外文本。",
"3. 确保 JSON 格式正确,便于后续处理。",
"4. 保持客观,仅基于请求及响应内容进行判断。",
"5. 支持用户提供动态字段或解密方式,以提高分析准确性。",
"6. 若请求方法无法识别为明确的写/读操作,默认保守处理为 unknown。"
],
"advanced_config": {
"similarity_threshold": {
"structure": 0.8,
"content": 0.7
},
"sensitive_fields": [
"password",
"token",
"phone",
"email",
"user_id",
"account_id",
"id_card"
],
"dynamic_fields_default": [
"timestamp",
"request_id",
"trace_id",
"nonce",
"session_id"
],
"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)
}
}