Gopher协议

Gopher协议

本文参考Margin大佬文章


什么是Gopher协议?

定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;

gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议

限制:gopher协议在各个编程语言中的使用限制

Gopher协议格式

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

Gopher发送请求HTTP GET请求:

在windows端开启一个nc监听:

不知道怎么用nc?传送门

image-20210326201104051

在kali用gopher协议向windows发送一个get请求:

C:\root> curl gopher://192.168.1.120:8989/qianxun

image-20210326201719594

windows端立即收到响应,不过第一个字符被吃掉了。

C:\root> curl gopher://192.168.1.120:8989/suibianxie

image-20210326201949083

还是一样。这是因为gopher协议的url后面要加一个字符(任意字符)。

那么如何发送HTTP的请求呢?例如GET请求。此时我们联想到,直接发送一个原始的HTTP包不就可以吗?在gopher协议中发送HTTP的数据,需要以下三步:

1、构造HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议

准备一个PHP代码:


	echo "Hello ,".$_GET["name"]."!";
?>

一个GET型的HTTP包,如下:

GET /ssrf/test/get.php?name=Qianxun HTTP/1.1
Host: 192.168.1.120

URL编码后为:

curl gopher://192.168.1.120:80/_GET%20/ssrf/test/get.php%3fname=Qianxun%20HTTP/1.1%0d%0AHost:%20192.168.1.120%0d%0A

Gopher协议_第1张图片

gopher://主机:端口//占位符+http头(需要%0d%0A回车换行)

在转换为URL编码时候有这么几个坑

1、问号(?)需要转码为URL编码,也就是%3f
2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a
3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)


Gopher发送请求HTTP POST请求:

post.php的代码为:


	echo "Hello ,".$_POST["name"]."!"."\n";
?>

发送POST请求前,先看下POST数据包的格式

要注意的是POST请求有4个参数为必要参数:

POST /ssrf/test/post.php HTTP/1.1
host:192.168.1.120
Content-Type:application/x-www-form-urlencoded
Content-Length:12

name=Qianxun

那我们将上面的POST数据包进行URL编码并改为gopher协议

curl gopher://192.168.1.120:80/_POST%20/ssrf/test/post.php%20HTTP/1.1%0d%0AHost:192.168.1.120%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:11%0d%0A%0d%0Aname=Qianxun%0d%0A

要注意gopher的url后面的占位字符。

使用curl发起gopher的POST请求后,结果为:
Gopher协议_第2张图片

你可能感兴趣的:(SSRF,gopher)