- CTF實戰:技術、解題與進階
- ChaMd5安全團隊
- 2076字
- 2023-08-28 18:13:22
1.4.1 SSRF利用
SSRF漏洞的出現場景如下。
● 需要本地訪問,請求頭無法繞過。
● 在URL中提交參數獲取文件。
● 對外發起網絡請求。
● 從遠程服務器請求資源。
● 數據庫內置功能。
● WebMail收取其他郵件。
● 文件處理、編碼處理、屬性信息處理。
1.內網訪問
在CTF中,SSRF漏洞最常見的利用方式就是探測內網,根據127.0.0.1或找到的內網IP,對內網進行訪問,結合BurpSuite可快速對目標端口進行檢測。
靶場環境為CTFHub技能樹-Web-SSRF-內網訪問。
靶場中的URL通過GET方式傳遞參數變量url的值,通過該參數調用外部資源,所以成了SSRF漏洞的入口。構造Payload訪問服務器本地資源:?url=127.0.0.1/flag.php。發送偽造后的請求,即可獲取flag。
2.偽協議
偽協議就是利用不同URL協議類型配合SSRF,也就是URL scheme機制。URL scheme是系統提供的一種機制,由應用程序注冊,其他程序通過URL scheme調用該應用程序,包括系統默認的URL scheme與應用程序自定義的URL scheme。https://www.ctfhub.com中https://就屬于系統默認的機制。
以CURL工具為例,其支持的協議如下。
● file://:訪問本地文件系統(不受allow_url_fopen與allow_url_include的影響)。
● dict://:約定服務器端偵聽的端口號。
● sftp://:基于SSH的文件傳輸協議。
● tftp://:基于lockstep機制的文件傳輸協議。
● ldap://:輕量化目錄訪問協議。
● gopher://:分布式文檔傳遞服務。
舉個例子,CTFHub技能樹-Web-SSRF-偽協議讀取文件,使用file://協議讀取flag.php的源碼,構造Payload,?url=file:///var/www/html/flag.php,發送請求即可得到flag。
3.端口掃描
內網的防護相較于外網來說較為薄弱,通過掃描服務器與內網主機的端口,可發現外網無法訪問的服務,擴大可攻擊范圍,增加攻破系統的可能性。
靶場環境為CTFHub技能樹-Web-SSRF端口掃描。與上一題環境類似,構造Payload ?url=127.0.0.1:8000可直接使用BurpSuite對端口進行爆破,使用Intruder模塊中的Sniper類型,選中8000端口號為變量,如圖1-84所示。

圖1-84 爆破端口
設置Payload類型為Numbers,這是因為題目提示端口號范圍在8000~9000之間,設置如圖1-85所示。

圖1-85 設置端口范圍
通過爆破結果的長度,獲取flag,如圖1-86所示。

圖1-86 8910端口獲得flag
也可以結合dict://協議對端口進行爆破,構造Payload ?url=dict://127.0.0.1:8000,同樣設置8000為變量,如圖1-87所示。

圖1-87 設置爆破端口
與之前的Payload設置相同,獲得爆破結果,如圖1-88所示。

圖1-88 爆破結果
根據頁面響應狀態(即返回長度)判斷結果。
4.Gopher協議
Gopher協議是HTTP出現之前在互聯網上最常見,也是最常用的協議。Gopher協議能夠傳遞底層的TCP數據流,攻擊內網的FTP、Telnet、Redis、Memcache,也可以進行GET、POST請求,所以在SSRF中Gopher協議的攻擊面最廣。
Gopher協議的格式為gopher://127.0.0.1:70/_+ TCP/IP數據,這里的_是一種數據連接格式,也可以是任意字符。Gopher協議在各種編程語言中的使用限制如表1-5所示。
表1-5 Gopher協議的使用限制

下面通過CTFHub的靶場舉幾個Gopher協議在SSRF中被利用的例子。
以CTFHub技能樹-Web-SSRF-POST請求題目為例,通過GET方式傳參訪問:?url=127.0.0.1/flag.php。查看網頁源碼,代碼如下。

