SSTI( 服务器模板注入)以及常见利用方式

本文介绍了服务器侧模板注入(SSTI)的概念及其危害,通过实例展示了如何利用SSTI触发XSS攻击、造成拒绝服务及获取服务器权限。同时探讨了Jinja2模板引擎中的具体利用方法,并提出修复建议。

0x00 前言

简单介绍下,由于模板引擎支持使用静态模板文件,并在运行时用HTML页面中的实际值替换变量/占位符,从而让HTML页面的设计变得更容易。当前广为人知且广泛应用的模板引擎有Smarty、Twig、Jinja2、FreeMarker和Velocity。

简而言之,我们如果在开发过程中,如果选择使用的字符串格式化将URL动态添加到模板字符串中并返回到页面中,这时用户对模板是可控的。

0x01 漏洞演示

根据清风师傅在文章中所提到的,我们原版来分析下:

针对于模板可控,带入触发XSS

http://127.0.0.1:5000/<script>alert(/xss/)</script>

Jinjan2 基础语法

{% ... %}
​
{{ ... }}
​
{# ... #}

模版引擎成功解析

http://127.0.0.1:5000/aaa{{1+2}}

鸡肋拒绝服务攻击

request 是Flask模版的一个全局对象,其代表 “当前请求对象(flask.request)”,在request 对象中有一个environ对象名。
​
request.environ 对象是一个与服务器环境相关的对象字典,字典中一个名为 shutdown_server 的方法名分配的键为 werkzeug.server.shutdown 。
​
注射 {{ request.environ['werkzeug.server.shutdown']() }} 会造成拒绝服务。

获取配置项目信息

config 也是 Flask模版中的一个全局对象,它包含了所有应用程序的配置值。
​
{{ config.items() }}    // 查看配置项目的信息     
​
输入:http://127.0.0.1:5000/a{{ config.items() }}

更多详情链接:http://www.pythondoc.com/flask/config.html

config是一个类字典对象,它的子类包含很多方法:from_envvar, from_object, from_pyfile, root_path。

Flask/config.py
​
def from_object(self, obj): 

1. from_object  遍历新加模块中的所有大写的变量的属性并添加属性 
​
2. 并且这些添加到config对象的属性都会维持他们本来的类型
​
3. 验证:我们将 {{ config.items() }} 注入到存在SSTI漏洞的应用中,注意当前配置条目
​
4. 注入  {{ config.from_object('os') }}。这会向config对象添加os库中所有大写变量的属性
​
5. 再次查看  {{ config.items() }}     ;    os 模块中大写变量的属性成功添加属性cf 

0x02 获取服务器shell

同步参考文章,这里面还是主要采用MSF的php马反弹shell(php有效载荷远程下载后,进行访问获取服务器shell权限)进行获取服务器权限

https://medium.com/@david.valles/gaining-shell-using-server-side-template-injection-ssti-81e29bb8e0f9

0x03 修复意见

针对于不同的模板引擎,该漏洞的修复方法会有所不同,但如果在传递给模板指令之前,对用户输入进行安全过滤的话,则可以大大减少这类威胁。此外,另一种防御方法是使用沙箱环境,将危险的指令删除/禁用,或者对系统环境进行安全加固。

0x04 参考连接

http://www.secbook.info/index.php/archives/51.html

https://xz.aliyun.com/t/2637

https://portswigger.net/blog/server-side-template-injection

https://nvisium.com/blog/2016/03/11/exploring-ssti-in-flask-jinja2-part-ii.html

转载请注明:Adminxe's Blog » SSTI( 服务器模板注入)以及常见利用方式

<think>好的,我现在需要处理用户关于SSTI服务器模板注入)漏洞的查询。用户想了解其原理及防御措施。首先,我要确保自己正确理解SSTI的基本概念。 根据引用[5],SSTI漏洞是因为服务端接收了用户的恶意输入后,未经处理就作为模板内容的一部分,导致模板引擎编译时执行了恶意代码。这点是关键,需要解释清楚。接下来,我需要说明原理,可能分步骤:用户输入被嵌入模板模板引擎处理时解析了恶意代码,导致攻击。例如,用户输入`{{7*7}}`如果返回49,说明存在漏洞。 然后,防御措施部分需要结合多个引用。引用[1]提到不要让用户控制模板内容,使用正规的渲染方法。引用[3]建议限制模板的访问权限,引用[2]提到输入验证、白名单过滤等。引用[5]提到不同语言的常见模板引擎,可能需要具体说明防御措施适用于这些引擎。 需要注意用户要求回答结构清晰,分点说明。可能先讲原理,再讲防御,每个部分用条目列出。同时,确保使用正确的中文术语,避免技术术语错误。 可能的问题点:是否遗漏了某些防御措施?比如引用[4]提到的靶场练习,虽然重要,但可能属于实践部分,不是直接的防御措施。需要确认是否需要包含。 另外,用户提供的引用中有重复的内容,需要整合。例如,输入验证、白名单、限制访问、使用安全模板方法等。需要将这些综合起来,分点说明。 最后,生成相关问题,需围绕SSTI漏洞,比如不同引擎的利用方式、检测方法、案例等。确保问题相关且有助于用户进一步学习。 总结步骤:1. 解释SSTI原理,2. 详细说明防御措施,3. 生成相关问题。需要引用正确的来源,并在回答末尾添加引用标识。</think>### SSTI服务器模板注入)漏洞原理及防御措施 #### **一、原理** 1. **漏洞成因** SSTI漏洞是由于服务端将用户的恶意输入直接嵌入模板中,未经处理即由模板引擎解析执行。例如,用户输入如`{{7*7}}`,若返回`49`则表明模板引擎执行了该表达式,漏洞存在[^5]。 $$ \text{恶意代码} \rightarrow \text{模板引擎解析} \rightarrow \text{执行危险操作} $$ 2. **攻击流程** - 攻击者通过参数、表单等提交包含模板语法的恶意输入(如`{{config}}`)。 - 服务端错误地将输入拼接到模板中,模板引擎将其视为合法代码编译执行。 - 攻击者可读取敏感数据(如数据库密码)、执行系统命令,甚至控制服务器[^2][^5]。 3. **影响范围** 漏洞危害程度取决于模板引擎的功能复杂度。例如: - **Python(Jinja2)**:可通过`{{''.__class__.__mro__}}`访问类方法。 - **PHP(Twig)**:可能利用`{{_self.env.registerUndefinedFilterCallback("exec")}}`执行命令。 --- #### **二、防御措施** 1. **输入过滤与验证** - 对用户输入进行**严格白名单过滤**,禁止包含模板语法字符(如`$`、`{{}}`)。 - 使用正则表达式检测危险符号,例如匹配`\{\{.*\}\}`并拦截[^2]。 2. **安全的模板渲染方法** - 避免直接拼接用户输入到模板,改用**上下文变量传递**。例如在Flask中: ```python return render_template("index.html", content=user_input) # 安全:变量通过上下文传递 ``` 而非`render_template_string(user_input)`[^1][^5]。 3. **最小化模板引擎权限** - 禁用模板引擎的危险功能,如Jinja2的`{% debug %}`或访问内置对象(如`__builtins__`)。 - 配置模板沙箱环境,限制文件读写和系统调用[^4]。 4. **访问控制与审计** - **限制模板文件修改权限**,仅允许管理员或可信用户操作[^3]。 - 定期进行**安全审计**,检查模板渲染逻辑是否存在注入风险。 5. **框架与组件更新** - 及时升级模板引擎版本,修复已知漏洞(如Jinja2旧版本的沙箱逃逸问题)。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adminxe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值