diff --git a/internal/handler/fofa.go b/internal/handler/fofa.go index e203429b..1b8d1db4 100644 --- a/internal/handler/fofa.go +++ b/internal/handler/fofa.go @@ -147,9 +147,13 @@ func (h *FofaHandler) ParseNaturalLanguage(c *gin.Context) { "explanation": "string,可选,解释你如何映射字段/逻辑", "warnings": ["string"...] 可选,列出歧义/风险/需要人工确认的点 } +3) 如果用户输入本身已经是 FOFA 查询语法(或非常接近 FOFA 语法的表达式),应当“原样返回”为 query: + - 不要擅自改写字段名、操作符、括号结构 + - 不要改写任何字符串值(尤其是地理位置类值),不要做缩写/同义词替换/翻译/音译 查询语法要点(来自 FOFA 语法参考): - 逻辑连接符:&&(与)、||(或),必要时用 () 包住子表达式以确认优先级(括号优先级最高) +- 当同一层级同时出现 && 与 ||(混用)时,用 () 明确优先级(避免歧义) - 比较/匹配: - = 匹配;当字段="" 时,可查询“不存在该字段”或“值为空”的情况 - == 完全匹配;当字段=="" 时,可查询“字段存在且值为空”的情况 @@ -157,17 +161,100 @@ func (h *FofaHandler) ParseNaturalLanguage(c *gin.Context) { - *= 模糊匹配;可使用 * 或 ? 进行搜索 - 直接输入关键词(不带字段)会在标题、HTML内容、HTTP头、URL字段中搜索;但当意图明确时优先用字段表达(更可控、更准确) -常用字段速查(来自截图的分类示例,按需使用): -- 基础类(General):ip、port、domain、host、os、server、asn、org、is_domain、is_ipv6 -- 标记类(Special Label):app、fid、product、product.version -- 其它筛选:category、type(常见:type="service" / type="subdomain")、cloud_name、is_cloud、is_fraud、is_honeypot -- 网站类(type=subdomain):title、header、header_hash、body、body_hash、js_name、js_md5、cname、cname_domain、icon_hash、status_code、icp、sdk_hash -- 地理位置(Location):country、region、city -- 证书类(Certificate):cert、cert.subject、cert.issuer、cert.subject.org、cert.subject.cn、cert.issuer.org、cert.issuer.cn、cert.domain、 - cert.is_equal、cert.is_valid、cert.is_match、cert.is_expired、jarm +字段示例速查(来自用户提供的案例,可直接套用/拼接): +- 高级搜索操作符示例: + - title="beijing" (= 匹配) + - title=="" (== 完全匹配,字段存在且值为空) + - title="" (= 匹配,可能表示字段不存在或值为空) + - title!="" (!= 不匹配,可用于值不为空) + - title*="*Home*" (*= 模糊匹配,用 * 或 ?) + - (app="Apache" || app="Nginx") && country="CN" (混用 && / || 时用括号) +- 基础类(General): + - ip="1.1.1.1" + - ip="220.181.111.1/24" + - ip="2600:9000:202a:2600:18:4ab7:f600:93a1" + - port="6379" + - domain="qq.com" + - host=".fofa.info" + - os="centos" + - server="Microsoft-IIS/10" + - asn="19551" + - org="LLC Baxet" + - is_domain=true / is_domain=false + - is_ipv6=true / is_ipv6=false +- 标记类(Special Label): + - app="Microsoft-Exchange" + - fid="sSXXGNUO2FefBTcCLIT/2Q==" + - product="NGINX" + - product="Roundcube-Webmail" && product.version="1.6.10" + - category="服务" + - type="service" / type="subdomain" + - cloud_name="Aliyundun" + - is_cloud=true / is_cloud=false + - is_fraud=true / is_fraud=false + - is_honeypot=true / is_honeypot=false +- 协议类(type=service): + - protocol="quic" + - banner="users" + - banner_hash="7330105010150477363" + - banner_fid="zRpqmn0FXQRjZpH8MjMX55zpMy9SgsW8" + - base_protocol="udp" / base_protocol="tcp" +- 网站类(type=subdomain): + - title="beijing" + - header="elastic" + - header_hash="1258854265" + - body="网络空间测绘" + - body_hash="-2090962452" + - js_name="js/jquery.js" + - js_md5="82ac3f14327a8b7ba49baa208d4eaa15" + - cname="customers.spektrix.com" + - cname_domain="siteforce.com" + - icon_hash="-247388890" + - status_code="402" + - icp="京ICP证030173号" + - sdk_hash="Are3qNnP2Eqn7q5kAoUO3l+w3mgVIytO" +- 地理位置(Location): + - country="CN" 或 country="中国" + - region="Zhejiang" 或 region="浙江"(仅支持中国地区中文) + - city="Hangzhou" +- 证书类(Certificate): + - cert="baidu" + - cert.subject="Oracle Corporation" + - cert.issuer="DigiCert" + - cert.subject.org="Oracle Corporation" + - cert.subject.cn="baidu.com" + - cert.issuer.org="cPanel, Inc." + - cert.issuer.cn="Synology Inc. CA" + - cert.domain="huawei.com" + - cert.is_equal=true / cert.is_equal=false + - cert.is_valid=true / cert.is_valid=false + - cert.is_match=true / cert.is_match=false + - cert.is_expired=true / cert.is_expired=false + - jarm="2ad2ad0002ad2ad22c2ad2ad2ad2ad2eac92ec34bcc0cf7520e97547f83e81" + - tls.version="TLS 1.3" + - tls.ja3s="15af977ce25de452b96affa2addb1036" + - cert.sn="356078156165546797850343536942784588840297" + - cert.not_after.after="2025-03-01" / cert.not_after.before="2025-03-01" + - cert.not_before.after="2025-03-01" / cert.not_before.before="2025-03-01" +- 时间类(Last update time): + - after="2023-01-01" + - before="2023-12-01" + - after="2023-01-01" && before="2023-12-01" +- 独立IP语法(需配合 ip_filter / ip_exclude): + - ip_filter(banner="SSH-2.0-OpenSSH_6.7p2") && ip_filter(icon_hash="-1057022626") + - ip_filter(banner="SSH-2.0-OpenSSH_6.7p2" && asn="3462") && ip_exclude(title="EdgeOS") + - port_size="6" / port_size_gt="6" / port_size_lt="12" + - ip_ports="80,161" + - ip_country="CN" + - ip_region="Zhejiang" + - ip_city="Hangzhou" + - ip_after="2021-03-18" + - ip_before="2019-09-09" -生成规则(务必遵守): +生成约束与注意事项: - 字符串值一律用英文双引号包裹,例如 title="登录"、country="CN" +- 字符串值保持字面一致:不要缩写(例如 city="beijing" 不要变成 city="BJ"),不要用别名(例如 Beijing/Peking),不要擅自翻译/音译/改写大小写 +- 地理位置字段(country/region/city)更倾向于“按用户给定值输出”;不确定合法取值时,不要猜测,把备选写进 warnings - 不要捏造不存在的 FOFA 字段;不确定时把不确定点写进 warnings,并输出一个保守的 query - 当用户描述里有“多个与/或条件”,优先加 () 明确优先级,例如:(app="Apache" || app="Nginx") && country="CN" - 当用户缺少关键条件导致范围过大或歧义(如地点/协议/端口/服务类型未说明),允许 query 为空字符串,并在 warnings 里明确需要补充的信息