# FOFA 查询语法完整参考

## 目录

- [概述](#概述)
- [基础语法](#基础语法)
- [逻辑连接符](#逻辑连接符)
- [查询类别](#查询类别)
  - [基础类](#基础类)
  - [标记类](#标记类)
  - [协议类](#协议类)
  - [网站类](#网站类)
  - [地理位置类](#地理位置类)
  - [证书类](#证书类)
  - [时间类](#时间类)
  - [独立 IP 语法](#独立-ip-语法)
- [查询示例](#查询示例)
- [最佳实践](#最佳实践)

## 概述

FOFA 查询语法支持通过多种维度对网络空间资产进行检索，包括 IP、域名、端口、协议、证书等。查询结果默认从标题、HTML 内容、HTTP 头信息、URL 字段中搜索。

**基本规则**：
- 直接输入查询语句，将从标题、HTML 内容、HTTP 头信息、URL 字段中搜索
- 如果查询表达式有多个与或关系，尽量在外面用 `()` 包含起来
- 字段名和值之间用运算符连接
- 字符串值需要用引号包裹

## 基础语法

### 运算符

| 运算符 | 含义 | 说明 |
|--------|------|------|
| `=` | 匹配 | `=""` 时可查询不存在字段或值为空的情况 |
| `==` | 完全匹配 | `==""` 时可查询存在且值为空的情况 |
| `!=` | 不匹配 | `!=""` 时可查询值不为空的情况 |
| `*=` | 模糊匹配 | 使用 `*` 或 `?` 进行搜索 |
| `&&` | 与 | 多个条件同时满足 |
| `\|\|` | 或 | 满足任一条件 |
| `()` | 优先级 | 括号内容优先级最高 |

## 查询类别

### 基础类

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `ip` | `ip="1.1.1.1"` | 通过单一 IPv4 地址查询 | `=`, `!=` |
| | `ip="220.181.111.1/24"` | 通过 IPv4 C 段查询 | `=`, `!=` |
| | `ip="2600:9000:..."` | 通过 IPv6 地址查询 | `=`, `!=` |
| `port` | `port="6379"` | 通过端口号查询 | `=`, `!=`, `*=` |
| `domain` | `domain="qq.com"` | 通过根域名查询 | `=`, `!=`, `*=` |
| `host` | `host=".fofa.info"` | 通过主机名查询 | `=`, `!=`, `*=` |
| `os` | `os="centos"` | 通过操作系统查询 | `=`, `!=`, `*=` |
| `server` | `server="Microsoft-IIS/10"` | 通过服务器查询 | `=`, `!=`, `*=` |
| `asn` | `asn="19551"` | 通过自治系统号查询 | `=`, `!=`, `*=` |
| `org` | `org="LLC Baxet"` | 通过所属组织查询 | `=`, `!=`, `*=` |
| `is_domain` | `is_domain=true` | 筛选拥有域名的资产 | `=` |
| `is_ipv6` | `is_ipv6=true` | 筛选是 IPv6 的资产 | `=` |

### 标记类

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `app` | `app="Microsoft-Exchange"` | 通过 FOFA 整理的规则查询 | `=` |
| `fid` | `fid="sSXXGNUO2FefBTcCLIT/2Q=="` | 通过指纹查询 | `=`, `!=` |
| `product` | `product="NGINX"` | 通过产品名查询 | `=`, `!=` |
| `product.version` | `product="Roundcube-Webmail" && product.version="1.6.10"` | 通过产品版本查询 | `=`, `!=` |
| `category` | `category="服务"` | 通过分类查询 | `=`, `!=` |
| `type` | `type="service"` | 筛选协议资产 | `=` |
| `cloud_name` | `cloud_name="Aliyundun"` | 通过云服务商查询 | `=`, `!=`, `*=` |
| `is_cloud` | `is_cloud=true` | 筛选是云服务的资产 | `=` |
| `is_fraud` | `is_fraud=true` | 筛选是仿冒站群的资产 | `=` |
| `is_honeypot` | `is_honeypot=true` | 筛选是蜜罐的资产 | `=` |

### 协议类

适用于 `type="service"` 的资产。

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `protocol` | `protocol="quic"` | 通过协议名称查询 | `=`, `!=`, `*=` |
| `banner` | `banner="users"` | 通过协议返回信息查询 | `=`, `!=` |
| `banner_hash` | `banner_hash="7330105010150477363"` | 通过响应体 hash 查询 | `=`, `!=` |
| `base_protocol` | `base_protocol="udp"` | 查询传输层协议 | `=`, `!=` |

### 网站类

适用于 `type="subdomain"` 的资产。

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `title` | `title="beijing"` | 通过网站标题查询 | `=`, `!=`, `*=` |
| `header` | `header="elastic"` | 通过响应标头查询 | `=`, `!=` |
| `body` | `body="网络空间测绘"` | 通过 HTML 正文查询 | `=`, `!=` |
| `body_hash` | `body_hash="-2090962452"` | 通过正文 hash 查询 | `=`, `!=` |
| `js_name` | `js_name="js/jquery.js"` | 通过包含的 JS 查询 | `=`, `!=`, `*=` |
| `js_md5` | `js_md5="82ac3f14327a8b7ba49baa208d4eaa15"` | 通过 JS 源码查询 | `=`, `!=`, `*=` |
| `cname` | `cname="customers.spektrix.com"` | 通过别名记录查询 | `=`, `!=`, `*=` |
| `icon_hash` | `icon_hash="-247388890"` | 通过图标 hash 查询 | `=`, `!=` |
| `status_code` | `status_code="402"` | 筛选指定状态码 | `=`, `!=` |
| `icp` | `icp="京ICP证030173号"` | 通过 ICP 备案号查询 | `=`, `!=`, `*=` |

### 地理位置类

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `country` | `country="CN"` | 通过国家代码查询 | `=`, `!=` |
| | `country="中国"` | 通过国家中文名查询 | `=`, `!=` |
| `region` | `region="Zhejiang"` | 通过省份/地区英文名查询 | `=`, `!=` |
| | `region="浙江"` | 通过省份中文名查询 | `=`, `!=` |
| `city` | `city="Hangzhou"` | 通过城市英文名查询 | `=`, `!=` |

### 证书类

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `cert` | `cert="baidu"` | 通过证书查询 | `=`, `!=` |
| `cert.subject` | `cert.subject="Oracle Corporation"` | 通过证书持有者查询 | `=`, `!=`, `*=` |
| `cert.issuer` | `cert.issuer="DigiCert"` | 通过证书颁发者查询 | `=`, `!=`, `*=` |
| `cert.subject.cn` | `cert.subject.cn="baidu.com"` | 通过持有者通用名称查询 | `=`, `!=`, `*=` |
| `cert.domain` | `cert.domain="huawei.com"` | 通过持有者根域名查询 | `=`, `!=`, `*=` |
| `cert.is_valid` | `cert.is_valid=true` | 筛选有效证书 | `=` |
| `cert.is_expired` | `cert.is_expired=true` | 筛选已过期证书 | `=` |
| `jarm` | `jarm="2ad2ad0002ad2ad..."` | 通过 JARM 指纹查询 | `=`, `!=`, `*=` |
| `tls.version` | `tls.version="TLS 1.3"` | 通过 TLS 版本查询 | `=`, `!=` |

### 时间类

| 语法 | 示例 | 说明 | 支持运算符 |
|------|------|------|-----------|
| `after` | `after="2023-01-01"` | 筛选某时间后有更新的资产 | `=` |
| `before` | `before="2023-12-01"` | 筛选某时间前有更新的资产 | `=` |
| 组合使用 | `after="2023-01-01" && before="2023-12-01"` | 筛选时间区间内有更新的资产 | `=` |

### 独立 IP 语法

需配合 `ip_filter()` 或 `ip_exclude()` 组合使用（商业版及以上）。

| 语法 | 示例 | 说明 |
|------|------|------|
| `ip_filter()` | `ip_filter(banner="SSH-2.0") && ip_filter(icon_hash="-123")` | 同源 IP 多资产特征匹配 |
| `ip_exclude()` | `ip_filter(banner="SSH-2.0") && ip_exclude(title="EdgeUS")` | 同源 IP 多资产特征不匹配 |
| `port_size` | `port_size="6"` | 筛选开放端口数等于 6 的独立 IP |
| `port_size_gt` | `port_size_gt="6"` | 筛选开放端口数大于 6 的独立 IP |
| `port_size_lt` | `port_size_lt="12"` | 筛选开放端口数小于 12 的独立 IP |
| `ip_ports` | `ip_ports="80,161"` | 筛选同时开放不同端口的独立 IP |

## 查询示例

### 基础查询示例

```bash
# 查询指定 IP
ip="1.1.1.1"

# 查询 C 段
ip="192.168.1.0/24"

# 查询指定端口
port="80"

# 查询指定域名
domain="qq.com"

# 查询指定主机名
host=".fofa.info"
```

### 组合查询示例

```bash
# 查询同时开放 80 和 443 端口的主机
(port="80" && port="443")

# 查询指定国家的 nginx 服务器
server="nginx" && country="CN"

# 查询指定组织的资产
org="Google LLC" && port="443"

# 查询使用特定应用的服务器
app="Apache" && country="US"

# 排除蜜罐
app="WordPress" && is_honeypot=false
```

### 高级查询示例

```bash
# 查询包含特定标题的网站
title="登录" && country="CN"

# 查询使用特定证书的网站
cert.issuer="Let's Encrypt" && cert.is_valid=true

# 查询特定时间范围内更新的资产
after="2024-01-01" && before="2024-12-31" && domain="example.com"

# 查询特定云服务商的资产
cloud_name="Aliyundun" && port="443"

# 查询指定协议的资产
protocol="ssh" && banner="OpenSSH"

# 使用指纹查询
fid="sSXXGNUO2FefBTcCLIT/2Q=="

# 通过图标 hash 查询
icon_hash="-247388890"
```

### 模糊匹配示例

```bash
# 使用通配符模糊匹配
title*="管理后台"
host*=".example.com"
server*="nginx*"

# 使用 ? 匹配单个字符
ip*="192.168.1.?"
```

## 最佳实践

### 1. 查询优化

- **使用精确字段**：优先使用具体字段（如 `ip`, `port`, `domain`）而非全文搜索
- **合理使用括号**：复杂查询使用括号明确优先级
- **控制结果集**：通过 `page` 和 `size` 参数控制返回数量

### 2. 语法建议

- 查询前了解目标资产特征，选择合适的查询字段
- 组合多个条件时，使用 `&&` 提高准确性
- 使用 `!=` 排除干扰结果
- 时间范围查询时，使用 `after` 和 `before` 组合

### 3. 性能提示

- 避免过于宽泛的查询（如单独使用 `port="80"`）
- 使用更具体的条件组合缩小结果集
- 合理设置 `fields` 参数，只返回需要的字段

### 4. 安全注意事项

- 仅用于合法的安全研究和资产发现
- 遵守目标网站的使用条款
- 不要进行恶意扫描或攻击行为
- 保护好自己的 API 凭证，避免泄露

### 5. 常见错误排查

| 错误现象 | 可能原因 | 解决方案 |
|---------|---------|---------|
| 返回空结果 | 查询条件过于严格 | 放宽条件或检查语法 |
| 提示语法错误 | 引号未闭合或括号不匹配 | 检查引号和括号配对 |
| 结果过多 | 查询条件过于宽泛 | 添加更多筛选条件 |
| API 调用失败 | 凭证无效或过期 | 检查 API Key 配置 |

## 返回字段说明

查询时可指定返回的字段，常用字段包括：

| 字段 | 说明 |
|------|------|
| `host` | 主机名 |
| `ip` | IP 地址 |
| `port` | 端口号 |
| `domain` | 域名 |
| `title` | 网站标题 |
| `server` | 服务器类型 |
| `protocol` | 协议类型 |
| `banner` | 协议返回信息 |
| `country` | 国家 |
| `region` | 省份/地区 |
| `city` | 城市 |
| `os` | 操作系统 |
| `icp` | ICP 备案号 |
| `lastupdatetime` | 最后更新时间 |

完整字段列表请参考 FOFA 官方文档。
