contains 在做什么
contains 用来判断字段值里是否包含某段子串或字节序列,适合在不知道完整值的情况下检索内容,例如按域名片段找请求、按路径片段找接口、按关键字找密码或令牌的明文痕迹。它的大小写敏感,需要忽略大小写时改用正则匹配并加上忽略大小写标志。对二进制载荷可以直接写十六进制字节序列,比写字符串更稳,因为很多协议字段本身不是可读文本。
基本信息
| 字符串包含 | http.request.uri contains "/api/v2" |
|---|---|
| 字节序列包含 | tcp contains 47:45:54(对应三个字节) |
| 大小写 | 区分大小写,忽略大小写需用正则加标志 |
| 适用范围 | STRING 与 BYTES 类型字段,以及报文整体 |
| 性能 | 需要对每个报文做字符串扫描,开销高于精确比较 |
典型使用场景
- 按接口路径片段筛请求:定位某个业务模块的调用
- 按域名片段找访问:不记得完整域名时也能检索
- 在明文流量里查找敏感字段:确认是否有人把凭证写在明文里
- 按 User-Agent 片段区分客户端类型,例如区分浏览器与脚本调用
- 在二进制载荷里检索固定协议标识,用于确认封装格式
常用示例
常用示例
http.request.uri contains "/api/v2" # 接口路径片段
http.host contains "internal" # 域名片段
dns.qry.name contains "cdn" # 查询名片段
tcp contains "password" # 明文载荷里找关键字
http.user_agent contains "Go-http-client" # 按客户端标识筛选
frame contains 47:45:54 # 整个报文里找固定字节序列contains 与相邻写法
| 写法 | 匹配方式 | 使用场景 |
|---|---|---|
| contains "abc" | 字段值里包含子串 | 不知道完整值时的模糊检索 |
| contains 41:42:43 | 包含固定字节序列 | 二进制载荷与非文本协议 |
| == "abc" | 完全相等 | 已知完整值时的精确匹配 |
| matches "abc.*" | 正则匹配,可忽略大小写 | 需要模式组合时使用 |
| 字段 contains X && 字段 contains Y | 同时包含两个片段 | 多关键字交叉筛选 |
contains 作用在整条报文上时可以匹配任意位置的字节,包括地址与端口等非文本区域,命中结果可能超出预期,尽量先用协议字段缩小范围再叠加。
contains 需要对每个报文做字符串扫描,大文件上开销明显。先按协议或端口粗筛一次,再叠加包含条件,可以显著缩短等待时间。
组合用法
组合用法
http.host contains "api" && http.response.code >= 500 # 某域名下的 5xx
http.request.uri contains "/login" && tcp.stream == 8 # 定位到具体一条流
dns.qry.name contains "example" && dns.flags.rcode == 3 # 该域名解析失败
http contains "Authorization" && !tls # 明文里出现的鉴权头判读要点
- 命中包含条件只说明出现过该片段,不代表它是协议字段的一部分,看上下文才能定性
- 大小写不匹配是最常见的不命中原因,先在已知报文上验证表达式
- 同一片段出现在请求与响应两侧时,用方向字段区分是哪一侧携带的
- 字节序列写法要与实际编码一致,文本协议的字符与十六进制值需要对照确认