1.SSRF漏洞概述
服務端請求偽造(Server-side Request Forge):是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。很多web應用都提供了從其他的服務器上獲取數據的功能。使用指定的URL,web應用便可以獲取圖片,下載文件,讀取文件內容等。SSRF的實質是利用存在缺陷的web應用作為代理攻擊遠程和本地的服務器。一般情況下, SSRF攻擊的目標是外網無法訪問的內部系統,黑客可以利用SSRF漏洞獲取內部系統的一些信息(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)。SSRF形成的原因大都是由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。
2.SSRF漏洞的危害
1.內外網的端口和服務掃描
2.攻擊運行在內網或者本地的應用程序
3.對內網web應用進行指紋識別,識別企業內部的資產信息
4.攻擊內網的web應用,主要是使用GET參數就可以實現的攻擊
5.向內部任意主機的任意端口發送精心構造的pPayload
6.利用file協議讀取本地敏感文件
3.漏洞代碼例子
curl造成的SSRF
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);
file_get_contents造成的SSRF
$url = $_GET['url']; echo file_get_contents($url);
fsockopen造成的SSRF
<?php function Getfile($host, $port, $link){ $fp = fsockopen($host, intval($port), $errno, $errstr, 30); if(!$fp){ echo "$errstr (error number $errno) \n"; }else{ $out = "GET $link HTTP/1.1\r\n"; $out .= "HOST $host \r\n"; $out .= "Connection: Close\r\n\r\n"; $out .= "\r\n"; fwrite($fp, $out); $content = ''; while(!feof($fp)){ $contents .= fgets($fp, 1024); } fclose($fp); return $contents; } }
4.SSRF漏洞利用
下面就簡單實現一下第三部分中curl造成的SSRF的代碼,利用SSRF漏洞實現一些簡單的攻擊.這里再看一下網頁代碼,將代碼寫在文件testSSRF.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);
利用該網頁訪問其他網頁
打開網頁向url參數傳入www.baidu.com,發現就可以訪問百度的主頁。
利用file協議讀取文件
給參數url傳入file://D:\PHPstudy_v8\install\phpstudy_pro\WWW\test\123.txt,結果可以發現可以訪問123.txt文件中的內容。
利用dict協議查看端口開放情況
利用gopher協議反彈shell......
5.SSRF常見出沒位置
(1).分享:通過URL地址分享網頁內容
(2)轉碼服務
(3)在線翻譯
(4)圖片加載與下載:通過URL地址加載或下載圖片
(5)圖片、文章收藏功能
(6)未公開的api實現以及其他調用URL的功能
(7)從URL關鍵字中尋找:share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain等。
6.SSRF漏洞修復
- 限制協議為HTTP、HTTPS,禁止不常用的協議,這樣就可以防止file,dict,gopher等引起的問題
- 不用限制302重定向
- 設置URL白名單或者限制內網IP
- 統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠程服務器的狀態
- 過濾返回的信息,如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標准
7.參考