簡介
SSRF:服務器請求偽造,是一種攻擊者構造形成由服務端發起請求 的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)
個人理解:服務器接收了你構造的代碼,然后去執行,執行后將結果返回給你
SSRF原理
大都是因為服務端提供從其他服務器獲取數據功能,并且沒有對目標地址做過濾和限制造成的、比如從指定URL獲取網頁加載圖片下載等等。
php下面函數的使用不當可能會導致SSRF
curl()
file_get_contents()
fsockopen()
例子
觀察URL,發現服務端提供了URL查詢
嘗試訪問百度及本機3306端口
訪問成功獲取信息,確定存在ssrf漏洞
下面我們來查看一下源碼到底為什么會導致這個漏洞
<?php
if (isset($_GET["url"])) {
if (!empty($_GET["url"])) {$url = $_GET['url'];
}
$ch = curl_init();//初始化curl會話
curl_setopt($ch, CURLOPT_URL, $url);//指定請求的url
curl_setopt($ch, CURLOPT_HEADER, 0);// 啟用時會將頭文件的信息作為數據流輸出。參數為1表示輸出信息頭,為0表示不輸出
curl_exec($ch);
curl_close($ch);
}
可以看到采用了curl函數請求URL資源回顯在前端,并且沒做任何過濾或限制。從而導致了用戶可能可以通過這個漏洞進行一些內網服務探測等等。非常危險!
file_get_contents造成的SSRF
$url = $_GET['url'];
echo file_get_contents($url);
利用php://input偽協議
file_get_content如果訪問一個不存在的地址,會爆出絕對路徑
ssrf危害
1. 掃內網
2. 向內部任意主機的任意端口發送精心構造的Payload
3. DOS攻擊(請求大文件,始終保持連接Keep-Alive Always)
4. 攻擊內網的web應用,主要是使用GET參數就可以實現的攻擊(比如struts2,sqli等)
5. 利用file協議讀取本地文件等(file_get_content函數,利用偽協議讀取)
ssrf驗證方式和常見的地方
1.因為SSRF漏洞是構造服務器發送請求的安全漏洞,所以我們就可以通過抓包分析發送的請求是否是由服務器的發送的來判斷是否存在SSRF漏洞
2.在頁面源碼中查找訪問的資源地址 ,如果該資源地址類型為 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
排除法1
你可以直接右鍵圖片,在新窗口打開圖片,如果是瀏覽器上URL地址欄是http://www.baidu.com/img/bd_logo1.png,說明不存在SSRF漏洞。
排除法2
你可以使用burpsuite等抓包工具來判斷是否不是SSRF,首先SSRF是由服務端發起的請求,因此在加載圖片的時候,是由服務端發起的,所以在我們本地瀏覽器的請求中就不應該存在圖片的請求.(host www.baidu.com就不是)
ssrf修復方式
可以采取白名單,限制內網Ip。
對返回內容進行識別
禁用一些不必要的協議
統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態