初识gopher协议
Gopher协议
gopher
协议是一种信息查找系统,他将Internet
上的文件组织成某种索引,方便用户从Internet
的一处带到另一处。在WWW
出现之前,Gopher
是Internet
上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70
端口。但在WWW
出现后,Gopher
失去了昔日的辉煌。现在它基本过时,人们很少再使用它。- 它只支持文本,不支持图像
以上为通用简介
为什么使用Gopher协议
gopher 协议功能很强大
它可以实现多个数据包整合发送,然后gopher 服务器将多个数据包捆绑着发送到客户端,这就是它的菜单响应。比如使用一条gopher 协议的curl 命令就能操作mysql 数据库或完成对redis 的攻击等等。
gopher 协议使用tcp 可靠连接。
Gopher协议格式
Gopher默认端口是70:
URL:gopher://<host>:<port>/<gopher-path>
<gopher-path>
可以是下面其中之一的格式:
<gophertype><selector>
<gophertype><selector>%09<search>
<gophertype><selector>%09<search>%09<gopher+_string>
如果省略<port>
,则端口默认为70。<gophertype>
是一个单字符字段,表示URL所引用资源的Gopher类型。
整个<gopher-path>
也可以为空,在这种情况下,定界“/”也是可以为空,并且<gophertype>
默认为“ 1”。
<selector>
是Gopher选择器字符串。在Gopher协议中,Gopher选择器字符串是一个八位字节序列,可以包含除09十六进制(US-ASCIIHT或制表符),0A十六进制(US-ASCII字符LF)和0D(US-ASCII字符CR)之外的任何八位字节。
<search>
用于向gopher 搜索引擎提交搜索数据,和<selector>
之间用%09隔开。
Gopher客户端通过将Gopher<selector>
字符串发送到Gopher服务器来指定要检索的项目。
简单来说,就是
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流 // /<gopher-path>可以不要,TCP流前面的_可以是任何字符都没有问题,但是一定要有
我们可以使用curl
工具来发送gopher协议的的payload,但是最新的curl已经不接受gopher协议,这个7.60版本的
只要设置好环境变量就可以使用了,懂得都懂
Gopher协议有专门的编码方式
构造符合Gopher协议的TCP流有两种方式,一是wireshark抓包,然后还原原始数据,转成hex编码,再在每两个字符前加上一个%即可。
二是使用Burpsuite抓包,然后把必要的数据复制下来,按编码转换规制转换一下即可
转换规则
1.如果第一个字符是>或者< 那么丢弃该行字符串,表示请求和返回的时间。
2.如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。
3.将\r字符串,即第一次url编码之后所有的%0a替换成%0d%0a。
4.空白行替换为%0a。
5.问号需要转码为URL编码%3f,同理空格转换成%20。
6.在HTTP包的最后要加%0d%0a,代表消息结束。
这里有一个PY脚本可以用来转换bp抓包的数据
import urllib.parse
test =\
"""GET /get.php HTTP/1.1
Host: 192.168.0.111
"""
#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result = '_'+new
print(result)
另外,GET数据包只需要开头两行即可,例如:
GET /test.php?a=Hello world HTTP/1.1
Host: 127.0.0.1
而POST数据包需要五行,例如:
POST /test.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Connection: close //这个可以没有,但是没有的话连接结束会延迟一段时间
a=Hello world
然后记得有几个重点:
*第一,利用ssrf时经常要进行多次url编码(传参或者多次跳转需要多次url编码,也就是说,有多少次请求就要编码多少次,直接curl后接gopher://
就编码一次,利用?url=gopher://
这样的形式进行ssrf利用就相当于请求了两次,需要编码两次,如果有302跳转,则还需要再编码),第一次url编码后,将所有%0a改成%0d%0a *
第二,gopher://默认发送到70端口,一般我们需要发送到80端口,记得改
这就是Gopher协议的基本内容