Java反序列化漏洞


=Start=

缘由:

学习、提高需要

正文:

参考解答:
什么是序列化、反序列化?

Java序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,Java中的ObjectOutputStream类的writeObject()方法可以实现序列化。

Java反序列化即逆过程,由字节流还原成对象。Java中ObjectInputStream类的readObject()方法用于反序列化。

反序列化漏洞的危害

当应用代码从用户接受序列化数据,并试图反序列化改数据进行下一步处理时,会产生反序列化漏洞,其中最有危害性的就是远程代码注入。

这种漏洞产生原因是,java类ObjectInputStream在执行反序列化时,并不会对自身的输入进行检查,这就说明恶意攻击者可能也可以构建特定的输入,在 ObjectInputStream类反序列化之后会产生非正常结果,利用这一方法就可以实现远程执行任意代码。

这个漏洞的严重风险在于,即使你的代码里没有使用到Apache Commons Collections里的类,只要Java应用的Classpath里有Apache Commons Collections的jar包,都可以远程代码执行。

漏洞的根源其实并不是Java序列化的问题,而是Apache Commons Collections允许链式的任意的类函数反射调用。攻击者通过允许Java序列化协议的端口,把攻击代码上传到服务器上,再由Apache Commons Collections里的TransformedMap来执行。

如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。假若反序列化可以设置Java类型的白名单,那么问题的影响就小了很多。

反序列化漏洞的补救措施/修复建议

临时方案:

一个临时的解决方案可以参考NibbleSecurity公司的ikkisoft在github上放出了一个临时补丁SerialKiller

下载这个jar后放置于classpath,将应用代码中的java.io.ObjectInputStream替换为SerialKiller,之后配置让其能够允许或禁用一些存在问题的类,SerialKiller有Hot-Reload,Whitelisting,Blacklisting几个特性,控制了外部输入反序列化后的可信类型。

修复方案:

Apache Commons Collections在 3.2.2版本中做了一定的安全处理,对这些不安全的Java类的序列化支持增加了开关,默认为关闭状态。涉及的类包括:CloneTransformer,ForClosure, InstantiateFactory, InstantiateTransformer, InvokerTransformer, PrototypeCloneFactory,PrototypeSerializationFactory, WhileClosure。

狠一点的方案:

禁止JVM执行外部命令(未知漏洞的危害性会大大降低,可以大大提高JVM的安全性)

其它:

RedHat发布JBoss相关产品的解决方案:https://access.redhat.com/solutions/2045023

参考链接:

Lib之过?Java反序列化漏洞通用利用分析
https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/

What Do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS, and Your Application Have in Common? This Vulnerability.
https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/

Java反序列化漏洞被忽略的大规模杀伤利用
http://www.infoq.com/cn/articles/java-deserialization-nsfocus

Java反序列化漏洞详解
https://www.secpulse.com/archives/42126.html

JAVA反序列化漏洞完整过程分析与调试
http://wps2015.org/drops/drops/JAVA%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%AE%8C%E6%95%B4%E8%BF%87%E7%A8%8B%E5%88%86%E6%9E%90%E4%B8%8E%E8%B0%83%E8%AF%95.html

深入理解 JAVA 反序列化漏洞
http://paper.seebug.org/312/

Commons Collections Java反序列化漏洞深入分析
https://security.tencent.com/index.php/blog/msg/97

JAVA反序列化漏洞知识点整理
https://3wapp.github.io/2017/05/07/JAVA%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86/

Java反序列化漏洞批量检测(附POC)
http://www.freebuf.com/vuls/86566.html

学习手册:JAVA序列化和反序列化及漏洞补救
http://blog.nsfocus.net/learning-guide-java-serialization-de-serialization-vulnerability-remediation/

Java反序列化漏洞被忽略的大规模杀伤利用
http://blog.nsfocus.net/java-deserialization-vulnerability-overlooked-mass-destruction/

Matthias Kaiser – Exploiting Deserialization Vulnerabilities in Java.
http://www.slideshare.net/codewhitesec/exploiting-deserialization-vulnerabilities-in-java-54707478

SerialKiller
https://github.com/ikkisoft/SerialKiller

ysoserial
https://github.com/frohoff/ysoserial

JavaUnserializeExploits
https://github.com/foxglovesec/JavaUnserializeExploits

JBoss-exp
https://github.com/Xyntax/JBoss-exp

=END=


