网络安全检测|网络安全服务|网络安全扫描-香港墨客投资移动版

主页 > 业界资讯 > 网络渗透测试

21931 漏洞挖掘技巧:后反序列化利用》(2)

在上述过程中,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 )   {

       ...

         }

     }}

(责任编辑:admin)