看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

栏目: Java · 发布时间: 6年前

内容简介:前几天空间被CVE-2018-2894刷屏,大家也都在研究和复现这个漏洞,正好我们安全团队也在玩这个漏洞,那大家就一起来玩咯。 本次的重点是复现,上传webshell,环境是内部一个测试环境,当我使用其中一个上传页面的时候,脑子突然热了一下,把文件后缀改成了.xml,结果就很6了。地址如下:

*本文作者:黑客小平哥,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

前几天空间被CVE-2018-2894刷屏,大家也都在研究和复现这个漏洞,正好我们安全团队也在玩这个漏洞,那大家就一起来玩咯。 本次的重点是复现,上传webshell,环境是内部一个测试环境,当我使用其中一个上传页面的时候,脑子突然热了一下,把文件后缀改成了.xml,结果就很6了。

地址如下: http://127.0.0.1:8338/ws_utc/begin.do

分析

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

突然看到了什么,报错了,但是错误代码里有个“Internal Exception: org.xml.sax.SAXParseException”,这里竟然解析xml文件,这里说明一下,虽然这里是上传webshell的地方,xml文件貌似没什么用,但是当漏洞任意文件上传漏洞修复之后,这个xml文件是不会禁止的,这里既然解析了xml文件,说明这xml文件属于正常文件。

此处当然要传个payload试下了读下etc/passwd,发现还是报错,无法读取:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

这就完了?当然不是,既然无法读取回显,那就换个payload反弹下 shell 试试:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

设置本地监听:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

返回包发现执行了payload代码,并且读取到服务器etc/passwd文件:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

至此,该漏洞已经确定存在,并将及时报告给官方了,2018年10月16日,该漏洞已经在oracle发布。

漏洞简要分析:

根据路径,漏洞定位到ws-testpage-impl.jar文件里的“importWsTestConfig”方法:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

代码如下:

@Path("/config/import")
 @POST
 @Produces({"application/xml", "application/json"})
 @Consumes({"multipart/form-data"})
 public Response importWsTestConfig(FormDataMultiPart formPartParams) {if (RequestUtil.isProductionMode()) {
     return Response.status(Response.Status.SERVICE_UNAVAILABLE).build();
    }
   if (TestClientRT.isVerbose()) {
      Logger.fine("callingWebserviceResource.importWsTestConfig");
    }
 
   KeyValuesMap formParams = RSDataHelper.getInstance()
     .convertFormDataMultiPart(formPartParams, true);
 
   ActionData ad = new ActionData();
   ad.put("request_form_data", formParams);
 
   ad = new ImportTestCaseAction().process(ad);
   if (ad.get("response_data") != null) {
     return Response.ok(ad.get("response_data")).build();
    }
returnResponse.ok().build(); }

可以发现,此处使用的方法为“ImportTestCaseAction”,进去看下该方法:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

代码如下:

publicActionData execute(ActionData actionData)
  {
    KeyValuesMap formParams =(KeyValuesMap)actionData
      .get("request_form_data");
    try
    {
      String fileName =(String)formParams.getFirstValue("import_file_name");
      String importId = "" + newDate().getTime();
 
      if (TestClientRT.isVerbose()) {
        Logger.debug("Import ID: " +importId);
      }
 
      Unmarshaller Unmarshaller =context.createUnmarshaller();
      TTestConfig tconfig =(TTestConfig)Unmarshaller.unmarshal(new File(fileName));
 
      if (importConfigMap.size() >= 10) {
        importConfigMap.clear();
      }
 
      importConfigMap.put(importId, tconfig);
 
      actionData.put("response_data",new ImportTest(importId, tconfig.getWsdl(), null));
    } catch (Throwable e) {
      Logger.fine("[Error] Can not parsethe imported test config file.", e);
      WSTestRuntimeException wste = newWSTestRuntimeException(e);
      wste.setErrorMsgBean(newErrorMsgBean(null, UserMessages.format("error_while_importing_test",new Object[0])));
      throw wste;
    }
 
    return actionData;
  }

Unmarshaller接口是将XML数据转化为 Java 对象,此处是Unmarshaller使用不当,造成XXE,值得注意的是,经过和同事的不懈尝试,发现jdk8默认禁止外部DTD的,jdk6和jdk7是可以的,而weblogic默认的jdk是存在该问题的(详细版本范围有待进一步考证)。

Demo介绍:

此处jdk为1.8,无法实现XXE:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

此处jdk为1.6,即可执行:

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP 6与MySQL 5基础教程

PHP 6与MySQL 5基础教程

(美)厄尔曼 / 陈宗斌 等 / 人民邮电出版社 / 2008-11-1 / 65.00元

本书是一部经典的入门级著作,采用基于任务的方法来讲授PHP和MySQL,使用大量图片指导读者深入学习语言,并向读者展示了如何构造动态Web站点。书中用简洁、直观的步骤和讲解提供了学习任务和概念的最快方式。通过学习本书,读者可以快速、高效地掌握PHP和MySQL,成为一位构建Web站点的高手。 本书适合初中级Web应用开发和设计人员阅读。 本书是讲述PHP和MySQL技术的畅销书,以深入......一起来看看 《PHP 6与MySQL 5基础教程》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具