《 “Java反序列化漏洞” 》 有 21 条评论

  1. Java 反序列化漏洞利用脚本收集
    https://github.com/CoalfireLabs/java_deserialization_exploits

    Java反序列化漏洞速查表(The cheat sheet about Java Deserialization vulnerabilities.)
    https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet

    Java Untrusted Deserialization Exploits Tools
    https://github.com/getcode2git/exserial

    All-in-one plugin for Burp Suite for the detection and the exploitation of Java deserialization vulnerabilities
    https://github.com/federicodotta/Java-Deserialization-Scanner

    Java Deserialization Exploit
    https://github.com/njfox/Java-Deserialization-Exploit

    A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.
    https://github.com/frohoff/ysoserial

    JexBoss: Jboss (and Java Deserialization Vulnerabilities) verify and EXploitation Tool
    https://github.com/joaomatosf/jexboss

    SuperSerial – Burp Java Deserialization Vulnerability Identification
    https://github.com/DirectDefense/SuperSerial

    site:github.com Java Deserialization

  2. 低漏报检测java反序列化漏洞方法
    http://www.polaris-lab.com/index.php/archives/331/
    https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/
    https://github.com/GoSecure/break-fast-serial
    http://gosecure.net/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
    `
    不需要目标系统存在漏洞的第三方库,直接使用JDK自带的URL类发起dns请求,dns请求一般可以出网,所以漏报应该很低。
    `

  3. Apache Commons Collections反序列化漏洞学习
    http://pirogue.org/2017/12/22/javaSerialKiller/
    `
    java序列化与反序列化
      定义
      Java中api实现
    概念上根本原因
    Collections漏洞原因
    漏洞形成基础知识
      java反射机制
      被序列化和反序列化的类
    Collections漏洞分析
      Collections介绍
      漏洞触发过程
    java反序列化漏洞触发链(Collections)
    `

  4. Java常见通用漏洞和修复的代码以及利用payload
    https://github.com/JoyChou93/java-sec-code
    `
    介绍
    该项目也可以叫做Java Vulnerability Code(Java漏洞代码)。
    每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里。具体可查看每个漏洞代码和注释。

    漏洞代码
      XXE
      SSRF
      URL重定向
      IP伪造
      XSS
      CRLF注入
      远程命令执行
      反序列化
      文件上传
      SQL注入
      URL白名单Bypass
      Java RMI
      Fastjson
      CORS
      JSONP
    漏洞说明
      Java RMI
      XXE
      SQLI
      Fastjson
      Others
    `

  5. 通过t3协议识别weblogic版本
    http://gv7.me/articles/2019/detection-weblogic-version-by-t3/
    http://www.liuhaihua.cn/archives/604694.html
    `
    # 识别weblogic版本有什么用呢?

    在检测weblogic漏洞之前,我们往往需要探测下weblogic版本。好判断是否在漏洞版本范围,同时也为我们构造EXP做准备(相同漏洞,可能因为weblogic版本不同需要的对应的EXP,比如CVE-2019-2725)

    如果未探测到,以下几种可能情况:
    1、t3协议未启用
    2、服务器做了负载均衡
    `

  6. Java反序列化漏洞原理解析
    https://xz.aliyun.com/t/6787
    `
    Java序列化与反序列化
    * 序列化与反序列化过程
    * readObject()方法

    Java反射
    * Java反射定义
    * 获取类对象
    * 利用类对象创建对象
    * 通过反射调用方法
    * 通过反射访问属性
    * 利用java反射执行代码

    JAVA Apache-CommonsCollections3.1 反序列化RCE漏洞分析

    Java反序列化漏洞利用
    * 触发场景
    * 相关工具
    * 实际测试

    演示源码和参考链接
    * 源码
    * 参考链接
    `

  7. Java 序列化和反序列化
    https://appts4jvi.zhishibox.net/b/5d644b6f81cbc9e40460fe7eea3c7925
    `
    1. Java 序列化和反序列化
    在很多语言中都提供了对象反序列化支持,Java在JDK1.1(1997年)时就内置了对象反序列化(java.io.ObjectInputStream)支持。Java对象序列化指的是将一个Java类实例序列化成字节数组,用于存储对象实例化信息:类成员变量和属性值。 Java反序列化可以将序列化后的二进制数组转换为对应的Java类实例。

    Java序列化对象因其可以方便的将对象转换成字节数组,又可以方便快速的将字节数组反序列化成Java对象而被非常频繁的被用于Socket传输。 在RMI(Java远程方法调用-Java Remote Method Invocation)和JMX(Java管理扩展-Java Management Extensions)服务中对象反序列化机制被强制性使用。在Http请求中也时常会被用到反序列化机制,如:直接接收序列化请求的后端服务、使用Base编码序列化字节字符串的方式传递等。

    2. Java反序列化漏洞
    自从2015年Apache Commons Collections反序列化漏洞(ysoserial的最早的commit记录是2015年1月29日,说明这个漏洞可能早在2014年甚至更早就已经被人所利用)利用方式被人公开后直接引发了Java生态系统的大地震,与此同时Java反序列化漏洞仿佛掀起了燎原之势,无数的使用了反序列化机制的Java应用系统惨遭黑客疯狂的攻击,为企业安全甚至是国家安全带来了沉重的打击!

    直至今日(2019年12月)已经燃烧了Java平台四年之久的反序列化漏洞之火还仍未熄灭。如今的反序列化机制在Java中几乎成为了致命的存在,反序列化漏洞带来的巨大危害也逐渐被我们熟知。2018年1月Oracle安全更新了237个漏洞,而反序列化漏洞就占了28.5%,由此可见Oracle对反序列化机制的深恶痛绝。2012年JEP 154提出了移除反序列化机制:JEP 154: Remove Serialization、JDK-8046144,但似乎并未通过,移除反序列化是一个持久性的工作,短期内我们还是需要靠自身去解决反序列化机制带来的安全问题。
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注