前言
重學Top10的第二篇,希望各位大佬不要見笑。
SSRF原理
SSRF又叫服務端請求偽造,是一種由服務端發起的惡意請求,SSRF發生在應用程序允許攻擊者誘使服務器向任意域或資源發送未經授權的請求時。服務器充當代理,執行攻擊者構造的惡意請求,可能導致內部系統暴露或敏感數據泄露。
舉個例子,比如這里的百度圖片可以通過輸入的圖片的鏈接去獲取相對應圖片,那么假如我把圖片鏈接換成http:\\127.0.0.1:80那么服務器就是去請求它本地的80端口,簡單來說有一些網站功能可以去訪問指定ULR的資源,而這些URL一旦變成內網地址或者本地地址,從而可以進行本地或者內網服務探測,這就是SSRF漏洞。
?這里是我本地寫的一個遠程圖片加載器,可以通過圖片地址加載圖片。
然后把圖片地址換為http:127.0.0.1:80可以看到是能成功探取到80端口的服務的,因為我80端口沒有部署東西,所以顯示403了。
常見偽協議
http://? Web常見訪問,如http://127.0.0.1、http://127.0.0.1:8080等
file:///? 從文件系統中獲取文件內容,如,file:///etc/passwd、file:///D:/1.txt
dict://? 字典服務器協議,訪問字典資源,如,dict:///ip:6379/info
sftp:// SSH文件傳輸協議或安全文件傳輸協議
ldap:// 輕量級目錄訪問協議
tftp:// 簡單文件傳輸協議
gopher:// (常用)分布式文檔傳遞服務,可使用gopherus生成payload 有部分服務是http協議不支持通訊的,那么可以用gopher來進行通訊(如mysql,redis服務等)應用:漏洞利用 或 信息收集 通訊相關服務的時候 工具:Gopherus
SSRF繞過
-限制為必須有http://www.xxx.com 域名
采用http基本身份認證的方式繞過,即@
http://www.xxx.com@www.xxyy.com
-限制請求IP不為內網地址
當不允許ip為內網地址時:
(1)采取短網址繞過? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)采取域名解析
(3)采取進制轉換
(4)采取3XX重定向
白盒審計
我們來看一下CTF中這種白盒審計中,怎么利用以及繞過呢。
第一題沒啥過濾,直接讀取即可。
第二題可以看到過濾了127.0.0和localhost。
直接把127.0.0.1轉換為16進制的IP地址即可。
接下來這個過濾了1,0,localhost,那么再轉16進制肯定是不行了。
我們可以生產一個短鏈接來代替http://127.0.0.1/flag.php。
但是不知道為啥我這里啥也沒有,如果被過濾掉了會輸出hacker的,估計是解析失敗了。
還有一種方法是往域名里面添加個A記錄,指向127.0.0.1,那么服務器在解析域名的時候其實就是訪問了127.0.0.1。(由于自己沒有域名,所以圖片網上找的)
這一關限制host長度小于等于5,直接用127.1代替127.0.0.1即可。
這一關限制IP長度為3,直接用http://0/flag.php即可。
這題和上面就不太一樣了,先是解析我們的IP并且輸出,接著做如下判斷
- ILTER_VALIDATE_IP??:驗證是否為合法IP格式
- ??FILTER_FLAG_NO_PRIV_RANGE??:排除私有IP范圍(如
10.0.0.0/8
、192.168.0.0/16
) - ??FILTER_FLAG_NO_RES_RANGE??:排除保留IP范圍(如
127.0.0.0/8
、169.254.0.0/16
)
也就是說無論你怎么變,只要解析出來的IP是127.0.0.1都不行,那么綁定域名和進制轉換這種肯定不行了,因為你解析出來的IP都是127.0.0.1。那么此時我們可以用到重定向這個方法,把下面這個代碼放到公網服務器上面,然后去請求它,當這個腳本被請求了就會自動跳到127.0.0.1,從而實現繞過。
<?php
header("Location:http://127.0.0.1/flag.php");
其作用是:當執行該腳本時,會直接跳轉到對應的網址,即Location: 后面的網址。
同時我們也可以通過生成一個短鏈接來繞過,原理是一樣的。
這題可以看到url中必須要含有ctf,show這兩個東西才行。
直接用/ctf.@127.0.0.1/flag.php#show進行繞過,#符號后面的內容不解析,這里我猜測@前面的也不解析。
這一關題目提示了是mysql服務。
可以看到請求的參數中有url類型的,我們利用Gopher協議打一波。
可以利用gopherus這項目,生產一個利用連,這里我選擇寫入一句話代碼。
這里記得把下面的內容進行URL編碼一下,不然傳過去解碼就沒了。
執行之后成功上傳。
這題就是打redis和mysql其實差不多的。
運行腳本,類型我們選擇PHPShell,網站路徑的話一般都是默認即可,寫上一句話木馬就會生成一個利用鏈條,和上面一樣gopher://127.0.0.1:6379/_后面的進行URL編碼。
python gopherus.py --exploit redis
黑盒審計
黑盒審計的話找可能存在SSRF漏洞的功能點。
-業務功能點
1.社交分享功能:獲取超鏈接的標題等內容進行顯示
2.轉碼服務:通過URL地址把原地址的網頁內容調優使其適合手機屏幕瀏覽
3.在線翻譯:給網址翻譯對應網頁的內容
4.圖片加載/下載:例如富文本編輯器中的點擊下載圖片到本地;通過URL地址加載或下載圖片
5.圖片/文章收藏功能:主要其會取URL地址中title以及文本的內容作為顯示以求一個好的用具體驗
6.云服務廠商:它會遠程執行一些命令來判斷網站是否存活等,所以如果可以捕獲相應的信息,就可以進行ssrf測試
7.網站采集,網站抓取的地方:一些網站會針對你輸入的url進行一些信息采集工作
8.數據庫內置功能:數據庫的比如mongodb的copyDatabase函數
9.郵件系統:比如接收郵件服務器地址
10.編碼處理, 屬性信息處理,文件處理:比如ffpmg,ImageMagick,docx,pdf,xml處理器等
11.未公開的api實現以及其他擴展調用URL的功能:可以利用google 語法加上這些關鍵字去尋找SSRF漏洞
像一些PDF轉換或者PDF在線編輯的地方也會存在,添加個空白的PDF,然后寫上JS代碼。
點擊保存應用,在dnslog這里可以看到記錄。
SSRF無回顯
還有一個就是無回顯問題,這個其實也簡單,我們獲取一個dnslog地址通過SSRF去請求這個地址看其有無記錄不就可以了,還有一個方法就是公網服務器監聽一個端口,然后通過SSRF去請求這個端口,看看有無被請求到即可判斷是否存在SSRF。
總結
最后,以上僅為個人的拙見,如何有不對的地方,歡迎各位師傅指正與補充,有興趣的師傅可以一起交流學習。