概述
SSRF(服務器端請求僞造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。
(正是因爲它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)
原因
由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。比如從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等。
漏洞出現點
- 分享(通過URL地址分享網頁內容)
- 轉碼服務
- 在線翻譯
- 網絡抓取
- 郵件系統
- 圖片加載與下載(通過URL地址加載或下載圖片)
- 未公開的api實現以及其他調用URL的功能
- 從URL關鍵字中尋找:share,wap,url,link,src,target,image,source…
…
危害
- 內外網的端口和服務掃描
- 主機本地敏感數據的讀取
- 內外網主機應用程序漏洞的利用
- 內外網Web站點漏洞的利用
…
漏洞產生
file_get_contents()
,fsockopen()
,curl_exec()
三個函數使用不當時將會造成ssrf
下面看一個服務器中產生ssrf的代碼,已附註釋
<?php
if (isset($_REQUEST['url'])) //獲取url
{
$link = $_REQUEST['url'];
$filename = './curled/'.time().'.txt';
$curlobj = curl_init($link); //沒過濾可控參數,直接初始化 cURL 會話。大忌!
$fp = fopen($filename,"w");
//設置 cURL 傳輸選項
curl_setopt($curlobj, CURLOPT_FILE, $fp); //設置輸出文件
curl_setopt($curlobj, CURLOPT_HEADER, 0); //將頭文件的信息作爲數據流輸出
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE); //將會根據服務器返回 HTTP 頭中的 "Location: " 重定向
curl_exec($curlobj); //執行 cURL 會話
curl_close($curlobj); //關閉會話
fclose($fp); //關閉文件,防止文件泄露
$fp = fopen($filename,"r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
?>
以上主要函數參考:https://www.php.net/manual/zh/ref.curl.php
漏洞利用
1.訪問正常文件
?url=http://www.xxx.com/robots.txt
2.使用dict://協議進行端口掃描(掃描內網的機器的端口)
?url=dict://ip:port
當訪問未開放端口,腳本會顯示空白或者報錯
當訪問開放端口時,腳本會顯示banner 信息
3.利用file://協議讀取系統本地文件
任意讀取系統本地文件(先探測下服務器系統信息,方便找敏感文件路徑)
?url=file:///etc/passwd
4.內網Web應用指紋識別
識別內網應用使用的框架,平臺,模塊以及cms可以爲後續的滲透測試提供更多的信息
大多數web應用框架都有一些獨特的文件和目錄,通過這些文件可以識別出應用的類型,甚至詳細的版本。根據這些信息就可以針對性的蒐集漏洞進行攻擊。
比如可以通過訪問下列文件來判斷phpMyAdmin是否安裝以及詳細版本
?url=http://localhost/phpmyadmin/README
5.攻擊內網應用
內網的安全通常都很薄弱,溢出、弱口令等一般都是存在的。
通過ssrf攻擊,可以實現對內網的訪問,從而可以攻擊內網應用或者本地機器,獲得shell,這裏的應用包括服務、Web 應用等。
(具體需要讀者詳細查閱相關資料,例:ssrf擴展攻擊、ssrf拿shell等)
繞過
1.本地解析
http://127.0.0.1 >>> http://localhost
2.利用[::]繞過localhost
http://[::]:80/ >>> http://127.0.0.1
3.利用@
http://example.com@127.0.0.1 >>> http://127.0.0.1
4.利用DNS解析
http://127.0.0.1.ceye.io/ >>> http://127.0.0.1
5.利用短地址
http://dwz.cn/11SMa >>> http://127.0.0.1
6.Unicode濫用
http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> http://example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
7.利用上傳
修改"type=file"爲"type=url"
比如:上傳圖片處修改上傳,將圖片文件修改爲URL,即可能觸發SSRF
8.利用句號
http://127。0。0。1 >>> http://127.0.0.1
9.利用進制轉換
可以是十六進制,八進制等
http://115.239.210.26 >>> http://16373751032
首先把這四段數字給分別轉成16進制,結果:73 ef d2 1a
然後把 73efd21a 這十六進制一起轉換成8進制
(記得訪問的時候加0表示使用八進制)
防禦
- 限制協議
僅允許http和https請求 - 限制IP
避免應用被用來獲取內網數據,攻擊內網 - 限制端口
限制請求的端口爲http常用的端口,比如,80,443,8080,8090… - 過濾返回信息
驗證遠程服務器對請求的響應是比較簡單的方法 - 統一錯誤信息
避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態
GOT IT!
******************************************************
小實驗小結,具體測試利用方式需根據具體實踐場景~