Burp Suite扩展

Java反序列化漏洞简介


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

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

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

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

插件安装


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

Burp Suite扩展

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

插件测试


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

Burp Suite扩展

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

Burp Suite扩展

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

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


先来看看 最简单 的 testRawBody.jsp

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

Burp Suite扩展

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

Burp Suite扩展

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

Burp Suite扩展

设置好测试的位置

Burp Suite扩展

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

Burp Suite扩展

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

Burp Suite扩展

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

Burp Suite扩展

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

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


看看代码 webappssampleCommonsCollections3 estGzipBody.jsp:

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

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

Burp Suite扩展

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

Burp Suite扩展

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

总结


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

未经允许不得转载:小梦易专享博客-期待每一天更美好 » Burp Suite扩展

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址