文章总结: 本文介绍了一款自研漏洞扫描框架Veil,旨在解决Nuclei在YAML格式繁琐、版本比较困难及OOB联动不灵活等痛点。Veil采用自定义DSL语法,支持原生版本比较、多平台OOB自动切换及多种攻击模式。其具备强大的变量系统与三维限速控制,虽POC生态尚在建设中,但显著降低了模板编写心智负担,提升了漏洞检测效率与灵活性。 综合评分: 88 文章分类: 安全工具,漏洞POC,渗透测试,安全开发
语法定义的新时代,告别 yaml模板的束缚__Veil
原创
老谢 老谢
H4ll0 H4ck3r
2026年3月9日 22:54 广东 标题已修改
前言
Nuclei 很好用也很强大,这一点毋庸置疑。
但用久了你会发现一些让人抓狂的地方:YAML 格式一个缩进错了全盘报错、想做稍微复杂一点的版本比较逻辑要绕很大的弯、OOB 配置和本地联动永远不够顺手……
于是我花了一段时间,用 Go 从零写了一个自己的漏洞扫描框架 —Veil。
它有自己的一套模板语法(.poc 文件),从解析、变量替换、请求发送、结果匹配到 OOB 回调,全链路自己掌控。这篇文章聊聊它的设计思路和核心特性,也算是给自己交个账。
为什么不直接用 Nuclei?
Nuclei 是目前最成熟的开源漏洞扫描框架,模板生态丰富,社区活跃,这些都是事实。
但它有几个地方始终让我不舒服:
-
YAML 的心智负担YAML 对格式极其敏感,一个多余的空格、一个缩进错位,模板直接加载失败。在批量编写 POC 的时候,这种调试成本会持续累积。
-
版本比较逻辑先天不足做 CVE 相关漏洞检测,经常需要判断目标的组件版本是否在受影响范围内。Nuclei 的 matcher 做这件事并不直接,往往要靠正则拼凑,可读性很差。
-
OOB 联动不够灵活 Nuclei 的 OOB 依赖 interactsh,换个平台要改的地方很多,调试也不方便。
-
攻击模式受限 Burp Suite Intruder 风格的 Sniper / Pitchfork / Clusterbomb 模式在 Nuclei 里实现得比较粗糙,做字典爆破类 POC 时力不从心。
-
请求以及多用链 始终让我看的很难受,各种换行,各种内嵌。
Veil 想解决的正是这些痛点。
Veil 是什么
Veil 是一个基于自定义 DSL 模板的漏洞扫描框架,核心用 Go 编写,模板以 .poc 为后缀。它的整体架构分为几个模块:模板解析(parser)↓变量解析 & 函数替换(resolver)↓请求构造 & 发送(httpclient)↓响应提取(extractor)↓结果匹配(matcher)↓OOB 回调验证(oob)↓结果输出(output)每个模块职责单一,可以独立测试和迭代。下面逐一介绍各模块的设计。
一、模板语法:比 YAML 更直觉
poc 文件用几种前缀符号来区分不同语义,一眼就能看出每行是什么:
id: CVE-2024-XXXX ← 元信息(##)name: 示例漏洞检测severity: high#$ payload = alert(1) ← 变量定义(#$)#$ path = /admin | /manager | /console ← 多值变量(管道分隔)#$ wordlist = @file(passwords.txt) ← 从文件加载字典GET {{BaseURL}}{{path}} HTTP/1.1 ← HTTP 请求行Host: {{Hostname}}User-Agent: {{random_ua}}#@ matcher: status_code == 200 ← 匹配器(#@)#@ matcher: body contains "dashboard"#@ condition: and#> extract: name=version, regex=/v(\d+\.\d+\.\d+)/, group=1 ← 提取器(#>)
对比 Nuclei 的 YAML,.poc 格式更接近原始 HTTP 报文的手感,写起来非常流畅,不需要记住哪个字段该缩进几格。
多请求链用 — 分隔,前一个请求提取的变量可以直接在后续请求中引用:
GET {{BaseURL}}/api/info HTTP/1.1Host: {{Hostname}}#> extract: name=token, json=$.data.token---POST {{BaseURL}}/api/admin HTTP/1.1Host: {{Hostname}}Authorization: Bearer {{token}}#@ matcher: status_code == 200
二、变量系统:内置函数 + 动态替换
Veil 的变量解析器(resolver)支持 {{变量名}} 和 {{函数(参数)}} 两种形式,并且支持嵌套解析。
内置变量(从目标 URL 自动推导):
| 变量 | 含义 |
| — | — |
| {{Hostname}} | 纯主机名,如 example.com |
| {{BaseURL}} | scheme://host:port |
| {{Path}} | URL 路径部分 |
| {{random_ua}} | 随机浏览器 UA |
| {{timestamp}} | 当前 Unix 时间戳 |
| {{oob_domain}} | OOB 回调域名 |
内置函数(部分举例):
{{base64(admin:admin)}} → YWRtaW46YWRtaW4={{url_encode(hello world)}} → hello+world{{md5(password)}} → 5f4dcc3b5aa765d61...{{random_str(8)}} → 随机 8 位小写字符串{{replace(v1.2.3, ., -)}} → v1-2-3{{concat(Bearer , {{token}})}} → Bearer eyJ...嵌套用法完全支持,解析器会迭代展开,最多 8 层:{{base64({{url_encode({{payload}})}})}}
三、匹配器:不只是正则
Matcher 是 Veil 里我最花心思的部分。它支持完整的逻辑表达式,&&、||、()、not 全部支持:
status_code == 200 && body contains "root:"(status_code == 200 || status_code == 302) && header["Content-Type"] contains "json"not body contains "Access Denied"response_time > 5
版本比较是一个特别的亮点。扫 CVE 的时候经常需要判断版本范围,Veil 原生支持:
#@ matcher: version version_lt "1.1.8"#@ matcher: version version_ge "1.0.0" && version version_lt "2.0.0"
版本比较按段数值处理(1.10.0 > 1.9.0),自动剥离前缀 v,预发布后缀做字典序兜底。
支持的匹配维度:
status_code— HTTP 状态码body— 响应体header["X-Powered-By"]— 任意响应头url— 最终跳转 URLresponse_time— 响应时长(秒),用于盲注时延检测content_length— 响应体字节数oob_received— OOB 回调是否命中提取器产生的任意变量名
四、OOB:四个平台自动切换
Out-of-Band 检测是很多高危漏洞(SSRF、XXE、Log4Shell 等)的核心验证手段。
Veil 内置了四个 OOB 平台,按顺序自动探活,哪个通就用哪个:
ceye.io → interactsh (oast.pro) → dnslog.cn → dig.pm
在模板里声明 OOB 类型,Veil 自动生成 token、注入域名、轮询回调结果:
#$ cmd = curl http://{{oob_domain}}GET {{BaseURL}}/rce?cmd={{cmd}} HTTP/1.1#@ oob: http#@ matcher: oob_received == true
轮询策略:等待 8 秒初始窗口,然后每 5 秒查一次,最多 12 次(总计约 68 秒),确保网络延迟大的场景下也不会漏报。
五、攻击模式:三种 Fuzz 姿势
借鉴 Burp Suite Intruder 的设计,Veil 支持三种多变量组合攻击模式:Sniper(狙击手):逐个变量轮换,其余用默认值。适合单点测试。Pitchfork(叉式):所有变量同步推进,适合用户名+密码对齐的场景。Clusterbomb(集束炸弹):所有变量的笛卡尔积,适合穷举。#$ username = admin | root | test#$ password = @file(top100.txt)#@ attack: clusterbomb
六、速率控制:三维限速
扫描器最容易出事的地方之一就是把目标打崩,或者把自己的出口 IP 封掉。Veil 的限速引擎是三层令牌桶架构:全局 RPS(-rc):所有目标合计每秒最多发多少请求单目标 RPS(-rt):对每个主机单独限速,避免集中轰炸并发上限(-cp):最多同时跑多少个 POC三者独立配置,串联生效。令牌桶算法保证平滑出流,不会有突发抖动。
七、模板管理:一键更新
Veil 有配套的模板仓库(veil_poc),通过 -up 参数一键下载到本地,-vc 检查是否有新版本:
./veil -up./veil -vc
检查版本
版本管理通过仓库根目录的 version.txt 实现,不依赖 GitHub API(避免速率限制),用原始 CDN 接口加时间戳缓存破坏参数拉取。
和 Nuclei 的对比总结
| 特性 | Veil | Nuclei | | — | — | — | | 模板格式 | 自定义 DSL(.poc) | YAML | | 版本比较 | 原生支持,语义化运算符 | 需要正则变通 | | OOB 平台 | 4 个平台自动切换 | 依赖 interactsh | | 攻击模式 | Sniper / Pitchfork / Clusterbomb | 基础支持 | | 多请求链提取 | 原生支持,变量自动传递 | 支持 | | 限速控制 | 三维(全局/主机/并发) | 基础限速 | | 自定义函数 | 20+ 内置函数,支持嵌套 | 有限 | | 模板生态 | 自建,规模较小 | 数千官方模板 |
写在最后
Veil 目前还处于持续开发中,目前最新版本v1.18,很多细节还在打磨。以及全部重构POC,写这个工具最大的收获不是功能本身,而是把「一个 HTTP 请求从构造到匹配」这条链路完整地实现了一遍,对扫描器的工作原理理解得更透彻了。
如果你对这个项目感兴趣,欢迎在评论区交流,或者关注后续更新。
一些小案例:
POC:目前编写才65个,这个虽然不难但是写多了眼睛真的很痛,而且看久了不知道会不会有写成错误的,这个后续生态社区POC还是希望各位支持提供哈哈。。。
语法模板:有没有一种感觉真的看一眼就知道了?没有复杂的嵌套
多用请求链: 得意之笔是不是仿佛回到在使用burp?
漏洞检测: 这种请求看起来是不是很爽?
简洁模式:文件上传-文件读取
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:H4ll0 H4ck3r 老谢 老谢《语法定义的新时代,告别 yaml模板的束缚__Veil》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论