Gopher 協議初探
- 最近兩天看到了字節脈搏實驗室公眾號上有一篇《Gopher協議與redis未授權訪問》的文章,其中對gopher協議進行了比較詳細的介紹,所以打算跟着后面復現學習一下,順便記錄一些身為菜雞的我所遇到的比較蠢得坑
Gopher協議
gopher
協議是一種信息查找系統,他將Internet
上的文件組織成某種索引,方便用戶從Internet
的一處帶到另一處。在WWW
出現之前,Gopher
是Internet
上最主要的信息檢索工具,Gopher站點也是最主要的站點,使用tcp70
端口。但在WWW
出現后,Gopher
失去了昔日的輝煌。現在它基本過時,人們很少再使用它。- 它只支持文本,不支持圖像
協議訪問學習
- 我們現在最多看到使用這個協議的時候都是在去
ssrf
打redis shell
、讀mysql
數據的時候,由於之前對這個協議了解不是很熟,所以這次看到這篇文章后打算借此學習一下他的通信方式 - 首先最基礎的看一下它如何發送
get
請求
復現環境
win10 + kali 2018 +
- 在
win10
主機使用nc
監聽端口,nc -lvp 192.168.109.1:6666
- 然后用
kali
使用curl gopher://192.168.109.1:6666/_abcd
發送gopher get
請求,可以發現_
不會被顯示 gopher
協議格式:gopher://IP:port/_{TCP/IP數據流}
發送http get請求
- 在gopher協議中發送HTTP的數據,需要以下三步
- 構造
HTTP
數據包 URL
編碼、替換回車換行為%0d%0a
,HTTP
包最后加%0d%0a`代表消息結束- 發送
gopher
協議, 協議后的IP
一定要接端口 curl gopher://192.168.109.166:80/_GET%20/get.php%3fparam=Konmu%20HTTP/1.1%0d%0aHost:192.168.109.166%0d%0a
get.php
中寫入<?php echo "Hello"." ".$_GET['param']."\n"?>
- 此外自己本地測試時要注意將防火牆關掉
發送http post請求
POST
與GET
傳參的區別:它有4
個參數為必要參數- 需要傳遞
Content-Type
,Content-Length
,host
,post
的參數 post.php
中寫入<?php echo "Hello".$_POST['name']."\n";?>
- 我這里復現的時候不知道什么原因一直無法將
post
的參數傳入,最終只有這種效果
小結
- 本次對於文章的學習基本對
gopher
協議有了一定的了解,對於文中后續的使用gopher
實現redis
未授權訪問和ssrf
還未進一步實現,這將是后續將要完成的任務,此外還有就是復現過程中出現post
參數不能被接受的情況要想辦法找一下問題原因和解決辦法。 - 有師傅知道原因的也希望能指點一下