XXE漏洞詳解


 

一、XXE 是什么

XXE(XML External Entity Injection),即xml外部實體注入,由於程序在解析輸入的數據過程中,解析了攻擊者偽造的外部實體造成的攻擊。

二、什么是xml:

XML文件格式是純文本格式,在許多方面類似於HTML,XML由XML元素組成,每個XML元素包括一個開始標記(<title>),一個結束標記(</title>)以及兩個標記之間的內容,例如,可以將XML元素標記為價格、訂單編號或名稱。標記是對文檔存儲格式和邏輯結構的描述。在形式上,標記中可能包括注釋、引用、字符數據段、起始標記、結束標記、空元素、文檔類型聲明( DTD)和序言。 [5]

具體規則如下:

1、必須有聲明語句。

XML聲明是XML文檔的第一句,其格式如下:

<?xml version="1.0" encoding="utf-8"?>

2、注意大小寫

在XML文檔中,大小寫是有區別的。“<P>”和“<p>”是不同的標記。注意在寫元素時,前后標記的大小寫要保持一致。最好養成一種習慣,或者全部大寫,或者全部小寫,或者大寫第一個字母,這樣可以減少因為大小寫不匹配而產生的文檔錯誤。

3、XML文檔有且只有一個根元素

良好格式的XML文檔必須有一個根元素,就是緊接着聲明后面建立的第一個元素,其他元素都是這個根元素的子元素,根元素完全包括文檔中其他所有的元素。根元素的起始標記要放在所有其他元素的起始標記之前;根元素的結束標記要放在所有其他元素的結束標記之后。

4、屬性值使用引號

在HTML代碼里面,屬性值可以加引號,也可以不加。但是XML規定,所有屬性值必須加引號(可以是單引號,也可以是雙引號,建議使用雙引號),否則將被視為錯誤。

5、所有的標記必須有相應的結束標記

在HTML中,標記可以不成對出現,而在XML中,所有標記必須成對出現,有一個開始標記,就必須有一個結束標記,否則將被視為錯誤。

三、XXE攻擊原理:

XML是一種非常流行的標記語言,在1990年代后期首次標准化,並被無數的軟件項目所采用。它用於配置文件,文檔格式(如OOXML,ODF,PDF,RSS,...),圖像格式(SVG,EXIF標題)和網絡協議(WebDAV,CalDAV,XMLRPC,SOAP,XMPP,SAML, XACML,...),他應用的如此的普遍以至於他出現的任何問題都會帶來災難性的結果。

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

攻擊場景演示:

示例代碼:

xml.php

<?php

    libxml_disable_entity_loader (false);
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;

?>

payload:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE creds [  
<!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]> 
<creds>&goodies;</creds>

這樣即可讀取目標主機上的system.ini文件,如果文件中包含有較多的特殊字符,可能會導致報錯,這時候我們可以將文件的內容用<![CDATA[xxx]]>包裹起來,在CDATA包裹中的字符只會被當成字符元素。


四、XXE防御原理:

方案一:使用語言中推薦的禁用外部實體的方法

方案二:手動黑名單過濾(不推薦)

過濾關鍵詞:

<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM