HaE规则编写完全指南:从基础语法到高级技巧
你是否还在为复杂的渗透测试数据提取而烦恼?是否希望通过自定义规则快速定位关键信息?本文将系统讲解HaE(Highlighter and Extractor)规则的编写方法,从基础语法到高级技巧,帮助你打造高效的信息提取工具。读完本文后,你将能够:掌握规则文件结构、编写基础匹配规则、运用高级正则技巧、实现多场景数据提取,并通过实战案例巩固所学知识。
规则系统核心架构
HaE的规则系统基于组件化设计,主要由规则定义、规则处理器和UI交互三部分构成。核心实现位于src/main/java/hae/component/rule/目录,其中Rule.java负责规则的可视化管理,Rules.java处理规则组的创建与维护,而RuleProcessor.java则实现规则的解析与执行。
规则数据通过YAML格式持久化存储,采用组(Group)和规则(Info)的层级结构。每个规则包含名称、正则表达式、格式化模板等关键属性,这些属性在Info.java中定义为:
- enabled: 规则启用状态
- name: 规则名称
- regex1: 主正则表达式
- regex2: 辅助正则表达式
- format: 结果格式化模板
- color: 高亮颜色
- scope: 匹配范围
- engine: 正则引擎类型
- sensitive: 敏感信息标记
规则文件基础结构
HaE规则文件采用YAML格式,由多个规则组(Group)构成,每个规则组包含一组规则(Info)。典型的规则文件结构如下:
rules:
- name: "API密钥提取"
rules:
- enabled: true
name: "AWS密钥检测"
regex1: "AKIA[0-9A-Z]{16}"
regex2: ""
format: "AWS Access Key: {0}"
color: "FF0000"
scope: "response"
engine: "nfa"
sensitive: true
- enabled: false
name: "JWT令牌提取"
regex1: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+"
regex2: ""
format: "JWT Token: {0}"
color: "00FF00"
scope: "both"
engine: "nfa"
sensitive: true
规则组管理界面如图所示,支持创建、重命名和删除规则组,每个规则组可包含多条规则:
基础语法详解
规则字段说明
每个规则由以下字段组成(字段定义见src/main/java/hae/utils/rule/model/Info.java):
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| enabled | boolean | 是否启用规则 | true |
| name | string | 规则名称,用于标识 | "AWS密钥检测" |
| regex1 | string | 主正则表达式,用于匹配目标内容 | "AKIA[0-9A-Z]{16}" |
| regex2 | string | 辅助正则表达式,用于二次过滤 | "" |
| format | string | 结果格式化模板,使用{0}引用匹配结果 | "AWS Key: {0}" |
| color | string | 高亮颜色,使用RGB十六进制值 | "FF0000" |
| scope | string | 匹配范围,可选request/response/both | "response" |
| engine | string | 正则引擎,支持nfa/dfa | "nfa" |
| sensitive | boolean | 是否标记为敏感信息 | true |
正则表达式基础
HaE支持标准Java正则表达式语法,常用元字符包括:
.匹配任意单个字符*匹配前一个字符0次或多次+匹配前一个字符1次或多次?匹配前一个字符0次或1次[]字符集,匹配其中任意一个字符()分组,用于提取子匹配
基础匹配规则示例:
- 匹配邮箱:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} - 匹配IP地址:
\b(?:\d{1,3}\.){3}\d{1,3}\b
规则创建流程
- 在规则管理界面点击"Add"按钮打开规则编辑对话框
- 填写规则名称和正则表达式
- 设置格式化模板和高亮颜色
- 选择匹配范围和正则引擎
- 勾选是否为敏感信息
- 点击"OK"保存规则
高级技巧与最佳实践
多正则协同匹配
通过regex1和regex2的组合使用,可以实现复杂数据提取。例如,先通过regex1匹配HTML标签,再用regex2提取标签内容:
- enabled: true
name: "HTML标题提取"
regex1: "<title>(.*?)</title>"
regex2: "$1" # 提取第一个分组内容
format: "页面标题: {0}"
color: "0000FF"
scope: "response"
engine: "nfa"
sensitive: false
格式化模板高级用法
format字段支持多分组引用和静态文本组合,例如:
- enabled: true
name: "URL参数提取"
regex1: "(\w+)=(\w+)"
regex2: ""
format: "参数名: {0}, 值: {1}" # 引用两个分组
color: "FFFF00"
scope: "request"
engine: "nfa"
sensitive: false
性能优化策略
- 正则优化:避免贪婪匹配(
.*),使用非贪婪模式(.*?)并限制匹配范围 - 作用域限制:根据需求选择合适的scope(request/response)
- 引擎选择:简单匹配使用dfa引擎,复杂模式使用nfa引擎
- 规则分组:按功能模块组织规则组,便于管理和启用/禁用
敏感信息处理
标记为敏感的规则(sensitive: true)会对匹配结果进行特殊处理,相关实现见src/main/java/hae/utils/rule/RuleProcessor.java的rulesFormatAndSave方法。敏感信息在UI显示时会进行脱敏处理,保护数据安全。
实战案例分析
案例一:API密钥自动提取
需求:从响应中提取AWS、Azure和Google的API密钥,并高亮显示。
实现规则:
- name: "云服务密钥提取"
rules:
- enabled: true
name: "AWS密钥"
regex1: "AKIA[0-9A-Z]{16}"
regex2: ""
format: "AWS Access Key: {0}"
color: "FF0000"
scope: "response"
engine: "dfa"
sensitive: true
- enabled: true
name: "Azure密钥"
regex1: "[a-zA-Z0-9]{40}"
regex2: ""
format: "Azure Key: {0}"
color: "0080FF"
scope: "response"
engine: "dfa"
sensitive: true
- enabled: true
name: "Google密钥"
regex1: "AIzaSy[a-zA-Z0-9_-]{33}"
regex2: ""
format: "Google API Key: {0}"
color: "FFC107"
scope: "response"
engine: "dfa"
sensitive: true
案例二:自定义协议请求解析
需求:解析自定义协议的请求参数,提取命令和参数值。
实现规则:
- name: "自定义协议解析"
rules:
- enabled: true
name: "命令提取"
regex1: "CMD:([A-Z]+)\\|PARAMS:(.*)"
regex2: ""
format: "命令: {0}, 参数: {1}"
color: "00FF00"
scope: "request"
engine: "nfa"
sensitive: false
案例三:多步骤数据清洗
需求:从HTML响应中提取JSON数据,再从中提取用户ID。
实现规则:
- name: "JSON数据提取"
rules:
- enabled: true
name: "JSON提取"
regex1: "<script id='data' type='application/json'>(.*?)</script>"
regex2: ""
format: "原始JSON: {0}"
color: "9C27B0"
scope: "response"
engine: "nfa"
sensitive: false
- enabled: true
name: "用户ID提取"
regex1: "\"user_id\":(\d+)"
regex2: ""
format: "用户ID: {0}"
color: "673AB7"
scope: "response"
engine: "dfa"
sensitive: true
规则调试与故障排除
常见错误及解决方法
-
正则表达式语法错误:检查是否存在未闭合的括号或非法转义字符。使用regex101.com等工具验证正则表达式。
-
匹配结果为空:确认正则表达式与目标内容是否匹配,可通过调整作用域(scope)或增加日志输出排查问题。相关日志功能在src/main/java/hae/utils/rule/RuleProcessor.java中实现。
-
性能问题:复杂正则表达式可能导致HaE运行缓慢。优化建议:
- 使用更具体的正则模式,减少回溯
- 对长文本优先使用dfa引擎
- 拆分复杂规则为多个简单规则
调试工具
HaE提供了内置的规则测试功能,可在规则编辑界面点击"Test"按钮验证正则表达式。测试界面如图所示:
规则分享与社区资源
规则导入导出
HaE规则支持导入导出功能,通过RuleProcessor.java的rulesFormatAndSave方法实现YAML格式的序列化。导出的规则文件可分享给团队成员,或导入到其他HaE实例中使用。
社区规则库
HaE社区维护了常用规则集合,包括:
- Web安全测试规则集
- API接口测试规则集
- 敏感信息提取规则集
- 自定义协议解析规则集
这些规则可通过项目仓库的规则示例目录获取,定期更新以适应新的测试场景。
总结与展望
HaE规则系统为渗透测试人员提供了灵活高效的信息提取工具。通过本文介绍的基础语法和高级技巧,你可以编写出强大的规则来应对各种测试场景。未来HaE将支持更多正则特性和自定义函数,进一步提升规则系统的能力。
鼓励你参与规则库的贡献,分享自己编写的实用规则,共同构建HaE的生态系统。如有任何问题或建议,可通过项目的issues系统反馈。
附录:规则参考手册
正则表达式速查表
| 语法 | 描述 | 示例 |
|---|---|---|
\d | 匹配数字 | \d{3}匹配3位数字 |
\w | 匹配字母、数字或下划线 | \w+匹配单词 |
\s | 匹配空白字符 | \s+匹配一个或多个空白 |
^ | 行首锚点 | ^HTTP匹配以HTTP开头的行 |
$ | 行尾锚点 | \d$匹配以数字结尾的行 |
| | 或操作符 | (jpg|png)匹配jpg或png |
{n} | 恰好匹配n次 | \d{4}匹配4位数字 |
{n,} | 至少匹配n次 | \d{2,}匹配2位以上数字 |
{n,m} | 匹配n到m次 | \d{2,4}匹配2-4位数字 |
颜色代码参考
| 颜色 | 代码 | 用途 |
|---|---|---|
| 红色 | FF0000 | 敏感信息 |
| 绿色 | 00FF00 | 成功匹配 |
| 蓝色 | 0000FF | 一般信息 |
| 黄色 | FFFF00 | 警告信息 |
| 紫色 | 9C27B0 | 特殊数据 |
| 橙色 | FF9800 | 可疑内容 |
规则作用域说明
| 作用域 | 描述 |
|---|---|
| request | 仅匹配请求内容 |
| response | 仅匹配响应内容 |
| both | 匹配请求和响应内容 |
正则引擎对比
| 引擎 | 特点 | 适用场景 |
|---|---|---|
| dfa | 速度快,内存占用低 | 简单匹配、长文本 |
| nfa | 支持更多特性,回溯能力强 | 复杂模式、分组提取 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






