WebLogic CVE-2019-2647~2650 XXE漏洞分析

释放双眼,带上耳机,听听看~!
Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)@xxlegend在《weblogicCVE-2019-2647等相关XXE

Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)


@xxlegend在《weblogic CVE-2019-2647等相关XXE漏洞分析》分析了其中的一个XXE漏洞点,并给出了PoC。刚入手java不久,本着学习的目的,自己尝试分析了其他几个点的XXE并构造了PoC。下面的分析我尽量描述自己思考以及PoC构造过程,新手真的会踩很多莫名其妙的坑。感谢在复现与分析过程中为我提供帮助的小伙伴@Badcode,没有他的帮助我可能环境搭起来都会花费一大半时间。


补丁分析,找到漏洞点

根据JAVA常见XXE写法与防御方式(参考https://blog.spoock.com/2018/10/23/java-xxe/),通过对比补丁,发现新补丁以下四处进行了setFeature操作:



应该就是对应的四个CVE了,其中ForeignRecoveryContext@xxlegend大佬已经分析过了,这里就不再分析了,下面主要是分析下其他三个点

分析环境


  • Windows 10

  • WebLogic 10.3.6.0

  • Jdk160_29(WebLogic 10.3.6.0自带的JDK)



WsrmServerPayloadContext 漏洞点分析

WsrmServerPayloadContext修复后的代码如下:

package weblogic.wsee.reliability;

import …

public class WsrmServerPayloadContext extends WsrmPayloadContext {

    public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException {

        …

        }

        private EndpointReference readEndpt(ObjectInput var1, int var2) throws IOException, ClassNotFoundException {

            …

            ByteArrayInputStream var15 = new ByteArrayInputStream(var3);

            try {

                DocumentBuilderFactory var7 = DocumentBuilderFactory.newInstance();

                try {

                    String var8 = "http://xml.org/sax/features/external-general-entities";

                    var7.setFeature(var8, false);

                    var8 = "http://xml.org/sax/features/external-parameter-entities";

                    var7.setFeature(var8, false);

                    var8 = "http://apache.org/xml/features/nonvalidating/load-external-dtd";

                    var7.setFeature(var8, false);

                    var7.setXIncludeAware(false);

                    var7.setExpandEntityReferences(false);

                } catch (Exception var11) {

                    if (verbose) {

                        Verbose.log("Failed to set factory:" + var11);

                    }

                }

           …

        }

}


可以看到进行了setFeature操作防止xxe攻击,而未打补丁之前是没有进行setFeature操作的


readExternal在反序列化对象时会被调用,与之对应的writeExternal在序列化对象时会被调用,看下writeExternal的逻辑:



var1就是this.formENdpt,注意var5.serialize可以传入三种类型的对象,var1.getEndptElement()返回的是Element对象,先尝试新建一个项目构造一下PoC:


结构如下



public class WeblogicXXE1 {

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

        Object instance = getXXEObject();

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("xxe"));

        out.writeObject(instance);

        out.flush();

        out.close();

  &am

给TA买糖
共{{data.count}}人
人已赞赏
Web安全

WebLogic CVE-2019-2647、CVE-2019-2648、CVE-2019-2649、CVE-2019-2650 XXE漏洞分析

2019-5-2 9:05:50

Web安全

【漏洞预警】致远OA系统存在远程任意代码执行高危漏洞

2019-6-27 3:09:06

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索