SuperAPI AI 工具集

ssti-methodology

安全与审计

查看项目

更新于 10-16 08:01

技能介绍

本技能是一套服务端模板注入(SSTI)的检测、引擎识别与利用方法论,资料以分阶段流程组织,并附参考文件(references/jinja2-exploitation.md、references/other-engines-and-bypass.md、references/multi-engine-payloads.md)作为确认引擎后的深入材料。

用途与适用场景:目标为 Flask/Jinja2/Django/Twig/Mako/Pug 应用、存在用户输入回显、参数名含 template、name、message、greeting 等时使用。

Phase 0 注入点定位:先用 analyze_response 观察哪些参数值出现在响应中,只有回显到页面的参数才可能是注入点;常见回显参数包括 name、username、message、greeting、template、title、q、search。注意 HTML 转义的回显仍可能被模板渲染。

Phase 1 检测决策树:发送 {{77}},返回 49 则发 {{7'7'}},返回 7777777 判定为 Jinja2(Python),返回 49 判定为 Twig(PHP);原样返回则发 ${77},返回 49 为 Java EL/Mako/FreeMarker;再发 #{77},返回 49 为 Ruby ERB 或 Pug。返回空或错误表示可能有过滤,可尝试 {{7*'7'}}。

Phase 2 引擎识别辅助表:根据 Server 头线索与确认方法区分 Jinja2、Django、Twig、Mako、FreeMarker、Pug。

Phase 3 利用决策树:Jinja2 优先级为上下文变量→config→文件读取→RCE(lipsum 链);Twig、Mako/FreeMarker/Pug、Django 走对应参考文件;Django 无 RCE,优先上下文变量穷举、request.META、settings 与 admin 路径发现;有过滤时参考其他引擎与绕过文件。Jinja2 速查示例包括 {{lipsum.globals['os'].popen('id').read()}} 与 {{config}}。

Phase 4 高级技术:子类遍历使用 for 与 enumerate 遍历子类列表,目标类为 os._wrap_close、subprocess.Popen,用条件过滤如 if 'popen' in str(cls);索引因环境而异需动态查找。过滤绕过可将外部参数分离(?a=class&b=mro,模板中用 request.args.a 引用),因为过滤通常只检查模板内容而不检查 URL 参数;关键词被过滤时可通过 globals.self 到达 builtins 模块,并用字符串拼接绕过,例如 {{ globals.self.exec("imp" + "ort o" + "s;o" + "s.system('cat /flag')") }} 与 {{ request.class.init.globals.builtins.exec("imp"+"ort('o'+'s').system('id')") }}。

注意事项:先简单后复杂;GET 参数注入时 {{ }} 需要 URL 编码;500 页面可能泄露引擎类型和 Python 版本;应先确认引擎再选 payload,最后用 http_request 发送 RCE payload 获取 flag。价格、平台支持与许可等信息暂未提供。