从302 重定向突破本地限制到thymeleaf模板注入
字数 997 2025-08-29 08:30:05
Thymeleaf模板注入漏洞利用:从302重定向突破本地限制到RCE
漏洞概述
本教学文档将详细分析一个结合SSRF绕过和Thymeleaf模板注入的漏洞利用链。该漏洞利用过程分为两个关键步骤:
- 通过302重定向绕过本地IP限制
- 构造恶意Thymeleaf模板实现远程代码执行(RCE)
环境分析
目录结构
- admin路由 (关键漏洞点)
- CurlController (提供SSRF功能)
- index路由 (无利用点)
- 模板解析配置
关键路由分析
1. Admin路由
- 功能:渲染用户提供的内容
- 限制:仅允许本地IP访问
- 漏洞点:未对渲染内容进行安全过滤,导致模板注入
2. CurlController路由
- 端点:
/curl - 功能:从用户提供的URL获取网页内容并保存到服务器本地目录
- 漏洞点:存在SSRF漏洞,但有本地IP限制
漏洞利用链
第一阶段:绕过本地IP限制
本地IP检测机制
isPrivateIp()方法检测:
- 检查IP是否为本地IP(127.0.0.1等)
- 如果是本地IP则返回true,导致SSRF失败
302重定向绕过技术
- 准备一个外部服务器(非本地IP)
- 在该服务器上设置302重定向到目标admin路由
- 通过CurlController访问该外部URL
绕过原理:
- 初始请求到外部服务器,IP检查通过
- 服务器返回302重定向到本地admin路由
- 由于重定向是由服务器内部发起,IP检查被绕过
Flask跳转服务示例代码
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/redirect')
def red():
# 重定向到目标admin路由,携带恶意参数
return redirect("http://127.0.0.1/admin?param=恶意payload", code=302)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
第二阶段:Thymeleaf模板注入实现RCE
Thymeleaf模板注入原理
Thymeleaf在解析模板时会执行SpEL(Spring Expression Language)表达式,恶意表达式可导致代码执行
恶意Payload构造
${T(java.lang.Runtime).getRuntime().exec("计算器命令")}
示例弹出计算器的Payload:
${T(java.lang.Runtime).getRuntime().exec("open /System/Applications/Calculator.app")}
完整利用流程
- 对Payload进行URL编码
- 将编码后的Payload放入302重定向URL
- 通过CurlController访问恶意重定向服务
- 服务器重定向到admin路由并执行恶意模板
防御措施
针对SSRF的防御
- 严格校验所有用户提供的URL
- 禁止重定向或限制重定向目标
- 使用白名单机制替代黑名单
针对模板注入的防御
- 禁止用户控制模板内容
- 对用户输入进行严格过滤
- 使用沙箱环境执行模板
- 禁用或限制SpEL表达式功能
总结
该漏洞利用链展示了如何结合SSRF和模板注入实现从外部到RCE的完整攻击路径。关键在于:
- 利用302重定向绕过IP限制
- 通过Thymeleaf的SpEL表达式执行系统命令
- 精心构造的Payload需要正确编码以适应URL传输
理解这种攻击方式有助于开发人员更好地保护应用程序免受类似攻击。