zoukankan      html  css  js  c++  java
  • 1020.Burp Suite扩展之Java-Deserialization-Scanner

    Java反序列化漏洞简介

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

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

    因此要利用Java反序列化漏洞,需要在进行反序列化的地方传入攻击者的序列化代码。如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。

    下面结合一些demo介绍一款用于 检测和简单利用 java 反序列化漏洞的burpsuite 扩展: Java Deserialization Scanner

    插件安装

    该插件可以在 burp Suite 的 BApp Store 中安装 , 安装好后需要配置 ysoserial(一款java反序列化漏洞payload生成器) 的路径。

    http://p1.qhimg.com/t011ac647da28188524.jpg

    你可以自己从github上下载源码,编译。或者使用我刚编译的: https://pan.baidu.com/s/1eSxPPQi   密码: nxv4. 放到 burpsuite.jar 同一目录,然后填上文件名即可(如上图所示)。

    插件测试

    插件作者很贴心,不仅写了个这么棒的插件,还附带了很多示例。我以 sampleCommonsCollections3 为例介绍该插件的使用。首先在 tomcat 中把 这个 war 包部署好。然后就可以在 webappssampleCommonsCollections3 下查看对应源码和他使用的库,该插件检测反序列化漏洞就是基于一些已知库中的gadget(依赖于  ysoserial),进行检测。进入 webappssampleCommonsCollections3 会看到

    t01bf8ed313e3c6758d.jpg

    访问 http://localhost:8008/sampleCommonsCollections3/ 就可以看到 示例的首页了(端口根据自己的情况修改,我这是 8008)。

    t0169849e5d428df25b.jpg

    这些示例根据实际代码中对 传输序列化对象的各种方式进行了模拟(直接传输,hex编码传输,base64编码传输,gzip压缩传输,以及他们的一些组合)。插件也根据这些传输方案给出了对应的解决办法。

    对未编码的序列化对象测试

    先来看看 最简单 的 testRawBody.jsp

    <html>
    <head>
    <title>Java Deserialization Testing JSP Page</title>
    </head>
    <body bgcolor=white>
    
    <h1>Java Deserialization Testing JSP Page</h1>
    <p>This is the output of a JSP page that deserialize an object sent as POST body.</p>
    
    <%@ page import = "java.io.ObjectInputStream" %>
    <%@ page import = "java.io.InputStream" %>
    <%@ page import = "java.io.ByteArrayInputStream" %>
    <%
    ObjectInputStream objectInputStream = new ObjectInputStream(request.getInputStream());
    String deserializedString = (String)objectInputStream.readObject();
    out.println("<p>Deserialized string:</p>");
    out.println("<p>" + deserializedString + "</p>");
    %>
    
    </body>
    </html>

    直接对POST过来的数据进行了 反序列化, 下面看看它的库, 进入 WEB-INFlib 目录, 

    t011e828fc928a0e580.jpg

    存在 commons-collections-3.1.jar 这个库是有利用反序列化漏洞所需要的漏洞类的。下面用插件来试试。浏览器进入 sampleCommonsCollections3/ ,burpsuite抓包,点击第一个 Serialized Java Object in body (不编码直接发送序列化对象到服务端)。

    http://p1.qhimg.com/t01b0ec578f8c2d41da.jpg

    然后右键把请求包发送到 插件中

    t01e9c754d394febcab.jpg

    设置好测试的位置

    t01fafaff18b66f0694.jpg

    最下面的一排,表示选中的数据是以什么格式编码的, 倒数第2排的那个下拉框,选择判断漏洞是否存在使用的方式,有 DNS(依赖于burpsuite的Collaborator功能来获取响应), Sleep (如果有漏洞让服务器sleep 几秒钟), 还有 cpu模式。这里选择 Sleep模式,然后 点击 Attack (因为这里的序列化对象没有被编码),等一阵就有结果了。

    http://p3.qhimg.com/t01ae48661985b3e598.jpg

    可以看到,检测出 Apache Commons Collections 3  漏洞。然后右键,

    http://p6.qhimg.com/t015ae18a7c71ace7ca.jpg

    在 Exploitation tab 在确认下,下面那个输入框下 输入  ysoserial 的参数, 这里检测出了  Apache Commons Collections 3 ,所以使用 CommonsCollections3 COMMAD 。如下图所示:

    http://p1.qhimg.com/t0144657af3290f3953.jpg

     上面会在服务器下执行 calc , 弹出一个计算器。

    下面再以 gzip 为例对 编码过的序列化对象 测试

    看看代码 webappssampleCommonsCollections3testGzipBody.jsp:

    <html>
    <head>
    <title>Java Deserialization Testing JSP Page</title>
    </head>
    <body bgcolor=white>
    
    <h1>Java Deserialization Testing JSP Page</h1>
    <p>This is the output of a JSP page that deserialize a compressed GZIP object sent as POST body.</p>
    
    <%@ page import = "java.io.ObjectInputStream" %>
    <%@ page import = "java.io.InputStream" %>
    <%@ page import = "java.io.ByteArrayInputStream" %>
    <%@ page import = "java.io.ByteArrayOutputStream" %>
    <%@ page import = "java.io.ByteArrayInputStream" %>
    <%@ page import = "java.util.zip.GZIPInputStream" %>
    <%@ page import = "java.util.Map" %>
    <%
    GZIPInputStream gzis = new GZIPInputStream(request.getInputStream());
    byte[] buffer = new byte[1024];
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int len;
    while ((len = gzis.read(buffer)) > 0) {
    	byteout.write(buffer, 0, len);
    }
    byte[] uncompressed = byteout.toByteArray();
    ByteArrayInputStream bais = new ByteArrayInputStream(uncompressed);
    ObjectInputStream objectInputStream = new ObjectInputStream(bais);
    String deserializedString = (String)objectInputStream.readObject();
    out.println("<p>Deserialized string:</p>");
    out.println("<p>" + deserializedString + "</p>");
    %>
    
    </body>
    </html>

    对数据gzip解压,然后 反序列化。

    在首页中点击 Serialized Java Object in body, compressed in GZIP, burp 抓包

    http://p3.qhimg.com/t0144a91f17c2b43305.jpg

    下面的一个问题是我们怎么这个这东西就是 序列化对象的数据呢? java 序列化对象的 开头 2个字节为 0xaced , 所以我们看到数据开头为 0xaced ,就可以大致推测这是序列化的对象。下面在介绍一个 Decompressor 插件,它用于自动的把 gzip 压缩的数据解压。该插件也可在 BApp Store中安装。安装后,在抓到的数据包中的数据是以 gzip压缩时,会增加一个 tab 来显示解压后的数据。

    http://p7.qhimg.com/t013b3099a98e467aa9.jpg

    所以这是以 gzip压缩的 序列化对象 ,然后将它发送到 Java-Deserialization-Scanner 插件, 点击 Attack Gzip 即可(其他设置和之前那个例子一样)。

    总结

    该插件使得我们发现和测试 Java 反序列化漏洞 更加容易,而且他还提供了几种针对序列化数据被编码的场景进行利用的方式,同时由于该插件是开源的,所以很方便测试人员在测试时根据情况进行扩展。

    参考

    http://blog.nsfocus.net/java-deserialization-vulnerability-comments/ 

    https://github.com/federicodotta/Java-Deserialization-Scanner

    https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/

  • 相关阅读:
    sqli-labs第五,六题
    Java 发送邮件
    Java 数据结构
    Java 序列化
    Java 文件注释
    Java 泛型
    Java 网络编程
    网站收藏
    JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
    Java 8 中的 Streams API 详解
  • 原文地址:https://www.cnblogs.com/beijibing/p/10393516.html
Copyright © 2011-2022 走看看