聲明:
由于筆者能力有限,難免出現各種錯誤和漏洞。全文僅作為個人筆記,僅供參考。
筆記内容來源于各類網課。
環境:本地環境
一、SSRF介紹
SSRF (Server Side Request Forgery,伺服器端請求僞造)是一種由攻擊者構造請求,由服務端發起請求的安全漏洞。一般情況下,SSRF攻擊的目标是外網無法通路的内部系統(正因為請求是由服務端發起的,是以服務端能請求到與自身相連而與外網隔離的内部系統)。
二、SSRF漏洞原理
SSRF的形成大多是由于服務端提供了從其他伺服器應用擷取資料的功能且沒有對目标位址做過濾與限制。例如,黑客操作服務端從指定URL位址擷取網頁文本内容,加載指定位址的圖檔等,利用的是服務端的請求僞造。
SSRF利用存在缺陷的Web應用作為代理攻擊遠端和本地的伺服器。
主要攻擊方式如下所示。
- 對外網、伺服器所在内網、本地進行端口掃描,擷取一些服務的banner資訊。
- 攻擊運作在内網或本地的應用程式。
- 對内網Web應用進行指紋識别,識别企業内部的資産資訊。
- 攻擊内外網的Web應用,主要是用HTTP GET請求就可以實作的攻擊(比如struts2、SQli等) 。
- 利用file協定讀取本地檔案等。
三、SSRF漏洞利用
内網伺服器有檔案ssrf.php,這個代碼存在SSRF漏洞。
ssrf.php存儲在:192.168.85.204
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
echo $url;
curl($url);
?>
請求設定為百度(http),會使用curl打開百度頁面。
url=http://www.baidu.com/

如果我們本地檔案
url=file:///C:/windows/win.ini
同時也可以嘗試請求内網其他主機的某些服務,例如mysql的3306端口。
在頁面SSRF.php中,程式擷取GET參數URL,通過curl init () 初始化curl元件後,将參數URL帶入curl_ setopt ($ch, CURLOPT URL, $url) ,然後調用是以curl_exec請求該URL。由于服務端會将banner資訊傳回用戶端,是以可以根據banner判斷主機是否存在某些服務,代碼如下。
四、SSRF漏洞修複
- 限制請求的端口隻能為Web端口,隻允許通路HTTP和HTTPS的請求。
- 限制不能通路内網的IP,以防止對内網進行攻擊。
- 屏蔽傳回的詳細資訊。