rmi 反序列化漏洞_Java反序列化漏洞自动挖掘方法
你说什么最难受,是相爱的人见不了面,还是最爱的人在别人身边。。。
---- 网易云热评
文章来源:蚂蚁非攻安全实验室 、先知白帽大会
一、序列化与反序列化
1、定义:序列化是用于将对象转换成二进制串存储,对应着 writeObject,反序列正好相反,将二进制串转换成对象,对应着 Freadobject
2、各编程语言都存在:
Java: java.io.Serializable接口、fastjson、jackson、gson
PHP: serialize()、 unserialize()
Python:pickle
3、使用场景
http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4s),MII等
Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMI,JMS,JND1等(xacXed)
xm lXstream,XmldEcoder等(http Body:Content-type: application/xml)
json(jackson,fastjson)http请求中包含
二、Java反序列化过程
1. 对象实例化
sun.misc.Unsafe#allocateInstance
通过反射调用构造函数
2. 成员变量还原
Setter和getter方法
通过反射直接设置
成员变量的处理(例如:PriorityQueue)
三、Java反序列化漏洞(PriorityQueue)
四、Java反序列化漏洞挖掘
1、寻找一个类,通过构造一个对象,使其在被反序列化时能执行到危险(sink)方法。
2、寻找一个类,存在可能的执行路径,从反序 列化入口(source)方法执行到危险(sink)方法自动化搜索)
3、构造这个对象,使危险(sink)方法参数可控。(手工打造)
五、 自动化挖掘实现
1、在静态分析中,这是一个典型的可达性分析问题。
2、 可达性分析 - may分析:无需绘制控制流图,只需搜素调用树。
六、、 调用树搜索实现
1、深度优先搜索(DFS) vs 广度优先搜索(BFS)
调用路径越长,payload越难构造 ;搜索深度有限 ;等价于搜索一个n叉树(n>100)的前几层;调用链的存储
2、深度优先搜索(DFS)
搜索停止条件:到达指定深度;搜索到sink方法
搜索结果保存: 使用stack保存路径
七、搜索中的多态问题
1、由于面向对象中多态性的存在,只有在运行时 才能确定调用哪个子类的eat方法。
2、多态的处理
构建类、接口和方法继承树(双向树)
寻找调用的方法的实现所在类的所有子类集合
在上述集合中寻找调用者类的子类的集合
这些子类中重写的方法即为所有可能调用的方法
八、路径成环
搜索到CircleChain的hashCode方法时,这个方法调用了Object#hashCode方法,寻找Object的子类会再找到CircleChain
类,形成环。
九、路径爆炸
以下方法的实现会造成路径爆炸
1、Java.util.List#get方法
2、Java.lang.Object#toString方法
3、java.util.Iterator#hasNext方法
十、路径爆炸成环问题解决
1. 搜索深度限制(兜底)
2. 已搜索方法缓存
1. 先缓存、后搜索
2. 缓存方法signature
4. 调用链缓存
只需要构造C方法执行时的上下文,使其与链2一致即可
十一、Jackson反序列化漏洞挖掘
1、简介
Jackson是一个开源的Java序列化与反序列化工具,可以将java对象序列化为xml或json格式的字符串,或者反序列化回对应的对象,由于其使用简单,速度较快,且不依靠除
JDK外的其他库,被众多用户所使用。
Jackson也是Spring MVC默认的json解析库,打开多态之后,jackson会根据json中传入的类名进行反序列化
相比其他后来开发的json解析库来说,jackson有灵活的API,可以很容易根据需要进行扩展和定制。
2、Jackson历史漏洞
CVE-2017-7525:RCE
CVE-2017-17485:RCE
CVE-2018-14718:RCE
CVE-2019-12086:任意文件读取
CVE-2019-12384:RCE(要求反序列化后再序列化payload)
CVE-2019-14379:RCE (要求反序列化后再序列化)
3、Jackson反序列化过程
对象初始化:
调用类的无参初始化方法
调用包含一个基础类型参数的构造函数,并且这个参数可控
对象中成员变量赋值:
将json看成key-value对,key与field不一定一一对应。
首先看key是否存在setter方法,如果存在setter方法,则会通过反射调用setter方法
否则看在这个类中是否存在与key同名的field,如果存在,则通过反射直接赋值。
否则看是否存在对应的getter方法,且getter的返回值是Collection或者Map的子类,如果满足这个条件,则会调用这个getter方法
如果以上条件都不满足,则抛出异常
4、反序列化的source method
Jackson反序列化显式调用的方法:仅包含一个基本类型参数的构造函数;Setter方法;返回值是Collection或者Map的子类的getter方法;
反序列化过程中隐式调用的方法:hashCode;compare
5、Jackson反序列化的sink method
命令执行:
• java.lang.reflect.Method#invoke
• javax.naming.Context#lookup
• javax.naming.Context#bind
• java.lang.Runtime#exec
• java.lang.ProcessBuilder#ProcessBuilder
文件读取:
• java.sql.Driver#connect MySQL客户端任意文件读取
• org.xml.sax.XMLReader#parse
• javax.xml.parsers.SAXParser#parse
• javax.xml.parsers.DocumentBuilder#parse
6、Jackson反序列化漏洞搜索结果
CVE-2019-12086:
com.mysql.cj.jdbc.NonRegisteringDriver#connect(String, Properties)-->
com.mysql.cj.jdbc.admin.MiniAdmin#MiniAdmin(String, Properties)-->
com.mysql.cj.jdbc.admin.MiniAdmin#MiniAdmin(String)
CVE-2017-7525:
com.sun.jndi.toolkit.url.GenericURLContext#lookup(String)-->
javax.naming.InitialContext#lookup(String)-->
com.sun.rowset.JdbcRowSetImpl#connect()-->
com.sun.rowset.JdbcRowSetImpl#setAutoCommit(boolean)
javax.xml.parsers.SAXParser#parse(InputSource, DefaultHandler)-->
org.mortbay.xml.XmlParser#parse(InputSource)-->
org.mortbay.xml.XmlConfiguration#XmlConfiguration(String)
CVE-2019-12814
com.sun.xml.internal.fastinfoset.sax.SAXDocumentParser#parse(InputSource)-->
org.apache.xalan.processor.TransformerFactoryImpl#newTemplates(Source)-->
org.jdom.transform.XSLTransformer#XSLTransformer(Source)-->
org.jdom.transform.XSLTransformer#XSLTransformer(String)
禁止非法,后果自负
欢迎关注公众号:web安全工具库
rmi 反序列化漏洞_Java反序列化漏洞自动挖掘方法相关推荐
- rmi 反序列化漏洞_java反序列化漏洞—被低估的破坏之王
[IT168 资讯]IT168 资讯]近日,2015年最为被低估的,具有巨大破坏力的漏洞浮出水面.在FoxGlove Security安全团队的@breenmachine 发布一篇博客中介绍了该漏洞在 ...
- java httpinvoker漏洞_Java反序列化漏洞学习
序列化是Java提供的一种对象持久化保存的技术.常规对象在程序结束后会被回收,如果想把对象持久保存方便下次使用,需要序列化和反序列化. 序列化有两个前提: 类必须实现java.io.serializa ...
- rmi反序列化导致rce漏洞修复_JAVA反序列化漏洞解决办法
一.漏洞描述: 近期,反序列化任意代码执行漏洞持续发酵,越来越多的系统被爆出存在此漏洞.Apache Commons工具集广泛应用于JAVA技术平台,存在Apache Commons Componen ...
- ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例
ref:https://www.anquanke.com/post/id/84922 PHP反序列化漏洞成因及漏洞挖掘技巧与案例 一.序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加 ...
- rmi远程反序列化rce漏洞_Oracle WebLogic 反序列化远程命令执行漏洞预警
报告编号:B6-2019-041901 报告来源:360-CERT 报告作者:360-CERT 更新日期:2019-04-19 0x00 事件背景 2019年4月17日,国家信息安全漏洞共享平台(CN ...
- php+反序列化代码执行漏洞,PHP反序列化漏洞
0x001 漏洞产生原理 在反序列化的过程中自动触发了某些魔术方法.未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致XSS.代码执行.文件写入.文件读取等不可控后果. 0x ...
- java 漏洞挖掘_Java XXE漏洞典型场景分析
本文首发于oppo安全应急响应中心: 0x01 前言: XML 的解析过程中若存在外部实体,若不添加安全的XML解析配置,则XML文档将包含来自外部 URI 的数据.这一行为将导致XML Extern ...
- 个php反序列化漏洞,PHP反序列化漏洞学习(一)
前言:PHP反序列化也是web安全中常见的一种漏洞,这次就先来大致了解一下PHP反序列化漏洞的基础知识. 一.PHP序列化和反序列化 在学习PHP反序列化漏洞时,先来了解一下基础的知识. (一)PHP ...
- jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
###漏洞原理 反序列化是指特定语言中将传递的对象序列化数据重新恢复为实例对象的过程,而在这个过程中会执行一系列的字节流解析和对象实例化操作用于恢复之前序列化时的对象.在原博文所提到的那些 Java ...
- 详述WebLogic反序列化远程命令执行漏洞的处理过程,云和恩墨技术通讯精选
各位亲爱的用户/读者朋友们: 为了及时共享行业案例,通告共性问题,达成知识共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>(5月刊),通过对过去一段时间的知识回顾和故障归纳,以期提供有 ...
最新文章
- 线性代数与矩阵论 定理 1.5.6 拉格朗日插值公式
- stm32 udp连续发送大量数据_TCP和UDP详解
- php 析构不执行,PHP析构方法 __destruct() 不触发的两个解决办法
- 如何用python创建一个下载网站-用Python写一个简单的网页下载
- ASP.NET MVC 向浏览器发送文件以提供文件下载功能
- Android+Java中使用RSA加密实现接口调用时的校验功能
- Pixhawk飞控源码目录结构及编译流程分析
- 前端学习(2286):react之无状态组件
- Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方
- mat 释放_Square Ma?mat住宅区:释放公共空间,连接社区居民
- STM32串口开发之环形缓冲区
- nginx + tomcat + redis 部署项目,解决session共享问题。
- 关于SVN提交注释的问题
- 时间操作(JavaScript版)—最简单比较两个时间格式数据的大小
- 编程英文单词的标准缩写
- 2017 十款最佳iPhone渗透APP及工具
- 删除IBM常见软件进程释放系统资源
- ARCGIS中的子类型(SUBTYPE)认识
- 宏碁电脑BIOS没有usb启动项怎么办?
- 爱快路由器使用L2TP线路做出口
热门文章
- IntelliJ IDEA安装lombok
- springmvc(2)Controller源码简单解析
- NAT篇 双剑合璧,无往不利——双向NAT
- 华为note10能更新鸿蒙系统吗,华为官方再次确认!荣耀手机也能升级鸿蒙OS系统:内测机型遭到曝光...
- 大数据概念思维导图_【数据整理】一份思维导图,学完Tableau Prep(下)
- 计算机将在1分钟重启,Win10开机经常提示将在一分钟后自动重启如何处理
- linux openssh升级8.1,ssh服务升级8.1
- 电脑花屏是屏幕坏了吗_电脑开机屏幕花的是不是主板坏了
- python 复制列表内容_python 复制列表的六种方法
- 单机多实例数据库搭建过程