cve-2019-2729 weblogic 12.1.3版本分析
2020-01-28 21:46:39 Author: xz.aliyun.com(查看原文) 阅读量:1291 收藏

weblogic 2729过去了这么久,一开始只有10.3.6的版本exp以及分析公开,现在12.1.3 exp也在阿里白帽大会公布了,于是分析一下。

soucre

拿10.3.6的payload来打,发现报错。

无法使用UnitOfWorkChangeSet这个类,12.1.3已经没有这个类了。

weblogic 2715禁止使用class标签了,通过DocumentHandler查看是否还有其他标签和属性是否可用。

jdk1.7比jdk1.6多了几个标签。看看有什么利用

property标签

网上有例子,并且官方有文档解释。

https://docs.oracle.com/cd/E17802_01/products/products/jfc/tsc/articles/persistence2/beanbox_Folder.1/docs/javadoc/java/beans/XMLEncoder.html

<property name="command"></property> //执行getCommand方法
<property name="command"><string>calc</string></property> //执行setCommand方法。

参数限制于java基本类型。

field标签

获取类中的静态属性。

结合起来的例子

package com.company;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class People {
    public static People people = new People("xxxx");
    String command;

    People(String command) {
        this.command = command;
    }

    public String getCommand() {
        System.out.println(this.command);
        return this.command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public static void main(String[] args) {
        java.io.File file = new java.io.File("d:/people.xml");
        java.beans.XMLDecoder xd = null;
        try
        {
            xd = new java.beans.XMLDecoder(new BufferedInputStream(new FileInputStream(file)));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        Object o = xd.readObject();
        xd.close();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_131" class="java.beans.XMLDecoder">

<field class="com.company.Test" name="people" id="peopleobj"/>

<var idref="peopleobj">
    <property name="command">
    <string>calc</string>
    </property>
    <property name="command">
    </property>
</var>

</java>

打印了cacl。总结一下我们现在能做的,调用静态属性的get set方法。void标签可以实例化,但是没办法获取class。

数据流

这里当时我找了很久,也没找到被实例化当成静态属性的危险类。类的范围被限制太死了,既然是被限制的代码执行,那能不能找下其他利用,先获取任意类,然后使用void标签进行实例化的操作,再调用实例化类的setter、getter方法。结果是能找到,而且几个类能这样利用。

通过寻找beanclass,set方法是String,get方法返回的是Class类型。
寻找staticclass,提取静态属性所有的class类型。
然后还有继承关系,如果staticclass的子类是beanclass,也算入其中。

除了公开的com.bea.xbean.schema.BuiltinSchemaTypeSystem ST_ANY_TYPE

这里我一共找了三条可以实例化任意类。

org.eclipse.persistence.internal.databaseaccess.DatabaseCall        FIRSTRESULT_FIELD
class:org.eclipse.persistence.internal.helper.DatabaseField
setter:typeName
getter:type

org.apache.xmlbeans.impl.schema.XQuerySchemaTypeSystem      ST_ANY_TYPE
class:org.apache.xmlbeans.impl.schema.SchemaTypeImpl
setter:FullJavaName
getter:JavaClass


org.apache.xmlbeans.XmlBeans        NO_TYPE
class:org.apache.xmlbeans.impl.schema.SchemaTypeImpl
setter:fullJavaName
getter:javaClass

sink

现有公开的有两种利用:
1、直接找命令执行或者文件操作的类。
weblogic.nodemanager.client.ShellClient,直接执行命令。

2、反序列化的类。
org.slf4j.ext.EventData,可以看到构造方法可以进行二次xmldecoder,并且参数也是可控的。

最后回显

阿里白帽大会weblogic议题

https://balis0ng.com/post/lou-dong-fen-xi/weblogic-wls9-asynczu-jian-rcelou-dong-fen-xi


文章来源: http://xz.aliyun.com/t/7116
如有侵权请联系:admin#unsafe.sh