其中含有key=51457bb0a50c1eb2c92dcc3ec3c2cc13,將key值添加到輸入框中并提交,得到回顯,如圖1-89所示。
使用file://協議讀取index.php以及flag.php頁面源碼:?url=file:///var/www/html/flag.php。得到index.php頁面的源碼,如圖1-90所示。

圖1-89 頁面回顯

圖1-90 index.php頁面源碼
得到flag.php頁面的源碼,如圖1-91所示。

圖1-91 flag.php頁面源碼
嘗試使用Gopher協議向服務器發送POST包。首先構造Gopher協議所需的POST請求,請求包如圖1-92所示。

圖1-92 構造請求包
在使用Gopher協議發送POST請求包時,Host、Content-Type和Content-Length請求頭是必不可少的,但在GET請求中可以沒有。
在向服務器發送請求時,瀏覽器會進行一次URL解碼,服務器收到請求后,在執行CURL功能時,進行第二次URL解碼,所以我們需要對構造的請求包進行兩次URL編碼。
首先將構造好的請求包進行第一次URL編碼,如圖1-93所示。

圖1-93 第一次URL編碼
將第一次編碼后的數據中的%0A全部替換為%0D%0A。因為Gopher協議包含的請求數據包中,可能包含=、&等特殊字符,為避免與服務器解析傳入的參數鍵值對混淆,所以對數據包進行第二次URL編碼,這樣服務端會把%后的字節當作普通字節。進行第二次URL編碼,得到如下Gopher請求內容。

因為flag.php中的$_SERVER["REMOTE_ADDR"]無法繞過,所以只能通過index.php頁面中的CURL功能向目標發送POST請求,構造如下Payload。

向目標發送數據包,得到flag,如圖1-94所示。

圖1-94 獲取flag
以CTFHub技能樹-Web-SSRF-POST上傳文件題目為例,通過GET傳參訪問?url=127.0.0.1/flag.php,得到一個空上傳功能點,如圖1-95所示。
提示需要上傳WebShell,只能選擇文件,沒有提交按鈕。使用file://協議讀取flag.php的源碼:?url=file:///var/www/html/flag.php。得到目標源碼,如圖1-96所示。

圖1-95 空上傳功能點

圖1-96 flag.php源碼
后端無任何過濾,也無文件類型限制,上傳文件大小大于0即可,如圖1-97所示。
在flag.php頁面中,還須滿足請求只允許從本地訪問,使用BurpSuite抓取數據包,如圖1-98所示。

圖1-97 上傳頁面源碼

圖1-98 BurpSuite抓包
構造Gopher協議所需的POST請求,如圖1-99所示。

圖1-99 POST請求
與之前相同,將第一次URL編碼后的數據中的%0A替換為%0D%0A,并進行二次URL編碼,如圖1-100所示。

圖1-100 URL編碼
構造Payload,發送數據包,得到flag,代碼如下。

5.攻擊Redis
Redis是一個key-value存儲系統,根據題目的提示,需要使用SSRF攻擊內網的Redis服務,使用Gopherus工具生成攻擊Redis的Payload,如圖1-101所示。
選擇PHPShell,根目錄路徑為默認值,使用默認的PHPShell,得到構造好的Gopher協議Payload,其默認經過了一次URL編碼,將%0A替換為%0D%0A,對其進行二次URL編碼,如圖1-102所示。

圖1-101 使用工具生成攻擊Redis的Payload

圖1-102 進行二次URL編碼
構造最終的Payload,代碼如下。


發送數據包,題目環境顯示504,但Shell已經寫入,訪問shell.php,結果如圖1-103所示。

圖1-103 訪問結果
雖然有臟數據,但是頁面已經存在,WebShell參數為cmd,嘗試尋找flag:shell.php?cmd=ls/。得到flag文件名,如圖1-104所示。

圖1-104 得到flag文件名
使用cat命令查看flag:shell.php?cmd=cat/flag_2596562d0e4a36c94823864f1d7a505b得到flag。其中Redis寫WebShell用到的命令如下。

需要先將其轉化為Redis RESP協議的格式,再進行URL編碼。