(转载翻译)什么是SSRF

nicky   ·   发表于 2020-03-20 10:55:27   ·   技术文章投稿区

什么是SSRF?

SSRF全称是Server-side requet forgery,翻译过来是服务器端请求伪造。它可以让攻击者诱使服务器端应用程序向攻击者选择的任意网站发出HTTP请求。

在典型的SSRF实例中,攻击者可以让服务器建立自身连接,组织基础结构中其它基于WEB的服务或第三方系统的连接。

SSRF攻击有什么影响

成功的SSRF攻击可以导致易受攻击的应用程序本身或应用程序可以与其它的通信后端系统上未授权的操作或对组织内数据进行访问。在某些情况下,SSRF漏洞可以允许攻击者执行任意命令

导致与外部第三方系统建立连接的SSRF利用可能会导致恶意的连续攻击。这些攻击源于托管存在漏洞的应用程序的组织,从而导致潜在的法律责任和声誉损失。

SSRF攻击服务器本身

在针对服务器本身的SSRF攻击中,攻击者诱使应用程序通过环路网络接口向承载应用程序的服务器发出HTTP请求。通常会涉及为URL提供一个域名最常见的就是127.0.0.1或者是localhost。

比如说一个购物应用程序,它可以让用户查到商店中某件商品是否有库存。为了提供查询信息,应用程序必须根据所设计的产品和商店查询各种后端REST API。该功能是通过将URL把前端HTTP请求传递到相关的后端API端口来实现。因此当用户查看某件商品库存状态的时候,抓包的数据会是这样:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1

这可以让服务器向指定URL发出请求,检查库存状态,并返回给用户。在这种情况下,攻击者可以修改请求已指定服务器本身的URl比如:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://localhost/admin

在这里服务器会获取/admin URL的内容并返回给用户。当然现在攻击者可以直接访问/admin URL。不过通常只有通过身份验证的用户才可以访问管理功能。因此,直接访问URL攻击者不会看到敏感信息。因此,对/admin URL请求来自本地计算机的时候,会绕过常规访问控制。该应用程序授予对管理功能的完全访问权限。因为该请求看起来是来自收信任的位置。

为什么应用程序会以这种方式运行,并且隐式信任来自本地计算机请求?发生这种情况有很多种原因:
可以在位于应用程序服务器前面的其它组件中实现访问控制检查。与服务器本身建立连接后可以绕过检查

为了应对某些删库跑路的风险,该应用程序可以无需登录就可以对本地计算机的任何用户进行管理访问。这可以让管理员忘记密码或者被删掉的情况下恢复系统的办法。这里的假设仅仅是只有完全收信任的用户将直接来自服务器本身。

管理界面可能正在监听与主应用程序不同的端口号,因此用户可能无法直接访问。

这些信任关系通常会成为SSRF严重的漏洞。在这种信任关系中,来自本地计算机的请求和普通请求的处理方式不同。

SSRF攻击其它后端系统

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

在前面的示例中,假设在后端URL http://192.168.0.68/admin 处有一个管理界面。在这里,攻击者可以通过提交以下请求来利用SSRF漏洞访问管理界面:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://192.168.0.68/admin

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

某些应用程序仅允许输入匹配,让允许值开头或包含允许值的白名单的输入。在这种情况下得考虑利用URL解析中的不一致来绕过。

URL规范包含许多在实现临时解析和URL验证时,容易被忽略的功能:
可以使用@字符在主机名前的URL中嵌入数据比如:http://expected-host @ evil-host

可以使用#字符代表URL片段。比如https://evil-host# expected-host。

利用DNS命名层次结构将所需的输入放入控制的标准DNS名称中。比如:https://expected-host.evil-host

再或者使用URL编码字符来混淆URL解析代码。如果实现过滤器的代码与执行后端HTTP请求的代码以不同方式处理URL编码字符,特别有用。

通过重定向绕过SSRF过滤器

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

例如,假设应用程序包含一个开放重定向漏洞其中包含以下URL:
/product/nextProduct?currentProductId=6&path=http://evil-user.net

返回重定向到:
http://evil-user.net

可以利用重定向漏洞绕过URL筛选器,并入按照以下方式利用SSRF漏洞:
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin

这种SSRF漏洞会有效,因为应用程序首先通过验证了所提供的stockAPI URL是否在允许的域名当中。然后应用程序请求提供的URL会触发重定向,然后它遵循重定向并让攻击者打入内部中。

引用:Portswigger https://portswigger.net/web-security/ssrf

用户名金币积分时间理由
奖励系统 100.00 0 2020-11-26 20:08:32 投稿满 10 赞奖励
奖励系统 50.00 0 2020-09-25 12:12:16 投稿满 5 赞奖励
admin 50.00 0 2020-03-24 10:10:01

打赏我,让我更有动力~

0 Reply   |  Until 2020-3-20 | 938 View
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.