记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

Jackson-Databind框架json反序列化代码执行漏洞分析

2017-04-18 08:10

2017/04/11日ayound上报了一个Jackson Databind框架json反序列化漏洞,攻击者利用漏洞可在服务器主机上执行任意代码或系统指令,取得网站服务器的控制权。

影响版本:jackson databind 2.7.10 及2.8.9以下版本

危害等级:高

解决方案: 更新至最新版本

根据修复补丁https://github.com/FasterXML/jackson-databind/commit/6ce32ffd18facac6abdbbf559c817b47fcb622c1,发现对sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl这个类做了拦截。如下图:

1

在修复补丁下面并且给了一个testcase,如下图:

2

从testcase中可以很明显看到当ObjectMapper启用了DefaultTyping的功能之后,则可以导致任意代码执行。

具体jackson databind使用请参考https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

了解了jackson json反序列化之后,可以知道上面testcase的反序列化流程为:

  1. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties(TemplatesImpl.java:460)
  2. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:439)
  3. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:404)
  4. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.defineTransletClasses(TemplatesImpl.java:351)

这里存在一个坑:

查看jdk1.7及其之后的jdk版本中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法

3

可以看到无法通过json反序列化设置_tfactory这个值,所以tfactory为null,从而会导致空指针异常,使得jackson json反序列化失败。

继续查看jdk1.6中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法:

4

这个不需要_tfactory这个值。所以这里必须是在小于jdk1.7的环境下才可以执行任意代码。

5

  1. 查看sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:404)

6

在newInstance的时候就可以触发自定义类中的代码。

所以我们可以构造一个自定义的恶意类:

7

然后将这个class转化成byte[]

8

执行结果:

9

知识来源: seclab.dbappsecurity.com.cn/?p=1698

阅读:314387 | 评论:0 | 标签:未分类 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“Jackson-Databind框架json反序列化代码执行漏洞分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云