一、SSRF漏洞定義
SSRF(Server-Side Request Forgery:服務請求偽造)是一種由攻擊者構造請求,從而讓服務端發起請求的一種安全漏洞。它將一個可以發起網絡請求的服務當作跳板來攻擊其他內部服務。SSRF的攻擊目標一般是與外部隔離的內網資源。
二、SSRF漏洞原理
當服務端提供了從其他服務器獲取數據的功能(如:從指定URL地址獲取網頁文本內容、加載指定地址的圖片、下載等),但是沒有對目標地址做過濾與限制時就會出現SSRF。
三、主要攻擊方式
1、對外網、服務器所在內外、本地進行端口掃描,獲取一些服務的banner信息
2、測試運行在內網或本地的應用程序
3、利用file協議讀取本地文件等
4、對內網web應用進行指紋識別,識別企業內部的資產信息
5、攻擊內外網的web應用,主要是使用HTTP GET請求就可以實現的攻擊(比如struts2、SQli)
四、SSRF漏洞利用
1、存在SSRF漏洞的簡要代碼
<?php
function curl($url){ //curl函數用來發送請求
$ch = curl_init(); //初始化curl
curl_setopt($ch,CURLOPT_URL,$url); //將參數URL代入
curl_setopt($ch,CURLOPT_HEADER,0);
curl_exec($ch); //執行請求該URL
curl_close($ch);
}
$url = $_GET['url']; //用戶通過構造url來進行訪問
curl($url);
?>
頁面ssrf.php實現的功能是獲取GET參數URL,然后將URL的內容返回網頁上。當設置參數為URL為內網地址時,則會泄露內網信息。當訪問.../ssrf.php?url=file: ///C: /Windows/win.ini即可讀取本地文件。
2、php中可能存在SSRF漏洞的函數
1) file_get_content()
2) fsockopen()
3) curl_exec()
...
五、漏洞繞過
部分存在漏洞,或者可能產生SSRF的功能中做了白名單或者黑名單的處理,來達到阻止對內網服務和資源的攻擊和訪問。因此想要達到SSRF的攻擊,需要對請求的參數地址做相關的繞過處理,常見的繞過方式如下:
1、限制請求IP不為內網地址
- 采用短網址繞過。比如百度短地址https://dwz.cn/
- 采用可以指向任意域名的xip.io。127.0.0.1.xip.io,可以解析為127.0.0.1
- 采用進制轉換。127.0.0.1八進制:0177.0.0.1。十六進制:0x7f.0.0.1。十進制:2130706433
2、限制請求只為http協議
利用 https://tinyurl.com 生成302跳轉地址。
六、漏洞修復
1、屏蔽返回的詳細信息。例如請求文件時,只返回文件是否請求成功,請求不成功的文件統一返回錯誤信息。
2、對請求地址設置白名單,只允許請求白名單內的地址。
3、禁用除http和https外的協議,如:file://,gopher://,dict://等。
4、限制請求的端口為固定服務端口,如:80,443。