<?xml version="1.0" encoding="UTF-8" ?> <note> <to>Aaron</to> <from>Bill</from> <heading>提醒</heading> <body> 下午3:30在會議室303開會 </body> </note>

什麼是XML?

XML(eXtensible Markup Language),即可擴展標記語言, 是一種通用且跨平台的標記語言,旨在存儲和傳輸結構化數據。它作為一種標準格式, 用於以可讀且與機器無關的方式表示信息。XML使用標記來定義文檔中的元素, 允許用戶創建根據其具體需求定制的自定義標記。這種靈活性使XML廣泛用於不同系統和應用程序之間的數據交換。 它的自描述性質,搭配層次結構,使得人類和機器都能輕松解釋和操作數據。XML在各個領域中發揮著關鍵作用, 包括Web開發、數據存儲、配置文件以及不同系統之間的通信,促進了各種技術的互操作性。 (左邊即為典型的XML格式/架構)

什麼是DTD?

DTD( Document Type Definition),即文件類型定義, 是與XML一起使用的一種標記語言規範,用於定義XML文檔的結構以及合法的元素和屬性。基本上, DTD充當一組規則,確定了XML文件中數據的約束和組織。它定義了文檔允許的元素、它們的層次結構、 數據類型以及它們之間的關係。通過提供正式結構,DTD確保了不同實體創建的XML文檔之間的一致性和互操作性。 DTD在驗證和強制執行XML文檔完整性方面特別有用,幫助開發人員和系統保持數據的準確性並遵守預定義的標準。

