java序列化是指把java的对象转化为字节序列的一个过程,便于储存;ObjectOutputStream类的writeObject()方法可以实现序列化,反序列化就是把字符序列恢复为java对象的 的过程;ObjectInputStream类的readObject()用于反序列化.
序列化和反序列化本身并不存在问题。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。
1.1 反序列化漏洞
借用Java反序列化和Apache Commons Collections这一基础类库实现远程命令执行
WebLogic、WebSphere、JBoss、Jenkins、OpenNMS的最新版
某个可序列化的类重写了readObject()方法,并且在readObject()中对Map类型的变量进行了键值修改操作,并且这个Map变量是可控的,就可以实现我们的攻击目标
1.2漏洞挖掘
基本手段:从可控的反序列化或间接的反序列化接口入手,在此基础上尝试构造序列化对象
首先:找到一个接收外部输入的序列化对象的接收点,也就是反序列化的触发点.通过readObject()反序列化函数进行查找;或者对java序列化数据的特征为以标记(ac ed 00 05)开头。
通过先前找到的传入对象方式进行对象注入,数据中载入payload(使用ysoserial来生成反序列化的payload,指定库名和想要执行的命令),触发受影响应用中ObjectInputStream的反序列化操作,随后通过反射调Runtime.getRunTime.exec即可完成利用。
1.3防御手段
weblogic防御
• 过滤T3协议,限定可连接的IP
• 设置Nginx反向代理,实现t3协议和http协议隔离
原生反序列化防御
• 不要反序列化不可信的数据
• 给反序列数据加密签名,并确保解密在反序列之前
• 给反序列化接口添加认证授权
• 反序列化服务只允许监听在本地或者开启相应防火墙
• 升级第三方库
• 升级JDK,JEP290