一、什么是gopher

Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。允许用户使用层叠结构的菜单与文件,以发现和检索信息,它拥有世界上最大、最神奇的编目。
Gopher客户程序和Gopher服务器相连接,并能使用菜单结构显示其它的菜单、文档或文件,并索引。同时可通过Telnet远程访问其它应用程序。Gopher协议使得Internet上的所有Gopher客户程序,能够与Internet上的所有已“注册”的Gopher服务器进行对话。
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议。

  • Gopher协议格式:URL: gopher://\:\/\_后接TCP数据流
  • gopher的默认端口是70
  • 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码

用curl发起请求

curl gopher://192.168.0.111:8889/_123456
在使用gopher协议时在url后加入一个字符(该字符可随意写,在这里是占位的作用,服务器是接收不到的

发起http的GET请求

1、构造HTTP数据包(最好是直接抓包)
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议
请求包的信息是这样的。

GET /ssrf/index.php?name=A10ng_ HTTP/1.1
Host: 192.168.0.111

根据之前的步骤,改成gopher请求为。
curl gopher://192.168.0.111:8889/_GET%20/index.php%3fname=Margin%20HTTP/1.1%0d%0AHost:%20192.168.0.111%0d%0A
我用python开启的一个http服务端,通过日志能看到请求内容。

发起http的POST请求

这里的步骤跟GET是一样的。

POST /index.php HTTP/1.1
host:192.168.0.111
Content-Type:application/x-www-form-urlencoded
Content-Length:11

name=A10ng_

改成gopher请求为:
curl gopher://ip:889/_POST%20%2Findex.php%20HTTP%2F1.1%0D%0Ahost%3A192.168.0.111%0D%0A%0D%0Aname%3DA10ng_%0D%0A%0D%0A
具体的用法根据实际情况来