右邊的DTD提供了文件組成的藍圖,指定了AddressBook由Contact組成,每個Contact人包括Name和Email。此外,諸如“Name”和“Email”之類的元素被宣告為(#PCDATA)類型,表示它們可以包含解析的字元資料(Parsed Character DATA),通常用於純文字。

<!DOCTYPE AddressBook [ <!ELEMENT AddressBook (Contact+)> <!ELEMENT Contact (Name, Email)> <!ELEMENT Name (First, Last)> <!ELEMENT First (#PCDATA)> <!ELEMENT Last (#PCDATA)> <!ELEMENT Email (#PCDATA)> ]> <AddressBook> <Contact> <Name> <First>Aaron</First> <Last>Doe</Last> </Name> <Email>aaron.doe@hoeasys.com</Email> </Contact> <!-- Additional Contact entries go here --> </AddressBook>

什麼是XML外部實體注入?

XML外部實體注入(XXE Injection, 即XML External Entity Injection), 是一種安全漏洞,發生在應用程序處理來自不受信任源的XML輸入時缺乏適當驗證的情況下。 在典型的XXE攻擊中,攻擊者會將惡意的XML實體插入輸入數據, 旨在利用應用程式對解析XML內容的外部實體的依賴性。這些實體可以引用外部檔案或資源, 導致意外揭示敏感信息、遠程代碼執行(Remote Code Execution)或拒絕服務(DOS)。 XXE Injection對處理基於XML的資料的應用程式和其他系統構成重大威脅, 強調實施適當的輸入驗證和安全編碼實踐以防止此類攻擊的重要性。 (下圖動畫即為XXE Injection的實際範例)

XXE Injection

XXE Injection的攻擊原理與防禦 ?

Youtube影片介紹什麼是XML外部實體注入(XML External Entity Injection)), 這個DEMO程式致力於展示 XXE 攻擊,使用 Java 作為主要語言,Eclipse 作為 IDE。 在整個Demo中,我們將s展示駭客如何利用 XML 技術來利用 XXE 弱點,最重要的是,如何防禦此類攻擊。 影片也使用Open Text(Micro Focus)的產品Fortify來掃描這個弱點, 找出整個造成弱點的程式流程。

XXE Injection可能造成的衝擊及影響

XML外部實體(XXE)注入是一種安全漏洞,對處理XML輸入的Web應用程序或系統的安全性產生重大影響。 以下是XXE注入的主要影響:

  • 未授權的檔案存取
  • XXE Inejction可允許攻擊者讀取伺服器上或伺服器可存取的內部系統上的檔案文件。 通過包含引用外部實體(external entities)來取得伺服器的檔案, 攻擊者可能擷取敏感信息,如設定檔、用戶憑據(user credentials)或其他機密數據。
  • 遠程代碼執行(Remote Code Execution)
  • 在某些情況下,XXE Injection可能導致遠程代碼執行,允許攻擊者在伺服器上執行任意代碼。 這可能導致受影響系統的完全入侵(complete compromise),從而導致資料被盜取、 未授權存取和潛在的服務中斷。
  • 阻斷服務攻擊(DoS)
  • XXE Inejction可用於發動阻斷服務攻擊。通過包含導致資源耗盡的惡意XML entities, 攻擊者可能使伺服器超載(overload),導致服務無法使用。
  • 敏感信息洩露
  • XXE弱點可能暴露XML檔案中包含的敏感信息。這可能包括d機敏性資料(proprietary data)、 個人信息或應用程式處理的其他機密細節。
  • 繞過(Bypassing)安全控制
  • XXE Inejction可允許攻擊者繞過安全控制,未經授權地存取受限資源。 這可能危及系統的完整性(integrity)和機密性(confidentiality)。
  • 利用(Exploitation)內部服務
  • XXE弱點可用於利用應用程式與之互動的內部服務和系統。 通過操縱XML輸入,攻擊者可能針對後端資料庫或其他連接的服務進行攻擊。
  • 對Web服務和API的影響
  • 如果應用程式依賴於基於XML的Web服務或API,XXE注入可能影響這些服務的安全性。 攻擊者可能利用弱點來操縱數據(manipulate data)、中斷服務或危及通信的完整性。
XML外部實體注入之影響 | Impact of XXE Injection |源碼檢測 | 弱點掃描 | 資訊安全 | 翊天科技有限公司
跨站腳本攻擊 防禦 | 反射式跨站腳本攻擊 防禦 | Reflected XSS Prevention | 源碼檢測 | 弱點掃描 | 資訊安全 | 翊天科技有限公司

如何防止 XXE Injection的攻擊 ?

防範 XML External Entity(XXE)Injection 並非大家在網路上找的只有Disable DTD一種方法, 主要的緩解(mitigation)策略如下

  • 禁用外部實體(Disable External Entity)
  • 在XML解析器(Parser)中禁用外部實體擴展。這可以通過設定XML解析器以忽略外部實體來實現。 在許多程式語言中,可以在XML解析器的配置中調整此設置。
  • 使用安全的XML解析器(Parser)
  • 選擇預設安全且不處理外部實體的XML解析器。例如,在Java中,使用Woodstox或Jackson XML解析器庫, 這些解析器在預設情況下不容易受到XXE Injection攻擊。
  • 輸入驗證
  • 實施嚴格的輸入驗證,以確保XML輸入符合預期格式。驗證和清理用戶輸入,防止惡意XML內容的注入。
  • 使用XML模式驗證
  • 使用XML模式定義(XSD)來驗證XML檔案的結構和數據類型。 XML模式允許您定義對XML預期結構的嚴格規則,從而提高對操縱的抵抗力。
  • 內容安全策略(CSP)
  • 實施內容安全策略以限制可以包含在XML文檔中的內容類型。 這有助於防止包含外部實體並限制可以加載的內容類型。
  • 避免使用DTD
  • 如有可能,盡量避免使用文件類型定義(DTD)。DTD通常是XXE弱點的來源, 移除它們可以減少攻擊面。
  • 隔離XML處理
  • 將XML處理與關鍵系統和敏感數據隔離。在受限環境中以最小權限運行XML解析, 以限制XXE攻擊的潛在影響。
  • 安全意識和培訓
  • 對開發人員和系統管理員進行有關XXE弱點和安全編碼的最佳實踐的教育。 安全意識有助於防止不小心引入有弱點的代碼。
  • 定期進行安全審計
  • 定期進行安全審計和滲透測試,以識別並解決應用程序中的XXE弱點。 自動工具和手動審查可用於檢測潛在的安全問題。
  • 更新程式庫(Libraries)和相關元件(Dependencies)
  • 保持XML解析庫和依賴項的最新版本。弱點通常會在新版本中被發現並修補, 因此保持當前版本對於安全至關重要。