介绍
服务器端请求伪造(SSRF)攻击是一种应用安全漏洞,恶意行为者可以操纵web应用程序上的参数来创建或控制来自存在漏洞的服务器的请求。攻击者通常使用这些漏洞来攻击那些由于使用了防火墙而无法从外部网络访问的内部系统。
最常见的情况是,为了实现某个特性或者为了开发的便利性,服务器应用程序向第三方服务器发送HTTPS请求。这个请求可能需要:使用一个互联网API,下载一个包或通过一个社交账户(如微信, 淘宝等)检索用户信息。攻击者可能滥用该特性向另一个第三方发送请求,或通过服务器对原来的第三方系统窃取数据。
从本质上说,SSRF攻击利用了安全性的基础之一信任,它利用现有的信任关系使应用程序可以直接对其他后端系统甚至服务器本身进行访问甚至是攻击。
影响及危害
一个成功的SSRF攻击可以使恶意攻击者渗透进内网并不受限制的横向移动到后端web服务器的防火墙后面,导致应用程序的机密性、完整性和可用性全部受到损害。
那些成功地将SSRF作为其攻击过程中重要一部分的黑客行为,其影响及后果往往都是非常巨大的。在臭名昭著的2019年Capital One黑客事件中,数字说明了一切:被泄露的数据包括姓名、地址、电话号码、自我报告的收入、信用评分和支付历史,以及美国约1亿名客户(约占美国人口的1/3)和加拿大600万名客户的其他个人信息。
与许多安全问题一样,人为错误无疑在上述示例中起了一定作用,因为入侵入口的根本原因往往都是配置错误的防火墙。
场景:
通常,客户端web请求是通过支持已定义的协议类(如HTTP)的语言函数来执行的,这使开发人员使用它们非常简单。
根据易受攻击的请求在服务器端实现的方式,攻击者可能能够到达另一个网站。攻击者甚至可以更改协议,例如,使用file://协议(在许多情况下默认接受该协议)来读取文件系统上的任何文件。
由于防火墙和网络安全,SSRF攻击仍然相当强大;能够通过服务器伪造任意请求的攻击者将受益于服务器的物理/逻辑位置和活动防火墙规则。当从服务器执行请求时,攻击者可能可以使用不可见和禁止的网络资源。一个常见的例子是对外部世界隐藏的管理服务器,但允许服务器使用它,因为该服务器可能管理其更新或监视其使用。
最后,攻击者可以监听指向开放TCP端口的SSRF的平均运行时间,并将其与指向关闭或过滤TCP端口的请求进行比较。通过提交相当少量的请求,攻击者可以映射网络并发现可能成为进一步攻击目标开放了哪些端口。
如何防御
如果已知允许的url列表,开发人员应该为应用程序实现允许的主机名或IP地址列表。url不应该根据拒绝列表进行验证,因为使用一些众所周知的技术很容易就能绕过这种防御方法。
如果HTTP和HTTPS是应用程序用来发出请求的唯一活动协议,那么开发人员应该禁用其他未使用的URL模式。
为了减少攻击者利用响应数据泄漏的风险,开发人员必须确保在向另一个服务器发送请求时,原始响应不会原样返回给客户机应用程序。
当发生SSRF时,主要的深度防御方法是降低对服务器的信任。这通常可以通过入站端(例如,接收请求的另一个服务器)的防火墙规则实现,但由于TCP的性质,在出站端实现防火墙规则要困难得多。