java反序列化漏洞及其检测
【摘要】1java反序列化简介java反序列化是近些年安全业界研究的重点领域之一 , 在ApacheCommonsCollections、JBoss、WebLogic等常见容器、库中均发现有该类漏洞 , 而且该类型漏洞容易利用 , 造成的破坏很大 , 因此影响广泛 。 在本文中将先介绍java反序列化漏洞的原理 , 然后在此基础上介绍安全工具如何检测、扫描此类漏洞 。 1.1什么是反序列化Java序列化是指...
java反序列化是近些年安全业界研究的重点领域之一 , 在ApacheCommonsCollections、JBoss、WebLogic等常见容器、库中均发现有该类漏洞 , 而且该类型漏洞容易利用 , 造成的破坏很大 , 因此影响广泛 。
在本文中将先介绍java反序列化漏洞的原理 , 然后在此基础上介绍安全工具如何检测、扫描此类漏洞 。
Java序列化是指把Java对象转换为字节序列的过程 , 序列化后的字节数据可以保存在文件、数据库中;而Java反序列化是指把字节序列恢复为Java对象的过程 。 如下图所示:

文章图片
序列化和反序列化通过ObjectInputStream.readObject()和ObjectOutputStream.writeObject()方法实现 。
在java中任何类如果想要序列化必须实现java.io.Serializable接口 , 例如:publicclassHelloimplementsjava.io.Serializable{Stringname;}
java.io.Serializable其实是一个空接口 , 在java中该接口的唯一作用是对一个类做一个标记让jre确定这个类是可以序列化的 。
同时java中支持在类中定义如下函数:privatevoidwriteObject(java.io.ObjectOutputStreamout)throwsIOExceptionprivatevoidreadObject(java.io.ObjectInputStreamin)throwsIOException,ClassNotFoundException;
这两个函数不是java.io.Serializable的接口函数 , 而是约定的函数 , 如果一个类实现了这两个函数 , 那么在序列化和反序列化的时候ObjectInputStream.readObject()和ObjectOutputStream.writeObject()会主动调用这两个函数 。 这也是反序列化产生的根本原因
例如:publicclassHelloimplementsjava.io.Serializable{Stringname;privatevoidreadObject(java.io.ObjectInputStreamin)throwsIOException,ClassNotFoundException{Runtime.getRuntime().exec(name);}}
该类在反序列化的时候会执行命令 , 我们构造一个序列化的对象 , name为恶意命令 , 那么在反序列化的时候就会执行恶意命令 。
在反序列化的过程中 , 攻击者仅能够控制“数据” , 无法控制如何执行 , 因此必须借助被攻击应用中的具体场景来实现攻击目的 , 例如上例中存在一个执行命令的可以序列化的类(Hello) , 利用该类的readObject函数中的命令执行场景来实现攻击
在这里我们构造一个有漏洞的靶场进行漏洞复现测试:使用spring-boot编写一个可以接收http数据并反序列化的应用程序 。
使用https://start.spring.io/生成一个spring-boot应用 , 选择MavenProject、java8

文章图片
下载到本地 , 导入IDE , 修改pom.xml加入ApacheCommonsCollections3.1依赖(该版本存在反序列化漏洞)commons-collectionscommons-collections3.1
修改DemoApplication.java为如下代码packagecom.example.demo;importjava.io.IOException;importjava.io.ObjectInputStream;importjavax.servlet.http.HttpServletRequest;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.GetMapping;@SpringBootApplication@RestControllerpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}@GetMapping("/hello")publicStringhello(){return"helloworld";}//反序列化接口@PostMapping("/rmi")publicStringrmi(HttpServletRequestrequest){try{ObjectInputStreamois=newObjectInputStream(request.getInputStream());Objectobj=(Object)ois.readObject();return"unmarshal"+obj.getClass().getName()+"ok";}catch(ClassNotFoundException|IOExceptione){return"unmarshalfailed";}}}
- RTX|RX 7900 XT部分游戏性能反超RTX 4090 N饭强烈不满:这次过于激动了
- 程序员|程序员的口味变了!C++首次逆袭JAVA:跻身最受欢迎编程语言TOP3
- Java|华为笔记本双12大促开启 智慧体验让办公学习更高效
- 5G|多款取暖器双十二价格比平时高,平台客服:价格波动遵从商家意愿,不违反规定
- Java|京东第一刀落下:多个副总裁卸任 刘强东嫡系人手接管
- Java|荣耀Magic5Pro很大胆,16GB+5000mAh+100W,香喷喷
- 现如今电脑已经成为了家家户户必备的电子产品之一了|电脑开机无反应要怎么解决?
- 一般来说|显示器usb接口为什么没反应?
- VMware|博通610亿美元收购VMware交易遇阻,欧盟将启动反垄断调查
- 司机|男子帮摔倒大爷报警反被讹引热议:已和解 对方赔偿男子2000元误工费
