天天看点

利用Fastjson注入Spring内存马

此篇文章在于记录自己对spring内存马的实验研究

搭建漏洞环境,利用fastjson反序列化,通过JNDI下载恶意的class文件,触发恶意类的构造函数中代码,注入controller内存马。

1)组件版本:

fastjson: 1.2.24

spring-mvc: 4.3.28.RELEASE

JDK: 8u121

2)搭建springMVC+fastjson漏洞环境

可以参考网上的入门文章进行搭建,这里我放出我自己环境的配置文件

web.xml

springmvc.xml

HelloController

pom.xml

在springMVC中,也可以在服务器程序启动后,利用某种方式实现动态加载controller。

在LandGrey文章中介绍了四种方法,分别是

方式一:getCurrentWebApplicationContext

方法二:WebApplicationContextUtils

方法三:RequestContextUtils

方法四:getAttribute

而对于获取上下文来说,推荐使用第三、四种方法。前两种可能会获取不到RequestMappingHandlerMapping实例

使用registerMapping方法来动态注册我们的恶意controller

除了使用registerMapping方法注册controller外,还有其余的方式可以参考https://landgrey.me/blog/12/

以下是大佬的内存马,接下来进行一个改动,使之能进行回显

把test代码中的内容替换为以下

fastjson<=1.2.24的 payload:

1)启动本地http服务,绑定端口8888

利用Fastjson注入Spring内存马

2)利用marshalsec启动LDAP服务,绑定端口9999

利用Fastjson注入Spring内存马

3)访问存在fastjson反序列化的页面,http://localhost:8080/hello

发送payload:

利用Fastjson注入Spring内存马

成功写入内存马

利用Fastjson注入Spring内存马

在实验过程中,我发现主要有两个比较难解决的点,导致实验难以继续

1.怎么编译恶意class文件

可以看到,一个恶意类是有大量的依赖,如果直接采用javac编译会报错

这时候可以利用idea自带的编译特性,先运行项目,然后在其项目的target目录中寻找编译后的class文件即可

利用Fastjson注入Spring内存马

2.可以弹出计算器,却无法注入内存马

直接进行debug后发现,在这一行代码会因为找不到RequestMappingHandlerMapping 的实例 bean而抛出异常

利用Fastjson注入Spring内存马
利用Fastjson注入Spring内存马

原因在于springmvc.xml文件中,没有开启<code>&lt;mvc:annotation-driven/&gt;</code>选项。

<code>&lt;mvc:annotation-driven/&gt;</code> 是为 MVC 提供额外的支持,参考 Spring 的官方文档,<code>&lt;mvc:annotation-driven/&gt;</code> 最主要的作用是注册 <code>HandlerMapping</code>(实现为 DefaultAnnotationHandlerMapping) 和 <code>HandlerAdapter</code>(实现为 AnnotationMethodHandlerAdapter) 两个类型的 Bean,这两个 Bean 为 <code>@Controllers</code>(所有控制器) 提供转发请求的功能。

而在Spring 3.1 开始及以后一般开始使用了新的RequestMappingHandlerMapping映射器。

其实不光是可以注入controller型的内存马,还可以注入Interceptor内存马

注册效果:

利用Fastjson注入Spring内存马

https://landgrey.me/blog/12/

https://www.cnblogs.com/bitterz/p/14820898.html

https://www.cnblogs.com/bitterz/p/14859766.html