SSRF

发布时间 2023-07-13 20:23:42作者: charonlight

参考:

https://xz.aliyun.com/t/6235

https://portswigger.net/web-security/ssrf

0x01 SSRF漏洞基础学习

1、SSRF概述

​ SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

2、SSRF原理

​ 通过控制功能中的发起请求的服务来当作跳板攻击内网中其他服务。比如,通过控制前台的请求远程地址加载的响应,来让请求数据由远程的URL域名修改为请求本地、或者内网的IP地址及服务,来造成对内网系统的攻击。

3、SSRF的危害

1)内部资源访问:攻击者可以利用SSRF漏洞访问应用程序所在服务器上的敏感文件、数据库或其他受限资源。通过指定特定的URL或IP地址,攻击者可以绕过应用程序的访问控制,直接请求和获取敏感数据。

2)攻击内部系统:通过SSRF漏洞,攻击者可以发送恶意请求,尝试攻击应用程序所在环境中的其他内部系统。攻击者可以利用SSRF作为一种工具,发起进一步的攻击,例如本地文件包含(LFI)攻击、XML外部实体(XXE)攻击等。

3)绕过防火墙和访问内部服务:SSRF漏洞允许攻击者绕过防火墙,直接访问内部网络中的服务。攻击者可以通过发送请求到内部API、管理界面或其他敏感服务,绕过边界保护措施并获取未经授权的访问权限。

4)信息泄露:通过SSRF漏洞,攻击者可以探测内部网络的拓扑结构、IP地址、端口开放情况等敏感信息。这些信息可以帮助攻击者进行进一步的侦察和攻击策划。

5)远程代码执行:在某些情况下,SSRF漏洞可能导致远程代码执行。攻击者可以构造恶意请求,使应用程序内部发起的请求执行恶意代码,从而在受攻击的系统上执行任意命令。

4、SSRF经常出现的功能点

1)图片上传和处理功能

2)文件下载或处理功能

3)URL 地址解析和请求功能

4)远程资源获取,如网页标题、缩略图等

5)代理服务器功能

6)数据库连接字符串配置

7)远程文件读取或写入

8)HTTP 请求发送和响应解析功能

9)DNS 查询功能

10)Web 服务调用功能

11)日志记录和监控功能

12)邮件发送和接收功能

13)远程命令执行功能

14)内部 API 调用功能

15)CDN 缓存刷新功能

16)WebHooks 或回调功能

17)图片处理器或转换器功能

18)内部资源访问和权限验证功能

19)内部服务或应用程序的监控和管理功能

20)第三方数据集成或接口访问功能

21)转码服务、在线翻译 等等等 ......

5、SSRF的防御

1、限制返回信息的,例如请求文件,只返回文件是否请求成功,没有请求成功到文件统一返回错误信息。

2、对请求地址设置白名单,只允许请求白名单内的地址。

3、禁用除http和https外的协议,如:file://,gopher://,dict://等

4、限制请求的端口为固定服务端口,如:80,443

0x02 SSRF的实际应用

1、SSRF的验证方式

​ SSRF分为回显和不回显两种。不回显的的ssrf一般就只能通过响应时间来判断,当然也可以结合dnslog进行验证。回显的ssrf直接看响应数据即可。

2、SSRF的绕过

1)0.0.0.0:使用 0.0.0.0 作为目标 IP 地址,可以直接访问本地主机。

2)IP 地址格式转换:通过将 IP 地址的格式进行转换,如将十进制转换为八进制、十六进制,或将十六进制整数转换为十进制等,以绕过简单的过滤机制。

3)localhost:使用 "localhost" 或 "127.0.0.1" 作为目标主机名,绕过一些简单的防护措施。

4)利用 @ 符号:通过在 URL 中使用 @ 符号将目标 IP 地址附加到主机名后面,如 "www.example.com@127.0.0.1",以绕过一些简单的检测

5)非 HTTP 协议:利用不常见的协议,如 gopher、dict 或 file,发送 SSRF 请求,绕过仅允许 HTTP 或 HTTPS 的限制。

6)DNS 解析:通过构造恶意的 SSRF 请求,利用 DNS 解析功能获取敏感信息或与内部服务器进行通信。可以使用 DNSLOG 服务来捕获请求的结果。

7)IPv6:尝试使用 IPv6 地址来绕过对 IPv4 地址的过滤和验证。

