KoreanHackerTeam
Moderator
Jackson-databind 反序列化漏洞(CVE-2017-7525)
Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特殊的 class,如TemplatesImpl
,可以实现任意代码执行。所以,本漏洞利用条件如下:
- 开启 JacksonPolymorphicDeserialization,即调用以下任意方法
코드:
|
코드:
|
- 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
:
코드:
|
코드:
|


这个POC只能运行在目标为JDK7u21以下的环境中,其他情况需要更换Gadget。
CVE-2017-17485
CVE-2017-7525黑名单修复绕过,利用了org.springframework.context.support.FileSystemXmlApplicationContext
,利用该漏洞,我们需要创建一个bean文件,放置在任意服务器上,如http://evil/spel.xml
,内容如下:
코드:
|
코드:
|
코드:
|
코드:
|

成功执行
touch /tmp/prove2.txt
: 
原理: 利用
FileSystemXmlApplicationContext
加载远程 bean 定义文件,创建 ProcessBuilder bean,并在 xml 文件中使用 Spring EL 来调用start()
方法实现命令执行