由 webdav 功能引發的 RCE
再開始今天的內容之前,首先理解一個東西 WebDav,WebDAV (Web-based Distributed Authoring and Versioning) 一種基于 HTTP 1.1協議的通信協議。它擴展了HTTP 1.1,在GET、POST、HEAD等幾個HTTP標準方法以外添加了一些新的方法,使應用程序可對Web Server直接讀寫,并支持寫文件鎖定(Locking)及解鎖(Unlock),還可以支持文件的版本控制。
如果網站服務器啟用 WebDav 并且給與所有權限,那么任意用戶都可以遠程上傳、刪除和修改服務器上的文件,從而導致服務器被上傳 webshell。
大部分網站并非未授權就可以訪問,如果未經授權去訪問資源會提示 401 Unauthorized ,而驗證方式是通過 basic 認證,在 header 中添加如下格式:
Authenticate: Basic YWRtMW46cEBzJHdvcmQ=
其中 amlnc2F3OmppZ3Nhdw== 是 base64 編碼,編碼前的內容是 adm1n:p@s$word,也就是認證需要的賬號密碼。
漏洞發現過程
下面就是我發現漏洞的過程:
1、首次訪問時,未加任何認證信息,返回信息認證錯誤的信息,如圖:

2、由于是賬號密碼錯誤,所以嘗試去找找看,webdav 的默認賬號密碼是什么,說不定目標沒有改呢:

3、使用 burp 對默認賬號密碼的組合,進行 base64 編碼,然后嘗試認證,發現賬號密碼還是不對:

4、在一個博客中發現 xampp 的默認 webdav 的賬號密碼:

5、再次使用 burp 編碼之后,進行嘗試,發現認證成功了:

嘗試 webdav 文件,返回 301 自動跳轉 webdav 目錄:

嘗試 webdav 目錄,返回 200 狀態碼:

6、接下來使用 OPTIONS 方法來看看目標允許那些方法,發現允許 PUT 方法:

7、那么就使用 PUT 方法來上傳一個文本文件試試,發現創建成功了:

8、嘗試上傳一個 html 文件,填入 xss 的 payload,也成功上傳:

訪問驗證一下:

9、由于目標網站是 xampp 搭建的 php 網站,所以嘗試上傳一個 php 的 webshell:

訪問發現 phpinfo 運行結果:

10、當我再次上傳 php 文件時,返回 204 狀態碼,可能是因為文件已存在,沒有新創建文件,而是重寫了文件:

11、然而,在驗證 shell 是否可用時,訪問鏈接:
https://www.mytarget.com/webdav/Jerry.php and added *?JerryCommand=id*
發現命令執行成功:

12、接下來嘗試反彈 shell,參考反彈 shell 的備忘錄:
https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

13、在 vps 上使用 nc 監聽一個端口:

14、看看目標系統上是否存在 python:

使用 which python 命令能告訴我們目標系統使用的是 python2 還是 python3。
15、接下來使用 python 的反彈 shell payload 進行嘗試,反連我的服務器:

vps 上獲得了一個 shell,說明反彈 shell 成功:

到這里整個測試就結束了。
這個漏洞是怎么發現的?
1、首先目標啟用了 webdav,并且使用了默認的賬號密碼,如果不是默認賬號密碼,那么就需要進行暴力破解,但是爆破的成功率不見得有多高,如果無法獲取賬號密碼,則無法進行后續的測試。
2、webdav 允許所有方法,尤其是比較危險的 PUT、DELETE、COPY 等
安全建議
1、不要使用默認的認證信息
2、在無法禁用 webdav 的情況下,禁止 PUT 等危險方法