XML 實體擴充套件攻擊

2021-09-19 09:03:36 字數 3572 閱讀 2909

xml entity expansion(攻擊)某種程度上類似於 xml entity expansion,但是它主要試圖通過消耗目標程式的伺服器環境來進行dos攻擊的。這種攻擊基於xml entity expansion實現,通過在xml的doctype中建立自定義實體的定義實現,比如,這種定義可以在記憶體中生成乙個比xml的原始允許大小大出很多的xml結構,來使這種攻擊得以耗盡網路伺服器正常有效執行的必需記憶體資源。這種攻擊方式同樣適用於html5的xml序列化功能模組,該模組當前還不能被libxml2擴充套件包識別為html。

要擴充套件xml自定義實體以達到預期的耗盡伺服器資源效果有好幾種方式。

通用實體擴充套件攻擊同樣被稱為「quadratic blowup attack」,使用這種方式時,自定義實體被定義為乙個極長的字串。當檔案中大量使用這個實體時,該實體在每次呼叫時都會進行擴充套件,生成乙個大幅超出原xml所需ram大小的xml結構。

<?xml version="1.0"?>

]>

now include &long; lots of times to expand

the in-memory size of this xml structure

&long;&long;&long;&long;&long;&long;&long;

&long;&long;&long;&long;&long;&long;&long;&long;

&long;&long;&long;&long;&long;&long;&long;&long;

&long;&long;&long;&long;&long;&long;&long;&long;

keep it going...

&long;&long;&long;&long;&long;&long;&long;...

通過平衡自定義實體字串大小和文件主體內使用實體數量,可以建立乙個擴充套件至占用伺服器可**ram空間大小的xml文件或字串。通過這樣重複請求來占用伺服器ram,就可以發動一次成功的拒絕服務攻擊。該方式的缺陷是,由於產生記憶體消耗效果是基於簡單數乘的,因此初始xml文件或字串本身需要足夠大。

通用實體擴充套件攻擊需要足夠大的xml輸入資料量,而遞迴實體擴充套件攻擊的平均輸入位元組能產生更強力的攻擊效果。這種攻擊方式依賴於xml解析器來解析,從而完成小實體集的指數級增長。通過這種指數**性增長方式,乙個比通用實體擴充套件攻擊使用小得多的輸入資料量實際可增長得極大。因此這種方式被稱為「xml bomb」或是「billion laughs attack」也是十分恰切的。

<?xml version="1.0"?>

]>

explode in 3...2...1...&boom;

xml bomb攻擊並不需要可能會被程式限制的大量xml資料輸入。實體集像這樣指數倍增長,最終形成的擴充套件後文字大小是初始&x0實體值的2的100次方倍。這著實是乙個龐大且毀滅性超強的炸彈!

常規和遞迴實體擴充套件攻擊都依賴於xml文件型別定義中定義在本地的實體,但是攻擊者同樣可以進行外部實體定義。這很顯然需要xml解析器能夠像我們之前在描述xml外部實體注入式攻擊(xxe)時遇到的那樣,發起遠端http請求。而拒絕這種請求對你的xml解析器而言是一種基礎的安保措施。因此,防禦xxe攻擊的措施同樣適用於此類xml實體擴充套件攻擊。

雖說可以通過上述方式進行防禦,遠端實體擴充套件通過使xml解析器發出遠端http請求來獲得被引用實體的擴充套件值來進行攻擊。返回結果將自行定義其他xml解析器必須另行http請求的外部實體。如此一來,一些看似並無攻擊性的請求會迅速脫離控制,並給伺服器的可用資源帶來負擔。這種情況下,如果請求自包括乙個遞迴擴充套件攻擊,那最終結果會更加糟糕。

<?xml version="1.0"?>

]>

3..2..1...&cascade

