Web安全——服务器端请求伪造(SSRF)

2023-05-16

SSRF

概述

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。通常发生在图片转储,文本加载等地方。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NduRDNQe-1647150625517)(../../images/ssrf.png)]

原理

由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

漏洞场景

  1. 分享:通过URL地址分享网页内容

  2. 转码服务

  3. 在线翻译

  4. 图片加载与下载:通过URL地址加载或下载图片

  5. 图片、文章收藏功能

  6. 未公开的api实现以及其他调用URL的功能

  7. 从URL关键字中寻找

漏洞利用

  1. 可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
  2. 攻击运行在内网或本地的有漏洞程序(比如溢出);
  3. 可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹
  4. 攻击内网或外网有漏洞的Web应用
  5. 使用file协议,dict协议,gropher协议,ftp协议等读取本地文件
  6. 通过请其大文件进行Dos攻击
  7. 加载外部的恶意木马文件执行
  8. 加载内部的敏感文件程序自身的敏感文件
  9. 访问内网进行内网端口的扫描、获取内网设备信息、枚举内网服务等。

示例

  1. @

    对于一个 url 的访问实际上是以 @符后为准的,比如说 xxxx.com@10.10.10.10,则实际上访问的是 10.10.10.10 这个地址。

    http://abc@127.0.0.1
    

    http://127.0.0.1
    
  2. 添加端口号

    http://127.0.0.1:8080
    
  3. 短地址

    http://dwz.cn/11SMa
    
  4. 指向任意ip的域名:xip.io

    例如 10.10.10.10.xip.io 会被解析成 10.10.10.10,详细介绍可以通过 xip.io 这个网站来查看。

    <pre> <strong> 10.0.0.1</strong>.xip.io   resolves to   10.0.0.1
     www.<strong>10.0.0.1</strong>.xip.io   resolves to   10.0.0.1
     mysite.<strong>10.0.0.1</strong>.xip.io   resolves to   10.0.0.1
     foo.bar.<strong>10.0.0.1</strong>.xip.io   resolves to   10.0.0.1
    
  5. ip地址转换成进制来访问
    将 ip 转换为八进制十进制十六进制这种,同样也可以正常访问

    例如将 10.10.10.10 转换为十进制是 168430090,在浏览器访问 http 😕/168430090 即访问 10.10.10.10

    115.239.210.26 = 16373751032
    
  6. 代码审计

    <?php
      if (isset($_GET['url'])) {
        $content = file_get_contents($_GET['url']); 
        #echo $_GET['url'];
              $filename = ''.rand().'img-tasfa.jpg';
        $fopen  =  fopen($filename,   'wb ');
        #echo $filename;
              file_put_contents($filename, $content);
              #echo $_GET['url'].""; 
              $img = "<img src=\"".$filename."\"/>";
          } 
          echo $img;
    ?>
    

规避

  1. 使用白名单(黑名单),限制HOST。避免应用被用来获取获取内网数据,攻击内网。
  2. 对Response信息进行识别,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  3. 需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:禁用跳转;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致
  4. 禁用重定向。防止默认跟随重定向后,继续请求内网地址
  5. 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
  6. 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
  7. 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

示例

public static boolean ssrfCheck(String url) {
    try {
        URL urlObj = new URL(url);
        // 协议校验, 防止伪协议问题
 if(!urlObj.getProtocol().equals("https") && !urlObj.getProtocol().equals("http")) {
            return false;
        }
        // Host 校验
  String domain = urlObj.getHost();
        InetAddress host = InetAddress.getByName(domain);
        if(host.isSiteLocalAddress() || host.isLoopbackAddress()) {
            return false;
        }
        return true;
    } catch (MalformedURLException e) {
        return false;
    } catch (UnknownHostException e) {
        return false;
    }
}

参考文章

  • SSRF 漏洞记录
  • SSRF详解
  • SSRF原理及攻防解析(简单明了)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web安全——服务器端请求伪造(SSRF) 的相关文章

  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 在脚本标签内工作的角度表达式

    如何在脚本标签内使用角度表达式 我对此很陌生并且需要帮助 这是我的 java 脚本代码的示例
  • Safari 的“阅读器模式” - 开源解决方案? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Safari 有一个 阅读器模式 可以删除网站上除文本之外的所有内容 有谁知道提供相同功能的开源库 或
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 如何从文件系统访问 api window.showDirectoryPicker() 获取选定的目录路径

    当我选择一个文件夹时 我确实得到了 dirHandle 但无法弄清楚什么属性或方法将为我提供完整路径 const dirHandle await window showDirectoryPicker 所以类似 let path dirHan
  • 找不到模块:错误:包路径。未从包中导出

    import firebase from firebase const firebaseConfig apiKey AIzaSyBOK7x5N5UnjY4TDqndzH7l5tvdNIsWFRc authDomain todo app e3
  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • ASP.net获取硬件信息

    如果我创建一个 ASP net 页面 我是否能够获取当前用户的 CPUID 和 BIOS 序列号 还是出于安全原因不允许这样做 我目前有一个获取这些值的 Visual Basic net 应用程序 我只是想知道是否可以在网页上执行相同的操作
  • 缩小 HTML、CSS 和 Javascript 是一个坏主意吗?

    维基百科定义缩小 http en wikipedia org wiki Minification 28programming 29 as 从源代码中删除所有不必要的字符而不改变其功能的过程 这些不必要的字符通常包括空格字符 换行符 注释 有
  • 删除 cookie php

    我正在尝试创建一个带有登录系统的平台 并将用户名和密码存储在cookie中 以使用户即使关闭浏览器然后再次输入也能保持登录状态 我设法保存了cookie 但我不知道如何制作注销按钮 这是代码 function logout body app
  • Tornado websocket handler , self.close() 正在关闭连接而不触发 on_close() 方法

    我是 python stackoverflow tornado 的新手 所以请耐心等待 纠正我 我正在使用龙卷风开发实时应用程序 当我在 Websocket 处理程序类中调用 self close 时 on close 方法不会启动 这次我
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 在 CMS(Wordpress 和 phpBB)之间共享登录信息

    假设我想开发一个嵌入一些 CMS 的网站 例如 WordPress http wordpress org 博客和phpbb http www phpbb com forum 统一网站登录和注册流程的最便捷方法是什么 让用户对网站的每个部分采
  • 如果谷歌的主页如此之小,为什么源代码只有数百行代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 代码被缩小了 但重新格式化后只有几百行代码 我想象这样一个最小的页面也有最少的代码 源代码这么长 Google 到底在做什么 我可以看到很多都是
  • 使用其他聚合中的数据检查命令的有效性

    我目前正在开发我的第一个更大的 DDD 应用程序 目前来说 它运行得很好 但我们从早期就陷入了一个让我无法停止思考的问题 在我们的一些聚合中 我们保留对另一个聚合根的引用 这对于整个应用程序非常重要 基于它们的 ID 因此不存在硬引用 删除
  • 使用脚本从网站中提取电子邮件地址

    给定一个网站 我想知道以编程方式和 或使用脚本的最佳程序是什么 以纯文本形式提取每个页面上存在的所有电子邮件地址 电子邮件受保护 cdn cgi l email protection从该链接和下面的所有站点 递归或直到某个固定深度 使用 s

随机推荐