目录
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成并由服务端发起请求的安全漏洞
一、基本概念
SSRF 攻击的核心是利用服务器端的功能来发起对其他服务器或系统的请求,而这些请求并不是由服务器的正常业务逻辑所产生的。攻击者通常会通过欺骗服务器,使其以为请求来自合法的来源,从而让服务器代表攻击者执行请求。例如,一个存在 SSRF 漏洞的 Web 应用程序可能允许用户提供一个 URL,然后服务器会从这个 URL 获取内容并显示给用户。攻击者可以利用这个功能,让服务器向内部网络中的其他服务器发起请求,或者访问一些不应该被外部访问的资源。
1、攻击场景
(1)内部网络探测
①攻击者可以利用 SSRF 漏洞让目标服务器向内部网络中的其他服务器发起请求,从而探测内部网络的结构和服务。例如,通过让服务器依次请求不同的 IP 地址和端口,攻击者可以确定哪些服务器在运行以及它们所提供的服务。
②如果内部网络中存在一些没有对外公开的敏感服务,如数据库服务器、管理控制台等,攻击者可能会通过 SSRF 攻击获取到这些服务的访问权限。
(2)攻击其他服务
①攻击者可以利用 SSRF 漏洞让目标服务器向其他外部服务器发起恶意请求,从而进行攻击。例如,通过让目标服务器向一个易受攻击的服务器发送精心构造的请求,攻击者可以利用目标服务器的 IP 地址来绕过一些安全限制,或者进行分布式拒绝服务(DDoS)攻击。
②攻击者还可以利用 SSRF 漏洞来访问一些需要授权的服务,如通过让目标服务器向一个授权服务器发送请求,获取授权令牌,然后使用这个令牌来访问其他受保护的资源。
2、危害
(1)信息泄露
①通过 SSRF 攻击,攻击者可以获取到目标服务器内部网络中的敏感信息,如数据库内容、用户信息、配置文件等。这些信息可能会被用于进一步的攻击,或者被出售给其他恶意方。
②例如:如果攻击者成功利用 SSRF 漏洞访问了内部数据库服务器,他们可能会窃取大量的用户数据,包括用户名、密码、电子邮件地址等。
(2)权限提升
①在某些情况下,SSRF 攻击可以帮助攻击者提升他们在目标系统中的权限。例如,如果攻击者能够让目标服务器向一个管理控制台发起请求,并执行一些管理操作,他们可能会获得更高的权限,从而能够对系统进行更深入的攻击。
②攻击者还可以利用 SSRF 漏洞来访问一些只有特定权限用户才能访问的资源,从而获取到更高的权限。
(3)拒绝服务攻击
①通过让目标服务器向其他服务器发起大量的请求,攻击者可以进行分布式拒绝服务(DDoS)攻击,使目标服务器和其他被攻击的服务器无法正常提供服务。
②这种攻击方式可以对目标系统造成严重的影响,导致业务中断、用户无法访问等问题。
3、防范措施
(1)输入验证
①对用户输入的 URL 等参数进行严格的验证,确保其符合预期的格式和范围。可以使用正则表达式等技术来检查输入是否为合法的 URL,并且限制输入的长度和字符集。
②例如:可以只允许用户输入特定的域名或 IP 地址范围,或者对输入的 URL 进行解析,检查其协议、主机名和端口号是否合法。
(2)禁用不必要的协议
①在服务器端,应该禁用一些不必要的协议,如 file://、gopher:// 等,以防止攻击者利用这些协议来访问本地文件系统或其他敏感资源。
②可以通过配置服务器的安全策略来限制允许的协议和端口号,只允许必要的协议和端口进行通信。
(3)限制请求的范围
①对服务器发起的请求进行限制,确保其只能访问合法的目标。可以设置白名单或黑名单,限制服务器只能向特定的域名或 IP 地址发起请求。
②例如:可以只允许服务器向已知的安全服务器发起请求,或者禁止服务器向内部网络中的服务器发起请求。
(4)监控和审计
①对服务器的请求进行监控和审计,及时发现异常的请求行为。可以使用日志分析工具来监测服务器的请求日志,查找可能的 SSRF 攻击迹象。
②如果发现异常请求,应该及时采取措施进行调查和处理,以防止攻击进一步扩大。
二、SSRF示意图
1、用户与存在漏洞的应用程序交互
(1)用户通过浏览器或客户端向存在 SSRF 漏洞的 Web 应用程序发送请求。
(2)例如,用户请求获取某个特定资源,而应用程序期望从外部获取该资源并展示给用户。
2、应用程序处理请求
(1)应用程序接收到用户请求后,由于存在漏洞,没有对用户输入的 URL 等进行严格的验证和限制。
(2)应用程序可能会直接使用用户提供的 URL 去发起请求,而不是采用安全的方式进行资源获取。
3、发起恶意请求
(1)攻击者构造恶意的 URL,让应用程序在服务器端发起请求时,指向内部网络中的敏感资源或者其他外部恶意目标。
(2)例如:攻击者可能让应用程序请求内部的数据库服务器地址、管理控制台地址等。
4、请求到达目标
(1)应用程序按照攻击者构造的请求,向指定的目标地址发送请求。
(2)如果目标是内部网络中的服务器,该服务器会收到请求并可能响应。
5、响应返回给应用程序
(1)目标服务器响应请求,并将响应内容返回给发起请求的应用程序。
6、响应传递给用户(或被攻击者利用)
(1)应用程序将接收到的响应传递给用户,或者攻击者可以利用这个响应获取敏感信息、进一步进行攻击等。
7、图示
用户 -> 存在漏洞的 Web 应用程序 -> 恶意目标(内部网络或外部恶意服务器) -> 返回响应给应用程序 -> 用户(或被攻击者利用)
需要强调的是,SSRF 是一种严重的安全漏洞,可能会导致敏感信息泄露、权限提升、内部网络被渗透等风险。在实际应用开发中,应严格验证和过滤用户输入,防止 SSRF 攻击的发生。
三、SSRF类型
1、基于 URL 的 SSRF
这是最常见的 SSRF 类型。攻击者通过操纵应用程序向指定的 URL 发送请求。例如,应用程序可能允许用户提供一个图片 URL,然后服务器会从该 URL 下载图片并显示给用户。攻击者可以构造恶意的 URL,让服务器向内部网络中的敏感服务发起请求。
2、基于协议的 SSRF
某些应用程序可能支持多种协议,如 HTTP、HTTPS、FTP、FILE 等。攻击者可以利用这些协议来进行 SSRF 攻击。例如,通过使用 file:// 协议,攻击者可以让服务器读取本地文件系统中的文件;使用 FTP 协议可以让服务器连接到 FTP 服务器并执行命令。
3、基于 DNS 重绑定的 SSRF
在这种类型的攻击中,攻击者首先控制一个恶意的 DNS 服务器。当应用程序发起请求时,攻击者通过 DNS 重绑定技术,将服务器的请求重定向到内部网络中的敏感服务。具体过程如下:
(1)攻击者构造一个恶意的 URL,其中包含一个指向恶意 DNS 服务器的域名。
(2)应用程序解析该域名,恶意 DNS 服务器返回一个合法的外部 IP 地址,让应用程序认为这是一个安全的请求目标。
(3)当应用程序发起请求时,恶意 DNS 服务器在一段时间后将 IP 地址重绑定为内部网络中的敏感服务的 IP 地址,从而使服务器向内部服务发起请求。
4、基于回调函数的 SSRF
一些应用程序可能会使用回调函数来处理外部请求的响应。攻击者可以利用这一点来进行 SSRF 攻击。例如,应用程序可能会在接收到外部请求的响应后,调用一个特定的回调函数来处理响应数据。攻击者可以构造恶意的请求,让服务器向内部网络中的服务发起请求,并在响应中包含恶意代码,当应用程序调用回调函数时,恶意代码就会被执行。
5、基于盲 SSRF 的攻击
在某些情况下,应用程序可能不会直接返回请求的响应结果,而是根据请求的状态来执行不同的操作。这种类型的 SSRF 攻击被称为盲 SSRF。攻击者可以通过观察应用程序的行为来判断请求是否成功执行。例如,攻击者可以让服务器向一个内部服务发起请求,如果请求成功,应用程序可能会执行一些特定的操作,如发送电子邮件或更新数据库。攻击者可以通过观察这些操作的结果来判断 SSRF 攻击是否成功。
四、SSH未创建写shell的SSRF实现
在一般情况下,如果仅利用存在 SSRF 漏洞的应用程序而不创建写 shell,要通过 SSH 进行攻击可能会比较困难。
一种可能的思路是,如果可以通过 SSRF 漏洞让服务器发起对内部网络中 SSH 服务的请求,但由于没有写 shell,不能直接执行命令。不过可以尝试利用一些 SSH 的特性来获取信息。例如,如果目标 SSH 服务允许公钥登录,并且攻击者知道某个用户的公钥,那么可以尝试通过 SSRF 让服务器向该 SSH 服务发起连接请求,尝试用已知的公钥进行登录。如果登录成功,攻击者可能能够获取一些有限的信息,比如查看用户目录下的文件列表等。
1、发现SSRF漏洞
攻击者首先需要找到一个可以通过用户可控制的输入来发起外部请求的服务器。
2、利用SSRF漏洞
攻击者构造一个特殊的URL,使服务器向目标系统的SSH端口发送请求。
3、绕过身份验证
如果目标系统的SSH服务没有正确配置,攻击者可能会尝试利用已知的漏洞或默认凭证来绕过身份验证。
4、执行命令
一旦建立了SSH连接,攻击者可以尝试在目标系统上执行命令,以获取shell访问权限。
5、持久化访问
为了保持对目标系统的控制,攻击者可能会尝试写入SSH的authorized_keys文件,添加自己的公钥,从而实现无密码登录。