---- 网易云热评
文章来源:蚂蚁非攻安全实验室 、先知白帽大会
一、序列化与反序列化

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等(\xac\Xed)
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安全工具库