8)添加端口号:在目标 IP 地址后面添加端口号,例如 "127.0.0.1:8080",以尝试访问指定端口上的服务。

9)使用 [::] 代替 127.0.0.1:利用 [::] 来代替 IPv4 地址的 127.0.0.1,如 "[http://[::]:80",以绕过简单的过滤机制

3、SSRF在攻防中的应用

​ SSRF+redis 获取内网主机权限,利用SSRF来对redis的未授权访问执行命令,从而达到获取主机权限的目的。看过很多文章说这种打法,暂时没遇到环境进行复现,后续补充

0x03 SSRF的检测及其绕过实战

1、针对本地服务器的基本SSRF

正常访问靶场,扫到/admin目录,提示只允许管理员登陆后才能访问

image-20230711190002996

在针对服务器本身的 SSRF 攻击中,攻击者会诱导应用程序通过环回网络接口向托管该应用程序的服务器发出 HTTP 请求。这通常涉及提供带有主机名的 URL,例如127.0.0.1(指向环回适配器的保留 IP 地址)或localhost(同一适配器的常用名称)。例如,考虑一个购物应用程序,它允许用户查看特定商店中是否有商品的库存。为了提供库存信息,应用程序必须查询各种后端 REST API,具体取决于相关产品和商店。该功能是通过前端 HTTP 请求将 URL 传递到相关后端 API 端点来实现的。因此,当用户查看商品的库存状态时,他们的浏览器会发出如下请求:

image-20230711190138463

这会导致服务器向指定的 URL 发出请求,检索库存状态,并将其返回给用户。在这种情况下,攻击者可以修改请求以指定服务器本身本地的 URL,现在攻击者可以/admin直接访问该 URL。但管理功能通常只有经过适当身份验证的用户才能访问。因此,直接访问 URL 的攻击者不会看到任何感兴趣的内容。然而,当对 URL 的请求/admin来自本地计算机本身时,正常的访问控制就会被绕过。

image-20230711185238140

从返回的数据包中我们可以发现一些接口信息,调用删除接口,发现进行302跳转并且成功删除用户

image-20230711185649036

为什么应用程序会以这种方式运行,并隐式信任来自本地计算机的请求?出现这种情况的原因有多种:

  • 访问控制检查可以在位于应用程序服务器前面的不同组件中实现。当返回到服务器本身的连接时,检查将被绕过。
  • 出于灾难恢复的目的,应用程序可能允许来自本地计算机的任何用户无需登录即可进行管理访问。这为管理员提供了一种在丢失凭据时恢复系统的方法。这里的假设是只有完全受信任的用户才会直接来自服务器本身。
  • 管理界面可能正在侦听与主应用程序不同的端口号,因此用户可能无法直接访问。

这种信任关系(来自本地计算机的请求的处理方式与普通请求不同)通常是导致 SSRF 成为严重漏洞的原因。

2、针对另一个后端系统的基本SSRF

​ 服务器端请求伪造经常出现的另一种信任关系是应用程序服务器能够与用户无法直接访问的其他后端系统进行交互。这些系统通常具有不可路由的专用 IP 地址。由于后端系统通常受到网络拓扑的保护,因此它们的安全状况通常较弱。在许多情况下,内部后端系统包含敏感功能,任何能够与系统交互的人都可以在无需身份验证的情况下访问这些功能。

抓取到库存检查功能点的数据包,并将其发送到Intruder

image-20230711191308072

爆破其ip地址从1到255,发现104与其他的payload返回不一致

image-20230711191551947

构建删除用户的接口,发现302跳转并且成功删除了用户

image-20230711191737698

3、具有基于黑名单的输入过滤器的SSRF

某些应用程序会阻止包含主机名(如127.0.0.1和 )localhost或敏感 URL(如 )的输入/admin。在这种情况下,您通常可以使用各种技术来绕过过滤器:

  • 使用 的替代 IP 表示127.0.0.1,例如2130706433017700000001127.1
  • 注册您自己的域名,解析为127.0.0.1. 您可以用于spoofed.burpcollaborator.net此目的。
  • 使用 URL 编码或大小写变化来混淆被阻止的字符串。
  • 提供您控制的 URL,该 URL 随后会重定向到目标 URL。尝试对目标 URL 使用不同的重定向代码以及不同的协议。例如,在重定向过程中 从http:to URL 切换已被证明可以绕过某些反 SSRF 过滤器。https:

