Security Report for {{Workspace}}
【免费下载链接】osmedeusA Modern Orchestration Engine for Security项目地址: https://gitcode.com/GitHub_Trending/os/osmedeus
Generated: {{TaskDate}}Target: {{Target}}Run UUID: {{RunUUID}}
## 二、三种语法形态:从模板变量到可执行代码 ### 2.1 `{{Variable}}` 模板变量 渲染引擎在真正执行函数之前,会先做一轮变量替换。从源码 [markdown_functions.go](https://link.gitcode.com/i/3a0abdd1a656faaead8f1cf1f78aa531) 可以看到,`renderTemplateVariables` 使用正则 `\{\{(\w+)\}\}` 匹配所有形如 `{{Name}}` 的占位符,并从运行上下文(`getContextVariables`)中取值替换;未匹配到任何变量的占位符会原样保留,避免静默丢失。 `getContextVariables`([markdown_functions.go](https://link.gitcode.com/i/9e2a5de1396756f931f3ef24d6a684b0))会从 goja VM 中导出以下常用变量: | 变量名 | 含义 | |---|---| | `Target` | 本次扫描的目标(如 `example.com`) | | `TargetSpace` / `Workspace` | 当前工作区名称(通常即目标名) | | `Output` | 当前扫描输出目录路径 | | `BaseFolder` | Osmedeus 基础目录 | | `Binaries` / `Data` | 外部二进制目录 / 外部数据目录 | | `ExternalConfigs` | 外部配置目录 | | `Workflows` / `Workspaces` | 工作流 / 工作区目录 | | `RunUUID` | 当前 run 的唯一标识 | | `TaskDate` | 当前日期 | | `Version` | Osmedeus 版本号 | | `DefaultUA` | 默认 User-Agent | 模板头部的 `{{Workspace}}`、`{{TaskDate}}`、`{{Target}}`、`{{RunUUID}}` 正是由这套机制注入的。 ### 2.2 ` ```osm-func ` 代码块 模板中所有被三反引号包裹、语言标记为 `osm-func` 的代码块,都会在渲染时被提取、执行、替换。源码中用两个正则定义匹配规则([markdown_functions.go](https://link.gitcode.com/i/8ca19f2e97ef9b0a9615b87a3914458e)): ```go var osmFuncPattern = regexp.MustCompile("(?s)```osm-func\n(.*?)\n```") var osmFuncInlinePattern = regexp.MustCompile("`([^`]+)`\\{\\.osm-func\\}")osmFuncPattern匹配整块```osm-func ... ```,代码通过extractOsmFuncCode去掉首尾标记后执行;osmFuncInlinePattern匹配`code`{.osm-func}行内形态,适合放在表格单元格中。
2.3 行内函数语法(Pandoc 风格)
严重性分布表正是用行内语法实现的——Markdown 表格单元格里无法优雅地嵌入多行代码块,因此模板写成:
| Severity | Count | |----------|---------------------------------| | Critical | `db_select_vuln_critical()`{.osm-func} | | High | `db_select_vuln_high()`{.osm-func} | | Medium | `db_select_vuln_medium()`{.osm-func} | | Low | `db_select_vuln_low()`{.osm-func} |渲染后每个单元格会被替换成对应的整数计数。
三、渲染引擎:三步流水线
render_markdown_report(template_path, output_path)是驱动整个流程的核心函数(markdown_functions.go),其执行分为三步:
- 变量替换:先调用
renderTemplateVariables渲染{{Variable}}; - 处理代码块:用
osmFuncPattern找到所有osm-func块,extractOsmFuncCode取出代码,交给executeCode在 goja JS 虚拟机中执行(vf.vm.RunString,见 markdown_functions.go),执行失败会在原位置注入<!-- ERROR: ... -->注释,保证模板其余部分不受影响; - 处理行内函数:用
osmFuncInlinePattern处理`code`{.osm-func},逻辑与第二步一致。
处理完成后自动创建输出目录并写入结果文件。由于osm-func代码运行在完整的 goja JS 引擎中,模板中不仅可以直接调用db_*、字符串等内置函数,还能写条件表达式、拼接字符串(见下文示例)。
另有两个便捷入口:
generate_security_report(template_path)(markdown_functions.go):固定输出到{{Output}}/security-report.md,并通过registerReportArtifact将该文件以markdown类型注册为数据库 artifact(含文件大小、行数统计),报告可直接在 UI 中浏览;render_markdown_from_file/print_markdown_from_file(markdown_functions.go):读取 Markdown 文件并用 glamour 渲染为终端彩色样式,用于命令行预览。
四、统计函数详解:Summary Statistics 与严重性分布
4.1 工作区统计函数
模板的 Summary Statistics 段落依次调用了四个统计函数,它们从当前工作区的统计记录中取值(db_functions.go):
"Total subdomains: " + db_select_total_subdomains()"Total URLs: " + db_select_total_urls()"Total assets: " + db_select_total_assets()"Total vulnerabilities: " + db_select_total_vulns()其内部实现均为:根据当前workspaceName查询工作区记录,读取对应计数字段(TotalSubdomains、TotalURLs、TotalAssets、TotalVulns);查询失败时返回0而不是报错,保证报告永远可以生成。函数签名与返回类型在 constants.go 中有明确登记。
4.2 严重性分布函数
严重性统计函数同样基于工作区统计记录:
| 模板调用 | 对应字段 |
|---|---|
db_select_vuln_critical() | VulnCritical |
db_select_vuln_high() | VulnHigh |
db_select_vuln_medium() | VulnMedium |
db_select_vuln_low() | VulnLow |
(函数常量定义见 constants.go)。这些字段在扫描过程中由 Osmedeus 汇总维护,因此模板中只需一行行内函数即可完成按严重级别分布的可视化表格。
五、全量数据导出:Assets 与 Vulnerabilities
5.1 导出全部漏洞
db_select_vulnerabilities("{{Workspace}}", "markdown")db_select_vulnerabilities(workspace, format)(实现在 db_functions.go)按created_at DESC排序查询漏洞记录,format支持markdown与jsonl两种输出格式;markdown会生成一张可直接嵌入报告的表。同类函数还有带过滤能力的db_select_vulnerabilities_filtered(workspace, severity, asset_value, format)(常量注册见 constants.go)。
5.2 导出全部资产
db_select_assets("{{Workspace}}", "markdown")db_select_assets(workspace, format)(db_functions.go)查询资产表,并按创建时间倒序输出;内部对结果做了Limit(1000)上限保护,防止大扫描结果导致内存问题。同理可参考db_select_assets_filtered(workspace, status_code, asset_type, format)按状态码、资产类型过滤。
六、自定义 SQL 查询:db_select
当内置函数不足以表达查询时,模板提供db_select(sql_query, format)直接执行原始 SQL(db_functions.go):
db_select("SELECT severity, COUNT(*) as count FROM vulnerabilities GROUP BY severity ORDER BY count DESC", "markdown")实现要点(也是使用时的安全边界):
- 仅接受
markdown/jsonl两种格式,非法格式直接报错(validateOutputFormat); - 执行前会通过
validateSelectQuery做安全校验,只允许 SELECT 类只读查询,从源头阻断写入类 SQL 注入; - 结果行数硬上限 1000 行,防止拖库式查询拖垮引擎;
- 查询结果会以列为键转为 map,并以 Markdown 表格或 JSONL 输出。
七、字符串函数与表达式能力
模板最后演示了字符串处理函数(常量定义见 constants.go):
trim(" Example trimmed text ")toUpperCase("example")"Workspace: " + "{{Workspace}}" + " | Target: " + "{{Target}}"由于代码块运行在 goja(JavaScript)引擎中,模板天然支持字符串拼接、contains("{{Target}}", "example")、三元表达式(如 `contains("{{Target}}", ".com") ? "是 .com 域名" : "非 .com 域名")等 JS 语法,与 Osmedeus 工作流中 function 步骤共享同一套内置函数注册表,能力完全一致。
八、实战:通过 Workflow 自动化生成报告
模板本身不产生报告,需要由 workflow 调用渲染函数。仓库提供了两个可直接运行的参考工作流。
8.1 最小演示:sample-report-workflow
sample-report-workflow.yaml 演示了从创建模板到渲染、校验、预览的完整闭环:
osmedeus run -m sample-report-workflow -t example.com其关键步骤:
- name: generate-report type: function function: 'render_markdown_report("{{Output}}/templates/demo-report.md", "{{Output}}/security-report.md")' - name: verify-report type: function function: 'file_exists("{{Output}}/security-report.md")'工作流内嵌的 demo 模板展示了to_upper_case、trim、len、uuid、random_string、contains及三元条件表达式等更多函数组合。
8.2 漏洞专项报告:generate-vuln-report
generate-vuln-report.yaml 演示如何只导出高危发现:
- name: create-high-severity-template type: bash command: | cat > {{Output}}/templates/high-severity-report.md << 'EOF' # High Severity Findings - {{TargetSpace}} ... ```osm-func db_select_vulnerabilities_filtered("{{TargetSpace}}", "critical", "", "markdown") ``` ... EOF - name: generate-high-severity-report type: function function: 'render_markdown_report("{{Output}}/templates/high-severity-report.md", "{{Output}}/reports/high-severity-findings.md")'运行方式:
osmedeus run -m generate-vuln-report -t example.com【免费下载链接】osmedeusA Modern Orchestration Engine for Security项目地址: https://gitcode.com/GitHub_Trending/os/osmedeus
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考