SuperAPI AI 工具集

sast-ssti

安全与审计

查看项目

更新于 10-16 02:17

技能介绍

用途

sast-ssti 是一个面向代码库的安全评估技能,专门用于发现服务端模板注入(Server-Side Template Injection,SSTI)漏洞。SSTI 指的是用户可控输入被直接嵌入模板字符串,并由模板引擎执行,从而可能导致任意代码执行、文件读取或服务器完全失陷。该技能的核心判断模式是:未经验证的用户输入被用作模板字符串,传递给模板引擎的 render/compile/evaluate 函数。

主要能力

技能采用三阶段子代理流程。第一阶段为侦察:在代码库中找出所有将动态构建的字符串作为模板本身进行渲染、编译或求值的位置,而非加载静态模板文件,结果写入 sast/ssti-recon.md。第二阶段为批量验证:读取侦察结果,将候选渲染点按每批最多 3 个拆分,并行启动子代理,追踪用户输入是否到达每个站点的模板参数。第三阶段为合并:将各批次结果整合为最终报告。

技能覆盖的引擎与框架包括:Python 的 Jinja2/Flask 与 Mako,Node.js 的 EJS、Nunjucks、Handlebars、Pug/Jade、Lodash/Underscore、Swig/Twig.js,Ruby 的 ERB 与 Liquid,Java 的 FreeMarker、Velocity、StringTemplate/ST4、Thymeleaf,PHP 的 Twig、Smarty、Blade/Laravel,Go 的 text/template 与 html/template,以及 C# 的 Scriban、Handlebars.Net、DotLiquid、Fluid。具体识别的调用形式例如 Jinja2 的 Template(user_input).render() 与 env.from_string(user_input).render()、Flask 的 render_template_string(user_input)、EJS 的 ejs.render(user_input, ctx)、Nunjucks 的 nunjucks.renderString(user_input, ctx)、Handlebars.compile(user_input)(ctx)、FreeMarker 的 new Template("anon", new StringReader(user_input), cfg).process(...)、Velocity.evaluate(ctx, user_input)、Twig 的 \Twig\Environment::createTemplate(user_input)->render(ctx)、ERB.new(user_input).result(binding)、Go 的 template.New("x").Parse(user_input) 等。同时也关注动态模板名构造,例如 Flask 的 render_template(user_input) 或 Express 的 res.render(req.query.template),当模板名本身来自用户输入且未对安全列表进行校验时。

使用方式

技能以子代理方式运行三个阶段。前置条件是 sast/architecture.md 必须存在;若不存在,需先运行分析技能。第一阶段向子代理提供项目架构摘要以理解技术栈、模板引擎和视图渲染方式,并要求写入 sast/ssti-recon.md。第一阶段完成后需检查候选渲染点:若侦察结果为零(摘要为 "Found 0" 或候选渲染站点部分为空或缺失),则完全跳过第二阶段与第三阶段,改为向 sast/ssti-results.md 写入 "No vulnerabilities found." 并停止。只有在第一阶段找到至少一个候选渲染点时才进入第二阶段。第二阶段读取 sast/ssti-recon.md,将候选点拆分为每批最多 3 个,每个批次启动一个并行子代理,追踪用户输入是否到达各站点的模板参数。第三阶段合并批次结果形成最终报告。数据文件统一位于 sast/ 目录下,包括 sast/ssti-recon.md、sast/ssti-results.md,以及作为前置条件的 sast/architecture.md。

适用场景

适用于对已有代码库进行聚焦式安全评估、查找 SSTI 漏洞的工作流,尤其适合在已经有架构文档(sast/architecture.md)的安全分析流程中作为后续技能使用。技能通过识别非字面量的模板参数来缩小审查范围,并区分用户输入作为模板字符串与用户输入作为上下文数据两类不同情形。

限制

技能明确不将以下情形标记为 SSTI:用户输入作为上下文数据传给静态模板(如 render_template("profile.html", name=request.args.get("name")));模板输出未净化用户数据后在浏览器中呈现的 XSS;模板名来自用户输入但已针对硬编码允许集严格校验的情况;以及使用 Liquid、Mustache 等逻辑无关(logic-less)或沙箱化引擎的情况,除非能确认引擎为逻辑无关,否则仍标记为 "Needs Manual Review"。技能还指出,Go 的 html/template 会自动转义输出,但 text/template 不会;即使 html/template,如果用户输入到达 .Parse() 仍可能受 SSTI 影响。