强网杯hellospring引出SSTI的学习

💡 原文中文,约5200字,阅读约需13分钟。
📝

内容提要

本文介绍了模版注入(SSTI)的概念和原理,以及Pebble模版引擎的使用。文章还提到了Pebble模版注入的漏洞成因和影响范围,并给出了复现该漏洞的步骤和思路。最后,文章总结了模版注入的常见特点和防范措施。

🔎

延伸解读

从CTF题目理解SSTI的实战链条

本文以强网杯hellospring题目为例,展示了SSTI漏洞从发现到利用的完整链条:上传点、目录穿越、模板注入、反射调用、最终RCE。读者可以从中理解,SSTI往往不是孤立漏洞,而是与文件上传、路径穿越等缺陷组合利用。这种组合利用思路在真实渗透测试中同样常见,提醒开发者在修复时需关注多个环节的联动风险。

Pebble模板注入的利用难点与版本差异

文章指出,老版本Pebble可通过Class.forName直接加载任意类,但新版本修复了该方式。复现中采用的绕过手法依赖Spring应用隐式注册的bean,如internalCachingMetadataReaderFactory和jacksonObjectMapper,再结合jackson反序列化和java.beans.Beans实例化ClassPathXmlApplicationContext,最终加载远程XML执行命令。这反映了模板注入利用与具体框架、依赖版本紧密相关,并非一成不变。

复现环境与真实环境的差异提醒

作者特别说明,比赛提供的附件与远程环境不一致,需要根据配置文件和源码手动创建home.pebble模板文件,并注意服务端时间与本地时间的差异,以正确构造上传后的文件名。这提示读者,在复现或测试SSTI漏洞时,不能完全依赖附件,需结合目标实际配置调整,否则可能无法成功触发漏洞。

SSTI防范的核心原则

文章总结,SSTI的成因是服务端未经处理就将用户输入作为模板内容的一部分。防范的关键在于对用户输入进行严格的验证和处理,避免其被模板引擎编译执行。同时,模板引擎提供的沙箱机制虽能增加利用难度,但并非绝对安全,可能被沙箱逃逸技术绕过。因此,开发者应优先采用白名单等输入控制策略,而非仅依赖沙箱。

❓

Q&A

什么是SSTI(服务器端模板注入)?

SSTI是服务器端模板注入(Server-Side Template Injection),指服务端接收用户恶意输入后,未经处理就将其作为Web应用模板内容的一部分,模板引擎在编译渲染过程中执行了用户插入的恶意语句,可能导致敏感信息泄露、代码执行、GetShell等问题。

Pebble模板引擎有什么特点?

Pebble是一款Java模板引擎,其开发灵感来自Twig,具有很强的模板延续性和易于阅读的语法。

在Java模板注入中,如何利用反射机制执行系统命令?

在Java中,可以利用类似variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la')的代码。每个Java对象都有getClass()方法,可以获取任意Java类的实例,进而获取java.lang.Runtime实例来执行OS命令。

复现hellospring题目时,环境搭建需要注意什么?

需要根据附件中的jar包解压后在IDEA中打开,从META-INF/MANIFEST.MF查看JDK版本并配置对应环境。由于附件与远程环境不同,需根据配置文件和源码中的return 'home',在/tmp目录下创建home.pebble模板文件,成功访问即环境搭建成功。

hellospring题目中如何利用目录穿越和上传点实现RCE?

题目存在上传点,上传文件后文件名按时间格式重命名(如file_20231230_044928.pebble)。Pebble的loader会优先从classpath加载模板,找不到则从fileloader加载,且只能读取.pebble后缀文件。因此可以上传一个恶意的.pebble文件,然后通过目录穿越访问该文件,触发Pebble模板注入,最终实现RCE或反弹shell。

如何防范模板注入漏洞?

防范措施包括对用户输入进行严格的验证和处理,避免未经处理就将用户输入作为模板内容的一部分。

➡️

继续阅读