题目提示:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.
一、知识点
1.什么是gopher协议?
定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
2.Gopher协议格式:
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
- gopher的默认端口是70
- 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
3.POST请求
POST请求里面发现有4个参数为必要参数:
POST /ssrf/base/post.php HTTP/1.1
host:192.168.0.109
Content-Type:application/x-www-form-urlencoded
Content-Length:11
4.形成原因
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
比如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
二.解题
1)先访问index文件 发现curl请求数据的漏洞
curl函数的意义
例:
// 创建一个新cURL资源
$ch = curl_init(); $ch 由 curl_init() 返回的 cURL 句柄。
// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, "http://www.w3cschool.cc/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// 抓取URL并把它传递给浏览器
curl_exec($ch);
// 关闭cURL资源,并且释放系统资源
curl_close($ch);
其余的curl函数用处 可以参考http://t.csdnimg.cn/9JhFD
2.)
构造如下payload进行ssrf,从目标机本地访问flag.php
一种是在bp上进行访问发现key; 一种是在题目环境里 查看源代码 发现key
3.)
构造Gopher数据
首先记住php接受数据的时候会对数据进行一次unicode解码
所以构造的数据要进行二次编码
构造的payload:
POST /flag.php HTTP/1.1
Host:127.0.0.1:80Content-Length:36 //此处的长度为key的长度
Content-Type:application/x-www-form-urlencoded
key=f91b51e0743019e5e94095c9960e757b //后面需要接一个回车表示结束
先进行第一次url编码
其中,需要将 %0A 替换成 %0D%0A ,因为%0A是linux系统的换行符,我们是Windows系统,因此需要换成 %0D%0A或%0d%0a
再进行第二次编码:
因为我们是通过curl的伪协议:gopher发送请求包,因此需要第二次编码
数据包准备好后,就可以向flag.php文件发送了
以上步骤用网上查到的脚本一步得出数据包
4.)
把得到的数据包放在url上 得出本题的flag
https://blog.csdn.net/qq_44418229/article/details/125221655
Gopher协议在SSRF漏洞中的深入研究(附视频讲解) - Margin的文章 - 知乎
https://zhuanlan.zhihu.com/p/112055947
我在CTFHub学习SSRF - FreeBuf网络安全行业门户
主要参考资料:https://www.cnblogs.com/zap162/p/14579364.html