官术网_书友最值得收藏!

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編碼。

主站蜘蛛池模板: 西乌珠穆沁旗| 南宁市| 怀来县| 乐清市| 长治县| 札达县| 潮安县| 循化| 惠州市| 隆尧县| 凤台县| 喜德县| 西乌珠穆沁旗| 汉川市| 靖边县| 肃北| 花莲县| 柳林县| 旌德县| 翁源县| 武冈市| 庆元县| 桦甸市| 论坛| 陈巴尔虎旗| 剑河县| 城口县| 剑阁县| 富川| 马公市| 梁平县| 麻栗坡县| 怀化市| 卫辉市| 大埔区| 来宾市| 沂水县| 台安县| 桐梓县| 友谊县| 吴江市|