推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

初入RMI反序列化(一)

   2023-07-03 网络整理佚名1070
核心提示:rmi反序列化!继续调试,当函数有返回值的时候会进入一个()方法,这里也有一个反序列化的点;反之,如果有返回值,那客户端就会进行一次反序列化读取,所以客户端跟服务端可以互锤,可以尝试一下!

程序员在文章之前写道:

《RMI反序列化简介》将由《RMI基础知识》和《RMI反序列化漏洞分析》两部分组成。 本期我们重点分析“RMI基础知识”部分。 RMI基础通信代码、RMI源码分析、代码逻辑总结》等九个部分,与读者共同探讨RMI反序列化的方法和逻辑。

环境

主意

攻击方:

服务器jdk7:

-- 3.1:

。罐:

fi//压缩/

RMI 基础知识

(1)分布式处理中的RPC框架

既然要讲RMI,就不得不讲一下RPC框架,比如:RMI(Java最早的RPC框架)、grpc(的框架)、dubbo(阿里巴巴开发的开源RPC框架基于) 。 虽然RMI已经不再适合企业级生产,但其思想仍然值得学习。

(2)什么是RMI

RMI是Java的远程方法调用,它允许运行在一个Java虚拟机(JVM)上的对象调用运行在另一台虚拟机上的对象。 该对象可以在同一台计算机上的不同进程中,也可以在网络上运行。 分为三个部分:端午节吃粽子、赛龙舟的习俗是为了纪念我国历史上伟大的诗人屈原,也正是因为如此,端午节才得以流传。解放后定名为“诗人节”。 。

:提供远程方法的对象,发布远程对象;

:调用远程方法的对象,连接注册中心获取远程对象;

:一个注册表,存储远程对象的位置,如:ip、端口、标识符;

这是先知社区的图片:

与JRMP协议交互,客户端使用代理来调用服务器方法。 客户端的代理称为stub,服务器的代理称为stub。 该漏洞发生在远程通信过程中。

(3)RMI基本通信代码

我们知道了什么是RMI,现在我们开始编写测试代码。

1.定义远程接口

远程接口定义修改后的接口类,继承并调用java.rmi。 和java.rmi。

2. 实现远程接口

继承远程接口时,所有方法都需要抛出,并且方法必须间接或直接继承该类(最终会继承这个接口)。 该类提供了支持RMI的方法,并且可以通过JRMP协议导出对远程对象的引用。 生成由动态代理构造的 Stub 对象。

3. 服务器端实体

我们构造一个端实体,为了远程传输,需要让他继承序列化接口。

4. 调用远程对象的客户端

5. 总结

简单来说,服务器A现在有另一个服务器B想要调用的方法,但是服务器B显然不能直接调用服务器A的方法,但是现在RMI来了! 服务器A可以将这个类对象序列化,放到一个“共享池”中,这样​​大家就可以通过这个“共享池”来调用这个方法所在的类了。 里面。

(4)RMI源码分析

为了避免找到所有的class文件,可以参考这个配置:

(5)服务器的发布与调试

1、服务器的工作就是发布对象到注册中心,因为方法实现类继承(发布远程对象);

2、按照这个方法找到一个无参结构体进行调试。 这里,传递的参数是0,继续跟进;

3.因为this调用的是当前类,因为是继承的,所以当前类继续跟进;

4、从名字就可以看出,这里新增了一个发布服务的引用,并且传入了端口(port);

5、这里继续嵌套娃娃,用参数结构调用父类,传入一个对象(实时引用),从名字就可以看出这个对象是发布远程对象的关键;

6.被调用的类有一个参数结构体,还有一个新的objID,顾名思义,就是ID号,没有必要继续调试了,我们回到上一层,继续看父级具有参数结构的类;

7、这里可以看到(实时参考)对象中有一个和TCP相关的对象,这个对象是和网络传输相关的。 当前端口号还是0,没有变化,然后将这个对象封装到ref中(远程引用);

8.显然上面的var1中的对象是被封装的,并且这个对象封装了和TCP,这里if判断了obj的类型;

判断的范围是:接口、子类、当前类,所以这一项必须通过;

后续对封装的对象进行赋值,并在返回值中调用(导出对象)方法,将对象导出;

9、这里是标准的代理写法,创建类的代理,这里后续还有很多,跳过一部分;

10. 这里有一个类。 方法用于初始化对象。 但这里有一个问题:Stub应该是有用的,但是为什么会出来呢? 通过公式创建存根,并使用存根;

11、这里即使完成了stub的创建,后面也会调用它来加载类,所以这里就不一一截图了;

12、后续可以发现端口已经被分配了随机数。 这里的端口分配可以从类中找到对应的方法(之前封装了类),到这里就完成了释放。

(6) 设立登记中心及登记表

1.方法名可以看到,是用来创建注册表的,这里是新建的,后续;

2、这个和刚才发布对象的感觉类似,也创建了一个代理类,只不过这个代理类是针对服务器本身的;

3、从下面代码的逻辑来看,很明显这也是一个创建代理类,但是和前面的不同的是,它是jdk本身的一个类,所以我们不需要自己写;

这个过程中有两个代理,一个是客户端使用的存根,另一个是服务器使用的。 我们去对应类的断点看看:

.class 创建远程对象时调用;

.class 在创建注册表时调用。

ps:这里可以看到()方法中的几个调用,但是我这里没有追踪到......

(7) 客户端向注册中心请求

1. 第一步,请求/获取注册中心。 后续跟踪发现返回值调用了一层方法,继续调试;

2、在这段代码中,我们又看到了我们的老朋友——如下,后续就是创建代理类。 后续代码也使用了这个代理类带方法,继续跟进;

3、这里有一个安全人员比较敏感的方法:(存储对象)和(反射),而这里其实就是关键点,java rmi反序列化!

第一点:我们传递一个参数是hello,这里write直接序列化我们传递的参数并写入进去,这样对面的注册中心肯定会反序列化,这里是一个攻击点;

第二点:后续是激活网络请求的方法。

4.该方法是用来处理客户请求的,这里有一个有趣的点!

5、处理请求时会抛出异常类。 如果做了一次,这里就会出现问题。 如果连接时存在恶意流,客户端在反序列化时会反序列化恶意对象,会导致客户端受到攻击,从而导致更广泛的攻击面。 因为几乎所有涉及到连接注册表的方法都会用到这个,估计rmi在设计的时候根本就没有考虑到关于这个的安全问题。 让我们继续阅读...

6、显示已经获得了一个输入流,然后这里有一个方法,写完读完后没有经过过滤,那么漏洞就来了!

7、这里可以看到var22是一个动态代理类,代理是一个方法。 继续跟进远程方法调用部分;

8.这里是动态代理,所以会去一个类,这里​​也可以看到hello,最后嵌套的是服务器刚刚打开的端口。

(8)客户端调用远程方法

1.我们在两个可能成为攻击点的位置进行调试。 调用该方法时我们可以发现,只要涉及到连接注册中心,就必须输入一次;

2.继续调试。 当函数返回值时,会进入一个()方法,这里也有一个反序列化的点;

3、如果继续调试,你会看到我们返回的一个字符串,这个字符串可能会成为攻击客户端的攻击点;

(9)代码逻辑总结

1、序列化和反序列化的关系是对称的。 当客户端传递字符串hello时,如果服务器反序列化并读取恶意参数,则可以攻击服务器;

2.反之,如果有返回值,客户端会进行反序列化读取,这样客户端和服务端就可以互相锤击了,大家可以试试!

下一期我们将为大家分享《RMI反序列化漏洞分析》的相关内容,记得继续关注!

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON