一、概述
SSRF(Server-Side Request Forgery:服務器端請求偽造)
其形成的原因大都是由於服務端提供了從其他服務器應用獲取數據的功能,但又沒有對目標地址做嚴格過濾與限制
導致攻擊者可以傳入任意的地址來讓后端服務器對其發起請求,並返回對該目標地址請求的數據
數據流:攻擊者----->服務器---->目標地址
根據后台使用的函數的不同,對應的影響和利用方法又有不一樣
PHP中下面函數的使用不當會導致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通過后台服務器遠程去對用戶指定("或者預埋在前端的請求")的地址進行資源請求,則請做好目標地址的過濾。
二、操作
SSRF(curl)
1.打開pikacu,找到 SSRF(curl),點擊藍色a標簽,可以看到瀏覽器URL中它傳了一個url參數。
2.打開后端源代碼,可以看到它是從前端獲取了url請求,curl_init函數會對它進行初始化,然后curl_exec函數會去執行請求,最終又將請求結果返回到前端。
可以嘗試傳入一個其他的地址比如百度,可以看到頁面顯示出了百度的數據庫 (它的流程和分析的源代碼流程是一樣的,前端傳入參數,后端通過curl_exec去請求百度,最后把請求返回的百度數據返回到前端)
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
這樣的話我們可以把 url 中的內容改成內網的其他服務器上地址和端口,探測內網的其他信息
也可以通過SSRF漏洞讀取服務器的文件,在pikachu的test文件夾中新建了一個txt文件,內容如圖片所示
提交這個url后,pikachu頁面顯示出了1.txt文件中保存的內容
SSRF(file_get_content)
打開pikachu靶場,點擊標簽,可以看到和SSRF(curl)一樣的,都是通過URL上傳參數到后台獲取信息的
查看后端代碼,它和前面的邏輯是一樣的,不同的是它這里使用file_get_contents函數進行文件的讀取執行,而file_get_contents函數可以對本地文件進行讀取,也可以對遠程文件進行讀取。
我們可以像前面測試的一樣,在URL中去輸入百度的地址。它一樣也會通過http協議去獲取百度的資源
同樣去訪問我們之前在pikachu保存的txt文件
如果我們想知道它后台的PHP是怎么寫的,可以通過構造一個payload去獲取后台的PHP源碼
php://filter/read=convert.base64-encode/resource=ssrf.php
提交payload后,可以看到頁面顯示出了轉換后的php的base64編碼
提交payload后,可以看到頁面顯示出了轉換后的php的base64編碼
這樣我們就可以通過解碼從而得到PHP的源碼