为了调试方便,我在win10下安装curl的工具
下载地址:https://curl.haxx.se/download.html
但目前提供的版本已经不支持gopher协议了,所以我千辛万苦找到了7.60的win64版本,支持发送gopher,dict协议
7.60地址:https://wws.lanzous.com/iaV55ekyfjc 点击即可下载
解压后把bin目录加入windows环境变量
一、什么是gopher协议?
定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
限制:gopher协议在各个编程语言中的使用限制
--wite-curlwrappers:运用curl工具打开url流
curl使用curl --version查看版本以及支持的协议
Gopher协议格式:
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
- gopher的默认端口是70
- 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
二、测试网页:
1、get请求的发送,一个简单的php网页:
<?php
$name = $_GET['name'];
echo "Hello " . $name . "<br>";
用burpsuite抓包复制整体的http请求
可以删除些信息,然后来用curl来测试一下,首先需要对http请求转码,添加%0d%0a
GET /ssrf/get.php?name=yanshu HTTP/1.1
Host: 192.168.0.111
gopher请求: (gopher的请求体前一定不能漏了_)
curl gopher://192.168.0.111:80/_GET%20/ssrf/get.php%3Fname%3Dyanshu%20HTTP/1.1%0D%0AHost%3A%20192.168.0.111%0D%0A
附上PY脚本,可以直接使用
import urllib
test =\
"""GET /ssrf/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)
请求成功:
2、post请求
测试页面:
<?php
$name = $_POST['name'];
echo "Hello " . $name . "<br/>";
但是如果只是简单地把GET包改成POST包发送,会出现大问题:
POST /ssrf/post.php HTTP/1.1
Host: 192.168.0.111
name = yanshu
gopher请求:
curl gopher://192.168.0.111:80/_POST%20/ssrf/post.php%20HTTP/1.1%0D%0AHost%3A%20192.168.0.111%0D%0A%0D%0Aname%20%3D%20yanshu%0D%0A
浏览器会无法识别你的请求;
所以想发送一个完整的POST数据包,这四个字段是不可缺少的
POST /ssrf/post.php HTTP/1.1
Host: 192.168.0.111
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
name=yanshu
注意一点:使用脚本转的时候,每次不同的content-length都是不一样的,需要修改
这样就成功疗,SSRF的学习刚刚开始,开始记录一下