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/

  • 相关阅读:
    ABAP接口用法
    监听textarea数值变化
    The first step in solving any problem is recognizing there is one.
    Wrinkles should merely indicate where smiles have been.
    God made relatives.Thank God we can choose our friends.
    Home is where your heart is
    ABAP跳转屏幕
    Python 工具包 werkzeug 初探
    atom通过remote ftp同步本地文件到远程主机的方法
    Mongodb学习笔记一
  • 原文地址:https://www.cnblogs.com/beijibing/p/10393516.html
Copyright © 2011-2022 走看看