抓取到库存检查功能点的数据包,并将其发送到Repeater中进行分析,修改其参数为localhost或者127.0.0.1都会请求失败

image-20230711192922182

但是修改成http://127.1 却成功了,原理是因为会自动填充缺少的两位八位字节,点击发送会被渲染出来,从而绕过了黑名单限制。

image-20230711192952566

从数据包找到删除用户接口,并且使用大小写进行绕过,从而可以成功删除用户

image-20230711193433837

4、具有基于白名单的输入过滤器的SSRF

某些应用程序仅允许与允许值白名单匹配、以允许值白名单开头或包含允许值白名单的输入。在这种情况下,您有时可以通过利用 URL 解析中的不一致来绕过过滤器。

URL 规范包含许多在实现 URL 的即席解析和验证时容易被忽视的功能:

  • 您可以使用 字符将凭据嵌入到 URL 中的主机名之前@。例如:

    https://expected-host:fakepassword@evil-host
    
  • 您可以使用该#字符来指示 URL 片段。例如:

    https://evil-host#expected-host
    
  • 您可以利用 DNS 命名层次结构将所需的输入放入您控制的完全限定的 DNS 名称中。例如:

    https://expected-host.evil-host
    
  • 您可以对字符进行 URL 编码以混淆 URL 解析代码。如果实现过滤器的代码处理 URL 编码字符的方式与执行后端 HTTP 请求的代码不同,则这尤其有用。请注意,您也可以尝试双编码字符;一些服务器对它们收到的输入进行递归 URL 解码,这可能会导致进一步的差异。

  • 您可以结合使用这些技术。

抓取到库存检查功能点的数据包,并将其发送到Repeater中进行分析,发出loaclhost请求,发现返回数据包提示主机名必须是stock.weliketoshop.net,

image-20230712112319872

尝试使用@进行绕过,发现失败

image-20230712114515148

使用双层URL编码的#为%2523和@组合进行绕过,发现成功进行302跳转删除用户

image-20230712114658643

5、通过开放重定向绕过SSRF过滤器

​ 有时可以通过利用开放重定向漏洞来规避任何类型的基于过滤器的防御。在前面的SSRF示例中,假设用户提交的URL经过严格验证,以防止恶意利用SSRF行为。但是,允许 URL 的应用程序包含开放重定向漏洞。如果用于发出后端 HTTP 请求的 API 支持重定向,您可以构造一个满足过滤器的 URL,并导致将请求重定向到所需的后端目标。

应用程序首先验证提供的stockAPI参数的URL 是否位于允许的域

image-20230713185131304

发现应用程序包含开放重定向漏洞

image-20230713184158276

应用程序请求提供的 URL,这会触发开放重定向。它遵循重定向,并向攻击者选择的内部 URL 发出请求。

image-20230713184652604

6、带外检测的盲SSRF

​ 当可以诱导应用程序向提供的 URL 发出后端 HTTP 请求,但后端请求的响应未在应用程序的前端响应中返回时,就会出现盲目 SSRF 漏洞。盲 SSRF 通常更难利用,但有时会导致服务器或其他后端组件上完全远程执行代码。使用带外技术最简单、最有效的方法是使用Burp Collaborator。您可以使用Burp Collaborator生成唯一的域名,将这些域名以有效负载的形式发送到应用程序,并监视与这些域的任何交互。如果观察到来自应用程序的传入 HTTP 请求,则它很容易受到 SSRF 的攻击。

在加载产品页面时用 burp 抓包,找到 Referer 标头,开启 Collaborator client 把网址替换为 Referer

image-20230713193615165

0x04 SSRF自动化检测工具

1、ssrf-king

​ SSRF-King是一款基于BurpSuite的自动化SSRF检测插件,它可以帮助渗透测试人员快速发现并利用SSRF漏洞,它可以检测潜在的SSRF漏洞,并且可以自动化检测SSRF漏洞,从而提高渗透测试的效率。

2、AutoRepeater

需要准备好一个dnslog和两个正则,正则如下,dnslog随意,比如ceye.io等,具体使用可参考:https://www.yuque.com/pmiaowu/bomi9w/gbg1ui

(?i)^(https|http|file)://.*
(?i)^(https|http|file)%3A%2F%2F.*

3、xray

需使用高级版xray并且部署了反连平台,否则不支持检测,具体使用可参考https://docs.xray.cool/#/tutorial/introduce