上述攻擊手法還有可能更加迂迴地進行dos攻擊,比如,遠端請求被調整到針對本地程式或其他任何共享其伺服器資源的程式。這種攻擊方式可能造成自我損傷式的dos攻擊,其中, xml解析器嘗試解析外部實體可能會觸發無數針對本地程式的請求,並由此消耗更多的伺服器資源。該方式因此被用於放大之前討論過的關於使用xml外部實體注入式攻擊(xxe)以完成dos攻擊的攻擊影響。

下列常規防禦措施,是從我們針對普通xml外部實體攻擊(xxe)的防禦措施繼承而來的。我們應當拒絕xml中自定義實體對本地檔案和遠端http請求的解析,並可使用以下可全域性應用於所有內部使用了libxml2函式的php或xml所書寫擴充套件的函式進行拒絕。

libxml_disable_entity_loader(true);
誠然php以不按常理出牌著稱,它並不使用常規的防禦方式。常規的防禦方式在文件型別宣告中,使用xml的文件型別定義來完全拒絕通過自定義實體的定義。php也的確為防禦功能定義了乙個替代實體的libxml_noent常量,以及domdocument::$substituteentities公共屬性,但是使用這兩條定義的防禦效果不甚明顯。似乎我們只能這樣將就解決問題,而沒有任何更好的解決方案。

雖說沒有更好的方案,libxml2函式也確實內建了預設拒絕遞迴實體解析。要知道遞迴實體要是出了問題可是能讓你的錯誤日誌」咻」地一下跟點亮聖誕樹一樣全面飄紅的。如此看來,好像也沒必要特意針對遞迴實體使用一種特殊防禦手段,儘管我們是得做點什麼來防止萬一libxml2函式突然陷回解析遞迴實體的故障裡去。

當下新型威脅主要來自generic entity expansion 或者quadratic blowup attack的粗暴攻擊方式。此類攻擊方式不需要呼叫遠端或本地系統,也不需要實體遞迴。事實上,唯一的防禦措施要麼是不用xml,要麼是清理過濾所有包含文件型別宣告的xml。除非要求的文件型別宣告接收於安全的可信源,否則最安全的做法就是不用xml了。比如,我們是由同行驗證的https連線接受的。否則,既然php沒給我們提供禁用文件型別定義的選項,那我們就只能自建邏輯了。假定你能呼叫libxml_disable_entity_loader(true),那麼後續程式執行就是安全的了,因為實體擴充套件這一步已經被遞延到被擴充套件影響的節點值可被再次訪問的時候了(然而勾選ture以後永遠都訪問不到了)。

$dom = new domdocument;

$dom->loadxml($xml);

foreach ($dom->childnodes as $child)

}

當然啦,在libxml_disable_entity_loader被設定為true的前提下,以上**才能正常執行,設定後xml初始載入的時外部實體引用就不會被解析了。除非解析器自己有一套全面的針對如何進行實體解析的控制選項,否則xml解析器不依賴libxml2函式進行解析時,恐怕這就是唯一的防禦措施了。

如果你想使用******xml函式,記得用the ******xml_import_dom()函式來轉換核驗過的domdocument專案。

本文** oneapm 官方部落格

XML 實體引用

xml 有 5 個預定的實體引用?xml 文件裡,除了表示乙個標記的開始之外,不允許有小於號 因為小於號 被 xml 解析器解總是被解釋為乙個標記的開始。if age 10 上面的寫法會導致 xml 文件的錯誤。為避免這樣的錯誤,而你又需要在 xml 文件內容裡使用小於號,你可以使用小於號的實體引用...

xml定義實體

1.實體的定義 語法 使用實體 實體名稱 比如 test 注意 定義實體需要解除安裝內部dtd裡面,如果解除安裝外部的dtd裡面,有某些瀏覽器下,內容得不到 xml version 1.0 encoding utf 8 doctype person element str pcdata attlis...

XML注入攻擊

1 檢測方法 通過爬取的url,獲取引數 get post cookie 並修改引數為 26name 3b 匹配對應返回特徵 2 測試向量 測試向量 返回特徵 26name 3b bin bash or 1 1 parent child node 00 對比初始頁面和返回頁面,返回頁面內容包含初始頁...