最後一個小章節來了,XXE寫完,這一次的30天鐵人賽基本上就告一段落了,最後只剩防護方法還有心得,開始吧!
XML External Entity attack (XML外部實體注入攻擊),是一種利用應用程式中XML解析器接受到帶有引入外部實體的指令時,若沒有設定忽略外部實體,解析器就會解析這個輸入中的外部實體部分和代碼,從而使攻擊者可以進行機密資料偷取,SSRF(類似CSRF的伺服器版本),或是進行Dos攻擊(Billion Laughs Attack)

我們又又來到這個熟悉的留言板了,這留言板經歷了我們的XSS,CSRF後,現在要來成為我們XXE的試驗場了
老樣子,在留言裡面隨便打一點甚麼並且傳送,順便擷取一下封包

可以看到已經有基礎的XML結構了,那讓我們進行一些小(?)修改來達成我們的目標
<?xml version="1.0"?>
<!DOCTYPE comment [
<!ENTITY apple SYSTEM "file:///">
]>
<comment> <text> &apple;</text></comment>
<!DOCTYPE comment> [...]> 是所謂的 DOCTYPE宣告 以及 Document Type Definition (DTD),用來定義及管理XML中出現的元素,屬性以及實體。
同時要注意的是XML下面只會出現一個根標籤,也就是範例中出現在最外圍被我們操作的 <comment> ,個人感覺他類似 JAVA 程式設計中的 Class
<!ENTITY apple SYSTEM "file:///"> 這串便是剛剛說到的實體,就是他讓我們原本的 apple 在前面多了&之後會被解析器引用並解析成實體。
他同時也是我們XXE中的XE (eXternal Entity,外部實體),因為後面的 SYSTEM 這個關鍵字讓他知道我們要的東西是XML外的資料,讓他會跑出去幫我們找file:///這個目錄內放著的檔案,並在後面 &apple; 引用時進行帶入
&apple; 這部分要注意的是如果後面不加;的話,會讓解析器發出語法錯誤
讓我們放進去執行看看

成功過關,同時讓我們刷新一下網頁,看有沒有成功讀取到file:///的資料

也成功了,不過奇妙的是不像之前一樣多新增一個留言,而是直接代替了原本留言的apple,神奇

這關目的和上一題一樣,也是要把根目錄印出來,讓我們先截取一個封包看看

這次居然是用json檔? 可是我們要傳的是xml......那我們就來改吧,把Content-type從 application/json 改成 application/xml 試試看

居然真的成功了,應該是因為網頁本身雖然預設使用者傳入的是json資料,但沒有限制Content-type,所以才能讓我們透過改Content-type直接傳入,同時裡面又有解析器,偵測到XML後就進行解析,讓我們成功進行XXE