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) 的相关文章

  • 你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗?

    是否可以用 C 加载网页并获取渲染的 DOM 不仅仅是 HTTP 响应 还有 java 脚本运行后 可能是让它运行一段时间后 呈现的 DOM 特别是随着时间的推移可能发生变化的动态 HTML 有这个库吗 或者 如果不是 c 您是否知道可以用
  • Ant Design Collapse - 关闭按钮

    我是 Ant Design 的初学者 在使用 Ant Design 库中的 Collapse 和 Form 时遇到了这个问题 我已经设置了我的页面 其中添加新项目的表单位于折叠中 并且折叠下方有一个项目列表
  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • 从网站获取数据的vba代码

    我是这个网站和 VBA 编程的新手 我遇到了一个问题 我必须从中获取数据这一页 http www kieskeurig nl zoeken index html q 4960999543345 我需要有超链接网址Check Rates 10
  • URL中的gs_upl是什么意思?

    在任何谷歌搜索 URL 中 gs upl 是什么意思 例如 那么 gs upl 1045l1663l0l3648l4l4l0l0l0l0l258l682l0 3 1l4l0 在这里意味着什么 从构建的脚本gs upl j 我找到 funct
  • 如何将 html 输入到 Flask 中?

    我有这个 html 位
  • 尝试访问我的网站时出现内部服务器错误

    我收到这个错误 内部服务器错误 服务器遇到内部错误或配置错误 无法完成您的请求 请联系服务器管理员 电子邮件受保护 cdn cgi l email protection和 告知他们错误发生的时间以及您可能会发生的任何事情 所做的事情可能导致
  • 从 Unity WebGL 调用 Angular2 函数

    目前 我正在使用 Angular2 版本 2 1 2 和 Unity 可视化工具 使用 Unity 5 5 构建 我需要做的是从 Unity 到 Angular2 进行通信 我正在使用类似于下面的代码 public void GetBill
  • JavaScript 中的对象解构[重复]

    这个问题在这里已经有答案了 gt a a true Statement lt a true 上面的语句是赋值true to a 为什么上面的语句在chrome控制台中没有报错 虽然下面的语句给出了错误 gt a a true Stateme
  • 使用内容安全策略防止 Internet Explorer 11 上的内联 JavaScript

    是否可以使用 ASP NET WebForm 上的 CSP 来阻止 Internet Explorer 11 上的内联 JavaScript 我知道 IE 11 不支持内容安全策略级别 2 但它支持级别 1 0 我尝试了很多方法 但没有明确
  • 我应该将标签存储在文本字段还是单独的表中?

    我有一个表 其中的行如下所示 id path tags 1 pictures pic1 jpg car bmw 3 pictures pic2 jpg cat animal pussy 4 pictures pic3 png gun 基本上
  • 如何保护我的网站免遭 HTTrack 或其他软件的翻录?

    我最近获得了批准的网站模板主题森林 http themeforest net 我的网站流量过多 并注意到我在 Themeforest 上的演示被 HTTrack 等某些软件破坏 如果这种情况持续下去 该产品的销量最终可能会下降 那么 有什么
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 在 Blogger 中使用相对链接

    我正在使用博主 当我需要在我的博客文章中提到一个链接并且该链接实际上是我自己的博客文章的链接时 我在其旁边提到标签 www my blog name blogspot in 12 2013 how to do html if i chang
  • 使用 php ping 网站

    我想创建一个 php 脚本 它将 ping 一个域并列出响应时间以及请求的总大小 这将用于监控网站网络 我尝试过curl 这是我到目前为止的代码 function curlTest2 url clearstatcache return if
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 找不到模块:错误:包路径。未从包中导出

    import firebase from firebase const firebaseConfig apiKey AIzaSyBOK7x5N5UnjY4TDqndzH7l5tvdNIsWFRc authDomain todo app e3
  • 为什么 [System.ComponentModel.ToolboxItem(false)] 默认出现在 Asp.net Web 服务中

    谁能告诉我为什么 System ComponentModel ToolboxItem false 是在Asp net Web服务中使用的吗 或许你可以在这里找到一些答案 NET API 浏览器 ToolboxItemAttribute 布尔
  • 如何用 C 语言通过 HTTP 协议发送图像?

    我是一名正在做网络服务器练习的学生 我需要一些帮助 我的网络服务器在文本页面上运行良好 但是每当浏览器发送一个 GET img jpg HTTP 1 1请求 我不知道如何处理 我听说 HTTP 协议是基于文本的 那么如何在 HTTP 响应中
  • ASP.net获取硬件信息

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

随机推荐