此篇文章在于记录自己对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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3gTNzQTO1QTMyATMxEjMwITLldWYtl2LcdWbp9CXt92YuM3YuVXepxWYucmbppWalJWLuNWLzN3bukXen5WY1h2Y1R3Lc9CX6MHc0RHaiojIsJye.png)
2)利用marshalsec启动LDAP服务,绑定端口9999
3)访问存在fastjson反序列化的页面,http://localhost:8080/hello
发送payload:
成功写入内存马
在实验过程中,我发现主要有两个比较难解决的点,导致实验难以继续
1.怎么编译恶意class文件
可以看到,一个恶意类是有大量的依赖,如果直接采用javac编译会报错
这时候可以利用idea自带的编译特性,先运行项目,然后在其项目的target目录中寻找编译后的class文件即可
2.可以弹出计算器,却无法注入内存马
直接进行debug后发现,在这一行代码会因为找不到RequestMappingHandlerMapping 的实例 bean而抛出异常
原因在于springmvc.xml文件中,没有开启<code><mvc:annotation-driven/></code>选项。
<code><mvc:annotation-driven/></code> 是为 MVC 提供额外的支持,参考 Spring 的官方文档,<code><mvc:annotation-driven/></code> 最主要的作用是注册 <code>HandlerMapping</code>(实现为 DefaultAnnotationHandlerMapping) 和 <code>HandlerAdapter</code>(实现为 AnnotationMethodHandlerAdapter) 两个类型的 Bean,这两个 Bean 为 <code>@Controllers</code>(所有控制器) 提供转发请求的功能。
而在Spring 3.1 开始及以后一般开始使用了新的RequestMappingHandlerMapping映射器。
其实不光是可以注入controller型的内存马,还可以注入Interceptor内存马
注册效果:
https://landgrey.me/blog/12/
https://www.cnblogs.com/bitterz/p/14820898.html
https://www.cnblogs.com/bitterz/p/14859766.html