一文区分SSTI 和 CSTI

前言

有时,SSTI(服务器端模板注入)和 CSTI(客户端模板注入)可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell,即使payload仅限于客户端。

定义

𝗦𝗲𝗿𝘃𝗲𝗿-𝘀𝗶𝗱𝗲 𝘁𝗲𝗺𝗽𝗹𝗮𝘁𝗲 𝗶𝗻𝗷𝗲𝗰𝘁𝗶𝗼𝗻 指可能发生使用服务器端模板引擎的 Web 应用程序。它涉及代码注入攻击,攻击者可以在服务器端模板中注入并执行恶意代码。

𝗖𝗹𝗶𝗲𝗻𝘁 𝗦𝗶𝗱𝗲 𝗧𝗲𝗺𝗽𝗹𝗮𝘁𝗲 𝗜𝗻𝗷𝗲𝗰𝘁𝗶𝗼𝗻 是一个安全问题,攻击者的输入是注入页面并由客户端 JavaScript 库处理。

TL;DR: SSTI 允许在远程服务器上执行代码,而 CSTI 允许在受害者端【客户端】执行任意 JavaScript 代码。

一些例子

SSTI

假设一个使用服务器端模板引擎的 Web 应用程序,允许用户提交网站上显示的评论。模板引擎支持模板内的变量和表达式。

复制代码
template = "Your comment is: {{ comment }}"rendered = template.render(comment=comment_input)

如果应用程序无法正确验证和清理用户输入,攻击者可以通过将恶意代码注入评论输入字段来利用此漏洞。

如果您提交 {{7*7}} 作为评论,结果将是:

复制代码
Your comment is: 49

此漏洞可能会导致代码执行,如以下payload所示:

复制代码
{{ user.__class__.__mro__[1].__subclasses__()[407]("cat /etc/passwd", shell=True, stdout=-1).communicate() }}

payload尝试在服务器上执行命令 cat /etc/passwd。如果服务器环境允许执行此类命令并且模板引擎容易受到 SSTI 的影响,则 /etc/passwd 文件的内容可能会显示为payload的结果。

CSTI

假设您有一个使用 AngularJS 的 Web 应用程序。在 HTML 页面中,只要将特殊属性应用于标签,AngularJS 就会分析该标签的内容并根据需要进行更改。在带有属性的标签内,AngularJS 将 {{}} 中的任何内容视为可执行代码或变量名称。

复制代码
<h1>Hello, {{name}}</h1>

此漏洞的测试遵循与 SSTI 类似的过程。解释器期望双花括号之间有可执行代码,并执行该代码。

如果输入未正确过滤,提交 {{7*7}} 将导致以下输出:

复制代码
Hello, 49.

这就是可能造成混乱的地方。在尝试实现代码执行之前,请检查浏览器中的 JS 库是否未处理此变量。

例如,如果这是 CSTI,您可以继续使用 XSS payload,比如弹个窗。

复制代码
{{constructor.constructor('alert(1)')()}}
相关推荐
AI日报派送佬1 小时前
2026年10月14日AI行业日报|Gemini 4 Argon正式发布;小模型跨设备传播风险引发安全热议
网络·人工智能·openai·谷歌·deepseek·anthropic·ai日报
鬼手点金2 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
VidDown2 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
软件技术NINI2 小时前
美妆商城html+Css+js 4页
javascript·css·html
安易算力2 小时前
昇腾CANN算子开发与MindSpore部署调优实践:从Ascend C到模型推理全链路
网络·架构
蛋蛋的就会顺顺的2 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday2 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室2 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
小小测试开发3 小时前
安全评测得分 0.9556 掉到 0.3257,只改了 top_k 和 prompt_style 之外的题面比例
人工智能·安全·prompt
码艺-Alimjan3 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js