21931 漏洞挖掘技巧:后反序列化利用》(2)
时间:2023-04-23 21:14 来源:网络整理 作者:墨客科技 点击:次
在上述过程中,rebind ( ) 和 lookup ( ) 方法的反序列化过程并未执行恶意操作,而是在完成反序列化之后,通过调用类 WLNamingManager 中 getObjectInstance ( ) 方法的 lookup ( ) 才触发漏洞,进行远程恶意加载 JNDI 地址操作的。 我们在 Goby 中已经集成了 CVE-2023-21931 漏洞,并加入了回显和反弹 shell 的功能。演示效果如下: 0 × 05 CVE-2023-21839 ForeignOpaqueReference 是 OpaqueReference 接口的实现类。在 ForeignOpaqueReference 类中声明了两个私有变量:jndiEnvironment 和 remoteJNDIName,同时声明了两个构造方法,在有参构造方法中接收 env 和 remoteJNDIName,并分别赋值给了上面的两个私有类变量。 ForeignOpaqueReference 类的 getReferent ( ) 方法是 OpaqueReference 接口的实现方法,在 getReferent ( ) 方法中,retVal = context.lookup ( this.remoteJNDIName ) ; 对本类 remoteJNDIName 变量中的 JNDI 地址进行远程加载,导致了反序列化漏洞。 package weblogic.jndi.internal;public class ForeignOpaqueReference implements OpaqueReference, Serializable { private Hashtable jndiEnvironment; private String remoteJNDIName; ...... public ForeignOpaqueReference ( String remoteJNDIName, Hashtable env ) { this.remoteJNDIName = remoteJNDIName; this.jndiEnvironment = env; } public Object getReferent ( Name name, Context ctx ) throws NamingException { InitialContext context; if ( this.jndiEnvironment == null ) { context = new InitialContext ( ) ; } else { Hashtable properties = this.decrypt ( ) ; context = new InitialContext ( properties ) ; } Object retVal; try { retVal = context.lookup ( this.remoteJNDIName ) ; // 漏洞点 } finally { context.close ( ) ; } return retVal; } ......} getReferent ( ) 调用分析 package weblogic.jndi;public interface OpaqueReference { Object getReferent ( Name var1, Context var2 ) throws NamingException; String toString ( ) ;} OpaqueReference 接口有两个抽象方法:getReferent ( ) 和 toString ( ) ; ForeignOpaqueReference 类的 getReferent ( ) 方法调用在 WLNamingManager 类中。 在 WLNamingManager 类的 getObjectInstance ( ) 方法中,当传入的 boundObject 对象实现了 OpaqueReference 接口时,则会调用该对象的 getReferent ( ) 方法,即 boundObject = ( ( OpaqueReference ) boundObject ) .getReferent ( name, ctx ) ;。 正如上方提到的 ForeignOpaqueReference 类实现了 OpaqueReference 接口,因此会调用该类中的 getReferent ( ) 方法,导致反序列化代码执行漏洞。 package weblogic.jndi.internal;public final class WLNamingManager { public static Object getObjectInstance ( Object boundObject, Name name, Context ctx, Hashtable env ) throws NamingException { if ( boundObject instanceof ClassTypeOpaqueReference ) { ...... } else if ( boundObject instanceof OpaqueReference ) { boundObject = ( ( OpaqueReference ) boundObject ) .getReferent ( name, ctx ) ; } else if ( boundObject instanceof LinkRef ) { ... } }} |
- 上一篇:电科网安2022年年度董事会经营评述
- 下一篇:揭秘绿盟威胁和漏洞管理体系的进化之路

