| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 带你掌握java反序列化漏洞及其检测 -> 正文阅读 |
|
[Java知识库]带你掌握java反序列化漏洞及其检测 |
摘要:在本文中将先介绍java反序列化漏洞的原理,然后在此基础上介绍安全工具如何检测、扫描此类漏洞。 本文分享自华为云社区《java反序列化漏洞及其检测》,作者: alpha1e0。 1 java反序列化简介java反序列化是近些年安全业界研究的重点领域之一,在Apache Commons Collections 、JBoss 、WebLogic 等常见容器、库中均发现有该类漏洞,而且该类型漏洞容易利用,造成的破坏很大,因此影响广泛。 在本文中将先介绍java反序列化漏洞的原理,然后在此基础上介绍安全工具如何检测、扫描此类漏洞。 1.1 什么是反序列化Java 序列化是指把 Java 对象转换为字节序列的过程,序列化后的字节数据可以保存在文件、数据库中;而Java 反序列化是指把字节序列恢复为 Java 对象的过程。如下图所示: 序列化和反序列化通过ObjectInputStream.readObject()和ObjectOutputStream.writeObject()方法实现。 在java中任何类如果想要序列化必须实现java.io.Serializable接口,例如:
java.io.Serializable其实是一个空接口,在java中该接口的唯一作用是对一个类做一个?标记?让jre确定这个类是可以序列化的。 同时java中支持在类中定义如下函数:
这两个函数不是java.io.Serializable的接口函数,而是约定的函数,如果一个类实现了这两个函数,那么在序列化和反序列化的时候ObjectInputStream.readObject()和ObjectOutputStream.writeObject()会主动调用这两个函数。这也是反序列化产生的根本原因 例如:
该类在反序列化的时候会执行命令,我们构造一个序列化的对象,name为恶意命令,那么在反序列化的时候就会执行恶意命令。 在反序列化的过程中,攻击者仅能够控制“数据”,无法控制如何执行,因此必须借助被攻击应用中的具体场景来实现攻击目的,例如上例中存在一个执行命令的可以序列化的类(Hello),利用该类的readObject函数中的命令执行场景来实现攻击 1.2 反序列化漏洞示例复现在这里我们构造一个有漏洞的靶场进行漏洞复现测试:使用spring-boot编写一个可以接收http数据并反序列化的应用程序。 使用?https://start.spring.io/?生成一个spring-boot应用,选择Maven Project、java8 下载到本地,导入IDE,修改?pom.xml?加入 Apache Commons Collections 3.1 依赖(该版本存在反序列化漏洞)
修改 DemoApplication.java 为如下代码
此时我们就完成了一个有 Apache Commons Collections 漏洞的验证靶场,启动该靶场应用 我们使用ysoserial 生成攻击payload:
然后使用httpie 发送攻击payload(poc)
这时候就可以看到poc中的命令执行了 1.3 反序列化漏洞解析在1.2 的示例中我们使用了 ysoserial 的 CommonsCollections5 这个payload,本节我们对此poc进行分析
可以最终反序列化的对象为 javax.management.BadAttributeValueExpException ,在该类提供了 readObject 方法,在其中有问题的地方为
这里的 valObj 为 TiedMapEntry(lazyMap, “foo”) ,该类的toString方法
其中 this.getValue 为
而 this.map 为 lazyMap = LazyMap.decorate(innerMap, transformerChain),在 lazyMap 中
在其中看到,没有找到key的时候,调用了 this.factory.transform(key) 而this.factory为我们构造的包含payload的执行链?transformerChain?该transformer会最终通过反射执行命令。 2 java反序列化漏洞检测在1中的原理介绍中,我们可以看到,反序列化漏洞需要依赖执行链来完成攻击payload执行。由于反序列化漏洞的特性,在检测的时候漏洞扫描工具一般聚焦已知漏洞的检测,而未知漏洞的检测,安全工具能力非常有限,一般需要专业人员通过安全审计、代码审计等方式发现。 java反序列化漏洞依赖于两个因素:
因此对应的漏洞扫描工具也需要根据这两个因素进行检测。 2.1 白盒工具检测白盒代码审计工具,可通过在调用链中查找是否有发序列化的操作:
但仅仅依靠以上信息不足以判断是否存在漏洞,还需要判断代码中是否有存在*执行链**的三方依赖。在java中,一般通过分析 pox.xml build.gradle 文件来分析是否包含有漏洞的组件。 2.2 黑盒漏洞扫描器检测web漏洞扫描器检测原理和白盒工具不一样。 首先漏洞扫描器要解决的是识别出反序列化的请求,在这里需要注意的是web漏洞扫描是无法通过爬虫方式直接发现反序列化接口的,因此往往需要配合其他web漏洞扫描器的组件(例如代理组件)来识别反序列化接口,如下图所示 如今web漏洞扫描器都提供了代理组件来发现应用的http请求,爬虫组件可通过前台页面触发请求进入代理组件;但在API场景下,还是需要测试人员进行API调用该操作才能够产生http请求数据。 在截获到http请求数据后,代理组件可以通过两种方式判断一个请求是否是序列化请求:
在确定一个接口是序列化接口的时候会漏洞扫描器会发送探测payload判断接口是否有反序列化漏洞,这里的攻击payload类似于1.2节中使用的ysoserial?工具,由于绝大多数情况下不可能看到回显(http返回数据没有攻击执行结果),因此只能进行盲注,即发送 sleep 10 这样的命令,根据响应时间判断是否有漏洞。 文末福利:华为云漏洞扫描服务VSS?基础版限时免费体验>>> |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:41:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |