SSRF漏洞基础
pikachu安裝時的問題——pikachu數據庫鏈接不上以及側邊欄訪問沒有反應,只有URL加了個#原因和解決辦法_Gjqhs的博客-CSDN博客
普及SSRF漏洞原理、危害和修復方法修復
SSRF簡介
略圖
張三:有趣...
SSRF(Server-SideRequestForgery:服務器端請求偽造)是一種由攻擊者構造惡意數據,形成由服務端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統,正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統
SSRF形成的原因大都是由于服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制,比如從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等
SSRF常見場景
社交分享功能
獲取超鏈接的標題等內容進行顯示
轉碼服務
通過URL地址把原地址的網頁內容調優使其適合手機屏幕瀏覽
在線翻譯
給網址翻譯對應網頁的內容
圖片加載/下載
例如富文本編輯器中的點擊下載圖片到本地;通過URL地址加載或下載圖片
編碼處理,屬性信息處理,文件處理
如ffpmg,ImageMagick,docx,pdf,xml處理器等
url中的關鍵字:
share、wap、ur link、src source、target、u、3g、display、sourceURI
imageURl、domain...
從遠程服務器請求資源
(uploadfromurl如discuz!;import & expost rss feed如web blog;使用了xml
引擎對象的地方如wordpress xmlrpc.php)
Web應用在分享功能中,為了更好的用戶體驗,,通常會獲取目標URL地址網頁內容中的<title></title>標簽的文本內容作為顯示。如果在此功能中沒有對目標地址的范圍做過濾與限制就會造成SSRF漏洞
通過URL地址翻譯對應文本的內容
提供此功能的國內公司有百度、有道等
圖片加載與下載
許多Web服務器都存在圖片加載遠程圖片功能,但大多都是比較隱秘,比如加載本地服務器圖片用于展示。開發者為了有更好的用戶體驗通常對圖片做微小調整,例如加水印、壓縮等,這樣的做法,很大可能造成SSRF漏洞。
SSRF危害
可以對外網服務器所在內網、本地進行端口掃描,獲取服務端口的Banner信息
攻擊運行在內網或本地的應用程序(如Fastcgi,redis等)
對內網Web應用進行指紋識別,通過訪問默認文件實現(如Readme等文件)
攻擊內外網的Web應用,使用GET就可以實現的攻擊(比如Struts2,Redis等)
利用File協議讀取本地文件
SSRF漏洞產生
Curl命令
curl是常用的命令行工具,可以用來請求Web、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP,cUrl中也包含了用于程序開發的libcurl。
下段為未做任何防御的cur執行代碼
<?phpSch curl_init();Sur1 $_GET['ur1'];cur1_setopt(Sch,CURLOPT_URL,$url);echo $_GET['url'];cur1_setopt($ch,CURLOPT_FOLLOWLOCATION,1);#cur1函數可以跟隨301.302跳轉cur1_setopt($ch,CURLOPT._HEADER,1);#設置curI函數返回頭部信息cur1_setopt($ch,CURLOPT_RETURNTRANSFER,0);cur1_exec($ch);Sstatus curl_getinfo($ch);var_dump($status);cur1_close($ch);?>file_get_contents函數
通常file_get_contents在php函數中經常和**php://input**偽協議結合利用,當
file_get_contents函數的參數為url地址加載文件或者圖片時,也會造成遠程文件包含,或者ssrf漏洞
<?phpif(isset($_POST['ur1'])){$content=file_get_contents(S_POST['url']);$filename='./images/'.rand().'.img';\file_put_contents($filename,$content);echo $_POST['ur1'];$img="<img src=\"".$filename."\"/>";}echo $img;?>fsockopen函數
打開一個網絡連接或者一個Unix套接字連接
<?phpShost=S_GET['ur1'];Sfp fsockopen("Shost",80,Serrno,Serrstr,30);if (!Sfp){echo "Serrstr (Serrno)<br />\n";}else}$out ="GET / HTTP/1.1\r\n";$out .="Host:$host\r\n";$out .="Connection:close\r\n\r\n";fwrite($fp,Sout);while (!feof($fp)){echo fgets($fp,128);}fclose($fp):}?>SSRF利用方式
Http和Https協議
File協議
Dict協議
Gopher協議
File協議
file協議主要用于訪問本地計算機中的文件,命令格式為:file:///文件路徑
可以利用file協議讀取目標機有權限且確定路徑的文件
Dict協議
可以利用dict協議探測本地服務器(127.0.0.1)的端口以及內網服務器存活以及開放
端口
dict://serverip:port/命令:參數
向服務器的端口請求為【命令:參數】,并在末尾自動補上\r\n(CRLF)
Gopher協議
Gopher是Internet上一個非常有名的信息查找系統
它將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處。在
WWW出現之前,Gopher是Internet上最主要的信息檢索工具,Gopher站點也是最主要的
站點,使用tcp70端口
gopher協議支持發出GET、POST請求
可以先截獲get請求包和post請求包,在構成符合gopher協議的請求。gopher協議是ssrf
利用中最強大的協議
Gopher協議格式
gopher://<host>:<port>/<gopher-path>_后接TCP數據流
gopher的默認端口是70
如果發起post請求,回車換行需要使用%0d%0a,如果多個參數,參數之間的&也需要進行
URL編碼
Gopher協議使用限制條件
| PHP | php版本>=5.3 |
| JAVA | 小于IDK1.7 |
| Curl | 低版本不支持 |
| Perl | 支持 |
| ASP.NET | 小于版本3 |
SSRF繞過技巧
攻擊本地
http://127.0.0.1:80
http://localhost:22
利用[::]
利用[::]繞過localhost
http://[::]:80/ <==>http://127.0.0.1
利用@
http://example.com@127.0.0.1/
利用短地址
https://bit.ly/2QyXEsz <==>http:/127.0.0.1
在線短地址生成工具
http://dwz.chacuo.net/bitly利用DNS解析
在域名上設置A記錄,指向127.0.0.1
利用句號
127。0。0。1<==>127.0.0.1
利用進制轉換
可以是十六進制,八進制等
http://127.0.0.1<==>http://0177.0.0.1/
示范
打開picachu的SSRF(curl),點擊上方文字,更改訪問路徑,訪問百度。
?使用http協議讀info1.php詩
使用file協議讀本機文件內容
使用http協議進行存活ip探測
?使用http協議進行端口探測
SSRF漏洞修復
禁止跳轉
過濾返回信息
如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標準
禁用不需要的協議,僅僅允許http和https請求
可以防止類似于file://,gopher://,ftp://等引起的問題
設置URL白名單或者限制內網IP
使用gethostbyname()判斷是否為內網IP
限制請求的端口為http常用的端口
比如80、443、8080、8090
統一錯誤信息
避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態
總結
- 上一篇: Vulhub 靶场安装
- 下一篇: pikachu安装以及安装时遇到的的问题