jdk rmi 代码分析

[i][b]RMI[/b][/i]
早期对于rmi来说,客户端需要stub,服务器端需要skeleton.
[*]jdk因为有了反射,而不需要Skeleton
[*]jdk因为有了aop,而不需要Stub
[*]对于Registry来说,还是使用默认RegistryImpl_Skel,RegistryImpl_Stub.

[b][i]什么是rmi[/i][/b]
我在这里不解释他的字面意思,因为这个太原始

rmi是sun开发,遵循JRMP协议,因为他被发布在jre中,所有很多人只把它当作很普通的api来使用,所以它里面做了什么,很多人都不清楚.

rmi到底是什么?
[list]
[*]rmi是一套足够优秀的socket框架.
[*]rmi是相对比较简单命名服务
[*]rmi是aop的经典实用例子
[*]相关辅助功能,比如本地GC
[/list]

[i][b]socket框架[/b][/i]
socket框架在早期就是起一个serversocket,socket来连接它,server根据传过来的key来做相应的返回(自己的协议),这是最原始的网络开发。

目前企业开发都是面向对象,什么都是以对象为单位,所有socket框架首先就应该隐藏上面的协议,以对象为单位。

[*]对象调用
比如:Hello是一个接口,有一个print()方法。

Hello hello = ... 记住得到hello这个对象是使用aop包装过的Hello对象(jdk1.5以后,如果以前的版本得到是Hello_Stub,这个需要预先生产)
hello.print(); 远程调用在这里,包括返回。


[*]对象暴露
使用:java.rmi.server.UnicastRemoteObject.exportObject(Remote obj,int port)

在暴露的过程中产生相关remote接口的aop实现,并注册到registry中去.


[b][i]命名服务[/i][/b]
服务器端对象暴露,并把接口的aop实现注册到registry中去,客户端只需要registry.lookup接口的aop即可,并可以通过这个aop接口实现于接口真正实现通信。

[b][i]aop[/i][/b]
目前aop,在运行态使用的,我知道有两种一种是jdk中java.lang.reflect,一个就是asm。其他的好像对他们的包装,比如cglib.

[i][b]rmi的log[/b][/i]
rmi日志管理使用java.util.logging

例子logging.properties

handlers= java.util.logging.FileHandler
.level= SEVERE
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.pattern = d:\\java1.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
sun.rmi.transport.level = FINE


[b][i]rmi端口[/i][/b]
rmi分两个端口
[*]rmi名称服务端口
api使用方法:LocateRegistry.createRegistry(端口)
[*]服务端口
api使用方法:UnicastRemoteObject.exportObject(服务对象,端口),多次调用这个方法,如果端口一样,会使用同一个serversocket,不会发生错误

[b][i]spring使用[/i][/b]
spring使用包装过的rmi,服务对象不再需要实现Remote接口,
我们平时使用只会使用registryPort,而不是忘记使用servicePort.如果不指定servicePort,servicePort=0,将会有系统指定。
[i][b]
rmi属性[/b][/i]
[*]sun.rmi.transport.tcp.readTimeout:
等同于socket.setSoTimeout(int timeout),RMI默认值是2 * 3600 * 1000,2个小时.
[*]sun.rmi.transport.tcp.handshakeTimeout:
socket握手超时设置,默认一分钟.
[*]sun.rmi.transport.tcp.responseTimeout:
socket 读超时设置,只有当RMISocketFactory相关属性没有设置,才起作用,默认不超时
[*]sun.rmi.transport.connectionTimeout:
rmi的socket是长期连接的,只有timeout时,才会socket.close();默认是的值是15
[*]sun.rmi.transport.tcp.responseTimeout:
客户端socket的timeout, 默认不超时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java RMI Registry反序列化漏洞是指在JDK 8u232_b09(以及之前的版本)存在一个漏洞,导致攻击者可以利用该漏洞在目标系统上执行任意代码。 要复现这个漏洞,可以按照以下步骤进行: 1. 准备环境:首先,需要确保目标系统上安装了受影响版本的JDK,即JDK 8u232_b09或更早的版本。 2. 下载Payload:根据漏洞的特性,我们需要准备一个Payload来利用这个漏洞。可以通过搜索相关的公开Payload库或自行编写Payload。 3. 启动RMI Registry:然后,使用命令行启动RMI Registry服务,可以使用如下命令:`rmiregistry`。RMI Registry将监听默认端口1099。 4. 编写Exploit代码:使用Java编写一个包含恶意代码的Exploit程序,该程序将利用JDK 8u232_b09的反序列化漏洞执行Payload。 5. 注册Exploit:使用RMI Registry注册Exploit程序。可以使用以下代码将Exploit程序注册到RMI Registry:`Naming.rebind("Exploit", exploitObj)`,其`Exploit`是注册的名称,`exploitObj`是包含Exploit代码的对象。 6. 触发漏洞:在目标系统上执行注册了Exploit的RMI Registry服务。 7. 检查结果:如果一切正常,攻击者将成功利用反序列化漏洞执行恶意代码,可以在目标系统上执行任意操作。 需要注意的是,这个漏洞已经被修复,因此不建议将其用于非法用途。此外,对于生产环境来说,确保及时更新和升级JDK版本是最重要的安全措施之一,以防止潜在的漏洞利用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值