介紹SSRF漏洞
SSRF (Server-Side Request Forgery,服務器端請求偽造)是一種由攻擊者構造請求,由服務端發起請求的安全漏洞。一般情況下,SSRF攻擊的目標是外網無法訪問的內部系統(正因為請求是由服務端發起的,所以服務端能請求到與自身相連而與外網隔離的內部系統)。
SSRF漏洞原理
SSRF的形成大多是由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。例如,黑客操作服務端從指定URL地址獲取網頁文本內容,加載指定地址的圖片等,利用的是服務端的請求偽造。SSRF利用存在缺陷的Web
應用作為代理攻擊遠程和本地的服務器。
主要攻擊方式如下所示。
- 對外網、服務器所在內網、本地進行端口掃描,獲取一些服務的banner信息。
- 攻擊運行在內網或本地的應用程序。
- 對內網Web應用進行指紋識別,識別企業內部的資產信息。
- 攻擊內外網的Web應用,主要是使用HTTP GET請求就可以實現的攻擊(比如struts2、SQli等)。
- 利用file協議讀取本地文件等。
SSRF漏洞利用
SSRF漏洞利用的測試地址: <http://127.0.0.1/ssrf.php?url= http://127.0.0.1/2.php>。頁面ssrf.php實現的功能是獲取GET參數URL,然后將URL的內容返回網頁上。如果將請求的網址篡改為http://www.baidu.com,則頁面會顯示http://www.baidu.com的網頁內容,如下圖所示。
但是,當設置參數URL為內網地址時,則會泄露內網信息,例如,當url=192.168.0.1:80時,頁面返回192.168.1.1的80端口,如圖所示。
訪問ssrf.php?url=file:///C:/Windows/win.ini即可讀取本地文件,如圖所示。
SSRF漏洞代碼分析
在頁面SSRF.php中,程序獲取GET參數URL,通過curl init () 初始化curl組件后,將參數URL帶入curl_setopt ($ch, CURLOPT_URL, $url) ,然后調用所以curl-exec請求該URL。由於服務端會將banner信息返回客戶端,所以可以根據banner判斷主機是否存在某些服務,代碼如下。
<?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'];
curl($url);
?>
SSRF漏洞修復建議
- 限制請求的端口只能為Web端口,只允許訪問HTTP和HTTPS的請求。
- 限制不能訪問內網的IP,以防止對內網進行攻擊。
- 屏蔽返回的詳細信息。