肾么事Gopher协议
定义
但是它的特殊性在于它支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议。
它的协议格式
1 | URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流 |
- gopher的默认端口是70
- 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
- 使用Gopher协议时需要在url后加入一个字符(随便写)因为这个字符会在传过去的时候被自动忽略掉
Gopher发送请求HTTP GET请求
如何使用gopher协议发送HTTP的数据呢?需要以下三步:
- 构造http数据包
- url编码、替换回车换行为%0d%0a
- 发送gopher协议
比如一个GET型的http包,如下:
1 | GET /ssrf/base/get.php?name=Margin HTTP/1.1 |
url编码后为:
1 | gopher://192.168.0.109:80/_GET%20/ssrf/base/get.php%3fname=Margin%20HTTP/1.1%0d%0AHost:%20192.168.0.109%0d%0A |
在转换为url编码的时候需要注意以下几点:
- 问号(?)需要转码为url编码,也就是%3f
- 回车换行要变为%0d%0a,但是如果直接用工具转,可能只会有%0a
- 在http包的最后要加%0d%0a,代表消息结束
Gopher发送请求HTTP POST请求
POST数据包的格式为:
(ps:以下几个参数是提交post请求的时候必须有的参数)
1 | POST /ssrf/base/post.php HTTP/1.1 |
将上面的post数据包进行url编码并且改为Gopher协议为:
1 | gopher://192.168.0.109:80/_POST%20/ssrf/base/post.php%20HTTP/1.1%0d%0AHost:192.168.0.109%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:11%0d%0A%0d%0Aname=Margin%0d%0A |
这里给出一个post修改的python脚本:
1 |
|
比如:
1 | exp="""POST /flag.php HTTP/1.1 |