SSRF常用的四種協議
0x00 前言
最近在項目中遇到了ssrf漏洞,并探測到了目標機器上監聽127.0.0.1的redis。嘗試用ssrf打了一波,雖然最后因權限問題沒能成功利用,但也學會了很多新東西,在這里給大家分享一下。
0x01 ssrf簡介
SSRF(Server-side Request Forge, 服務端請求偽造):是利用一個可以發起網絡請求的服務,當作跳板來攻擊內網的其他服務的漏洞。類型可分為有回顯和無回顯兩種。
漏洞產生原因:服務端提供從其他服務器應用獲取數據的功能,卻沒有對地址和協議做過濾,導致可利用此功能攻擊服務端本機或所在內網。
漏洞危害:探測內網信息、攻擊內網應用
常見場景:云服務商操作數據庫、遠程圖片加載、網站采集抓取、頭像、讓你輸入網址和ip的地方、webmail收發其他郵箱郵件、轉碼服務、在線翻譯、收藏功能等。
漏洞利用常用協議:file、http(s)、dict、gopher
0x02 file協議研究
使用file協議進行的任意文件讀取算是ssrf最簡單的利用方式了
首先先寫一段有ssrf漏洞的代碼,命名為ssrf.php并部署到服務器上。

用file協議簡單測試一下,可以看到能成功利用ssrf漏洞讀取文件。file協議的格式為:file://文件路徑

0x03 http協議研究
http協議的利用也很簡單,就是向目標發送http請求,由于get請求的參數是直接加在url里的,所以可以探測內網那些使用get請求即可攻擊的應用。

使用nc可以接收到發送的http數據包,結構非常簡單。


0x04 dict協議研究
用nc在測試機監聽,然后利用ssrf漏洞測試一下dict協議發送字符串info,看看接收方會收到什么:


可以看到一共收到了三行數據,第一行是版本號,第二行是我們發送的數據,第三行是自動添加的QUIT。
dict協議不支持換行符,沒有辦法進行換行,相當于一次只能執行一條命令,所以不能用來攻擊那些需要交互的應用(比如需要認證的redis)。

0x05 gopher協議研究
需要發送多行數據時,就要用到gopher協議,同樣使用nc簡單測試一下,可以看到接收端成功接收到了換行的數據,所以gopher協議可以用來攻擊那些需要交互的應用。


測試過程就不全放出來了,這里直接貼我得到的結論:
1、gopher協議會吃掉第一個字符,所以要先放一個沒有用的字符
2、回車是\r\n,但如果直接對\r\n進行url編碼結果是不對的,因為編碼的是\ r \ n四個字符的結果,實際回車只是兩個不可見的字符,url編碼為%0d%0a
3、直接發%可以正常接收,但是發%0d%0a就會出現數據包發不出去的問題,還需要進行一次url編碼成%250d%250a才能正常發送出去(直接用curl命令測試沒這個問題,應該是web服務器會自動進行一次url解碼導致的)
0x06 未完成的工作
1、在gopher協議的研究中發現%0d%0a會影響ssrf漏洞的正常利用,于是想到會不會有其他特殊符號同樣會影響ssrf,url編碼能否繞過。如果在實戰中遇到的ssrf漏洞利用需要使用特殊符號,最好先在本地測試一下。
2、本文由小黑在實戰中遇到了ssrf和內網redis引起,那具體對redis的利用有哪些坑,比如說如何構造符合redis接收格式的數據,如何繞過?符號引起的截斷。
3、ssrf中的http協議一般只能構造get請求,但是gopher協議實質上可以用來構造任意格式的請求,所以能不能使用gopher協議構造post請求去攻擊內網的應用呢?
4、ssrf常見的防御手段及其bypass方法。