name: fofa-query-syntax description: 生成、改写并校验 FOFA 查询语句。用于用户提到 FOFA、资产测绘、语法速查、查询语句编写、语句纠错、条件组合优化时。
FOFA Query Syntax
使用范围
- 仅允许使用该文件中存在的字段(
key)。 - 当用户要求“写 FOFA 语句 / 改写语句 / 检查语法 / 给出等价查询”时,优先应用本 Skill。
语法基线
- 基础条件写法:
field="value"。 - 取反条件写法:
field!="value"(仅当字段支持not_equal)。 - 条件连接:使用
&&/||进行组合。 - 布尔字段按示例使用:如
is_domain=true。 - 时间字段值格式:
YYYY-MM-DD。 - 同源 IP 函数字段按示例调用:
ip_filter(...)、ip_exclude(...)。
运算符能力规则(必须遵守)
按约束使用运算符:
equal + not_equal + fuzzy_search(可用=、!=、模糊)
port, domain, host, os, server, asn, org, cloud_name, protocol, title, header_hash, js_name, js_md5, cname, cname_domain, icp, cert.subject, cert.issuer, cert.subject.org, cert.subject.cn, cert.issuer.org, cert.issuer.cn, cert.domain, jarm, tls.ja3sequal + not_equal(可用=、!=)
ip, fid, product, product.version, category, banner, banner_hash, banner_fid, base_protocol, header, body, body_hash, icon_hash, status_code, sdk_hash, country, region, city, cert, tls.version, cert.sn, port_sizeequal only(仅可=)
is_domain, is_ipv6, app, type, is_cloud, is_fraud, is_honeypot, cert.is_equal, cert.is_valid, cert.is_match, cert.is_expired, cert.not_after.after, cert.not_after.before, cert.not_before.after, cert.not_before.before, after, before, after&before, ip_filter(), ip_exclude(), port_size_gt, port_size_lt, ip_ports, ip_country, ip_region, ip_city, ip_after, ip_before
如果用户给了不被支持的写法(例如对 equal only 字段使用 !=),必须改写为合法表达式并说明改写原因。
字段分组速查(按 category.group)
group 0资产基础
ip, port, domain, host, os, server, asn, org, is_domain, is_ipv6group 1应用与资产分类
app, fid, product, product.version, category, type, cloud_name, is_cloud, is_fraud, is_honeypotgroup 2协议与横幅
protocol, banner, banner_hash, banner_fid, base_protocolgroup 3Web 内容与页面特征
title, header, header_hash, body, body_hash, js_name, js_md5, cname, cname_domain, icon_hash, status_code, icp, sdk_hashgroup 4地理信息
country, region, citygroup 5证书信息
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, tls.version, tls.ja3s, cert.sn, cert.not_after.after, cert.not_after.before, cert.not_before.after, cert.not_before.beforegroup 6时间筛选
after, before, after&beforegroup 7同源 IP 与独立 IP 聚合
ip_filter(), ip_exclude(), port_size, port_size_gt, port_size_lt, ip_ports, ip_country, ip_region, ip_city, ip_after, ip_before
权限提醒规则
若命中以下字段,输出时追加版本提示:
(个人版及以上)
banner_hash, banner_fid, header_hash, cert.is_equal, cert.is_valid, cert.is_match, cert.is_expired, after, before(专业版及以上)
is_fraud, is_honeypot(商业版及以上)
sdk_hash, ip_filter(), ip_exclude(), port_size, port_size_gt, port_size_lt, ip_ports, ip_country, ip_region, ip_city, ip_after, ip_before
助手工作流(生成/改写/校验)
按以下顺序执行,不跳步:
- 明确目标
- 提取用户目标(找什么资产、在什么范围、排除什么)。
- 映射字段
- 从分组速查选择字段,优先语义最直接字段。
- 选择运算符
- 严格按“运算符能力规则”选择
=/!=/ 模糊。
- 严格按“运算符能力规则”选择
- 组装语句
- 先给 1 条主查询,再给 1-2 条等价改写(更宽/更窄)。
- 语法自检
- 检查未知字段、非法运算符、明显冲突(如同字段互斥值)。
- 输出说明
- 简述每个条件含义;有权限字段时附版本提醒。
信息不充分时的处理
- 若用户目标缺少关键维度(目标类型/地理范围/时间范围/排除条件),先补问 1-2 个关键问题再生成。
- 若用户明确要求“直接给查询”,可先给一版可执行语句,并标注默认假设。
- 默认假设优先级:
- 默认使用
=写法,不擅自使用!=。 - 默认不加时间范围,除非用户明确要求“最近/历史”。
- 默认不使用付费字段,除非用户主动要求或场景强依赖。
- 默认使用
自然语言到字段映射规则
- “独立 IP / 同 IP 多端口 / 旁站”优先映射
group 7:ip_filter(),ip_exclude(),port_size*,ip_ports。 - “网站标题/正文/响应头/图标”优先映射
group 3:title,body,header,icon_hash等。 - “证书主体/签发者/证书有效性/过期”优先映射
group 5:cert.*。 - “资产更新时间范围”优先映射
group 6:after,before(优先,不建议使用after&before)。 - “国家/省份/城市”优先使用:
- 一般资产:
country,region,city - 独立 IP 聚合:
ip_country,ip_region,ip_city
- 一般资产:
冲突与风险检测清单
在“语法检查”中至少检查以下项:
- 字段拼写冲突:如
product_version(应为product.version)。 - 运算符冲突:
equal only字段误用!=。 - 类型冲突:布尔字段写成字符串(
"true")。 - 时间冲突:
after晚于before。 - 语义冲突:同字段在同一逻辑分支出现互斥条件(如
is_ipv6=true && is_ipv6=false)。 - 权限风险:命中付费字段但未提醒版本门槛。
输出质量标准
- 至少返回 1 条“主查询”+ 1 条“等价改写”。
- 解释每个条件的筛选意图,不只给语句本身。
- 改写版本应体现“更宽”或“更窄”的差异,而不是仅改写排版。
- 发生纠错时,必须同时给“原写法 -> 修正写法 -> 修正原因”。
输出模板
主查询:
<query>
等价改写:
1) <query_variant_1>
2) <query_variant_2>
语法检查:
- 字段合法性:通过/不通过(原因)
- 运算符合法性:通过/不通过(原因)
- 条件冲突:无/有(说明)
说明:
- 条件解释...
- 版本权限提醒(如有)...
代表性示例
- 基础网络资产
ip="1.1.1.1"port="6379"domain="qq.com"
- Web 指纹与内容
title="beijing" && body="网络空间测绘"header_hash="1258854265" && icon_hash="-247388890"
- 证书场景
cert.subject="Oracle Corporation" && cert.is_valid=truecert.not_after.before="2025-03-01"
- 时间场景
after="2023-01-01" && before="2023-12-01"
- 同源 IP 场景
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")
纠错规则
- 未知字段:提示“字段不存在,并给最接近候选字段。
- 运算符不合法:改写为支持形式(如
!=改为=并调整逻辑)。 - 布尔值误写为字符串:改为
true/false(不加引号)。 - 时间格式错误:改为
YYYY-MM-DD。 after&before标记为不推荐:优先改写为after="..." && before="..."。
纠错输出格式(固定)
发现问题:
1) <原写法>
修正建议:
1) <修正写法>
原因:
- <对应 grammar 能力限制或字段定义>
约束
- 不虚构字段和能力。
- 不假设未声明的函数或语法糖。
- 如果需求超出 FOFA 字段能力,明确指出限制并给可执行近似方案。
参考资料
- 完整字段目录、能力矩阵、权限门槛见 reference.md。