C:\>aula_ □ ×

SSRF: Server-side Request Forgery

Aula prática sobre requisições HTTP, campos controlados pelo usuário e o momento em que uma aplicação passa a fazer chamadas para destinos que você escolheu.

HTTP

Ler método, endpoint, headers, corpo e resposta.

DevTools/Burp

Reenviar requisições mantendo o contexto.

SSRF

Usar uma entrada para influenciar uma chamada feita pelo servidor.

SSRF não começa no payload. Começa na leitura da requisição.

Procure campos que parecem apontar para fora da aplicação: URL, host, callback, webhook, image, next, redirect, stockApi, avatar, feed, import, preview. Se o backend usa esse valor para buscar algum recurso, existe uma pergunta que precisa ser respondida: quem faz a requisição, o navegador ou o servidor?

Quando é o servidor, o alcance muda. O request sai da aplicação, com rede, IP, permissões e confiança da aplicação. Esse é o ponto central da aula.

slides / SSRF_ExploitCamp.pdf_ □ ×

abrir slides em PDF · baixar PPTX original

1. HTTP antes de SSRF
C:\>http_ □ ×

A requisição já entrega quase tudo

Método

GET, POST, PUT. Diz a intenção geral.

Endpoint

O caminho que recebeu a ação: /product/stock, /api/import.

Payload

O corpo ou parâmetro que a aplicação vai processar.

Resposta

Status, tamanho, erro, tempo e conteúdo.

HTTP é o protocolo da aplicação web. Para testar SSRF, você não precisa decorar tudo do protocolo. Precisa saber onde a aplicação recebe dados e o que ela faz com eles.

Um padrão comum é o backend receber uma URL e usar essa URL para buscar outro recurso. No exemplo da aula, a aplicação recebe um campo parecido com stockApi e consulta um serviço de estoque.

formato que interessa na prática_ □ ×
POST /product/stock HTTP/1.1
Host: shop.example
Content-Type: application/x-www-form-urlencoded
Cookie: session=...

stockApi=https://stock.example/check?id=7

A pergunta não é só “esse parâmetro existe?”. A pergunta é: esse valor vira uma requisição feita pelo servidor?

2. Leia a requisição antes de mexer
C:\>devtools_ □ ×

Mantenha o contexto, mude um campo

Capture

Abra Network e encontre a requisição que muda algo.

Duplique

Use resend, replay, Burp Repeater ou a opção equivalente.

Altere

Mude só o campo suspeito.

Compare

Status, corpo, tamanho, erro e tempo.

O erro mais comum é trocar várias coisas ao mesmo tempo. Aí você não sabe qual mudança causou o comportamento novo.

Para testar SSRF, preserve headers, cookies e método. Troque apenas a URL controlada. Primeiro use um destino simples. Depois teste loopback, rede interna, redirecionamento ou OAST, dependendo do laboratório.

troca mínima_ □ ×
# Original
stockApi=https://stock.example/check?id=7

# Teste controlado
stockApi=http://127.0.0.1/

# Teste de painel interno
stockApi=http://localhost/admin
3. Client-side não é fronteira de segurança
C:\>client-side_ □ ×

A interface limita; o servidor decide

Readonly

O HTML pode bloquear edição na tela.

Hidden

Campos escondidos continuam sendo enviados.

Select

O navegador mostra opções, mas a requisição aceita texto.

O navegador é fácil de editar. DevTools, Burp e curl deixam você enviar valores que a interface nunca mostraria.

Isso não é SSRF por si só. É a base do teste: se o servidor confia no valor que veio do cliente, vale observar o que acontece quando esse valor muda.

interface vs requisição_ □ ×
# A tela mostrou:
country=Brasil&user_id=42&role=user

# A requisição pode ser alterada:
country=XX&user_id=99&role=admin
4. Modelo mental
C:\>modelo_ □ ×

Entrada controlada vira requisição server-side

Entrada

Um campo recebe URL, host ou caminho externo.

Aplicação

O backend usa esse valor em um cliente HTTP.

Destino

O servidor alcança algo que seu navegador talvez não alcance.

Evidência

Resposta, erro, tempo, DNS ou callback confirma o comportamento.

Em Command Injection, o dado atravessa a aplicação e vira comando inesperado. Em SSRF, o dado atravessa a aplicação e vira destino inesperado.

A aplicação vulnerável passa a funcionar como um cliente HTTP controlado pela entrada. Você não “entra” diretamente na rede interna. Você faz o servidor perguntar por você.

comparação rápida_ □ ×
Command Injection:
; whoami #        -> shell executa comando inesperado

SSRF:
http://localhost/admin -> cliente HTTP acessa destino inesperado
5. Superfície de ataque
C:\>alcance_ □ ×

O servidor enxerga outro mapa

Loopback

localhost, 127.0.0.1, painéis locais.

Rede privada

10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.

Cloud metadata

169.254.169.254 e APIs de metadados.

Origem confiável

O request sai com o IP e o contexto do servidor.

O navegador do atacante vem de fora. A aplicação está dentro da infraestrutura. Isso muda o que pode ser alcançado.

É por isso que SSRF é perigoso mesmo quando a resposta parece pequena. Um status diferente, uma demora ou um erro de conexão já podem indicar que a aplicação tentou alcançar um destino interno.

6. Basic SSRF e Blind SSRF
C:\>tipos_ □ ×

Às vezes a resposta volta. Às vezes não.

Basic SSRF

A resposta do destino aparece no retorno da aplicação.

Blind SSRF

A aplicação faz a chamada, mas o conteúdo não volta para você.

OAST

DNS/HTTP callback confirma que o request saiu.

No Basic SSRF, o teste é mais direto: você altera a URL e observa HTML, JSON, status ou conteúdo retornado.

No Blind SSRF, a aplicação não mostra a resposta. Você confirma por efeito indireto: DNS lookup, HTTP callback, tempo de resposta, erro ou mudança de comportamento. Em Burp, isso normalmente entra no fluxo com Collaborator/OAST.

7. Sinais, impacto e defesa
C:\>defesa_ □ ×

Filtrar string não resolve sozinho

Sinais

URL/host no input, backend buscando recurso, erro de conexão, tempo variável.

Impacto

Dados internos, ações administrativas, credenciais e falsificação de origem.

Defesa

Allowlist real, validação após DNS, controle de redirects e restrição de saída.

Defesa boa não é só bloquear localhost com regex. URL tem variações, DNS muda, redirects existem e o parser da aplicação pode interpretar diferente do filtro.

O caminho defensivo é reduzir o que o servidor pode acessar, validar destino resolvido, revalidar redirecionamentos e usar allowlist de destinos esperados.

8. Laboratórios PortSwigger
C:\>portSwigger_ □ ×

Faça na ordem. Anote evidência.

1

Local server.

2

Back-end system.

3

Blind SSRF/OAST.

4

Blacklist bypass.

5

Open redirect.

6

Whitelist filter.

Os labs abaixo seguem a sequência usada na aula. Entre no PortSwigger Web Security Academy, faça login, abra o laboratório e clique em Access the lab.

Use esse ritual em todos:

  1. abra a aplicação e reproduza o fluxo normal;
  2. encontre a requisição no DevTools ou no Burp;
  3. mande para Repeater ou use “Edit and resend”;
  4. altere um campo por vez;
  5. compare status, tamanho, corpo, erro e tempo;
  6. só depois tente variações de bypass.

Extra citado nos slides: HTB NomadNotes. Deixe como desafio adicional depois dos labs do PortSwigger.

Cheat sheet
referência rápida_ □ ×
# DevTools
Network -> Fetch/XHR -> Request -> Payload -> Response

# Burp
Proxy -> Intercept
HTTP history -> Send to Repeater
Repeater -> alterar 1 campo -> Send -> comparar

# Alvos comuns em SSRF
http://127.0.0.1/
http://localhost/
http://127.0.0.1/admin
http://169.254.169.254/
http://192.168.0.1/

# O que observar
status code
tamanho da resposta
mensagem de erro
tempo de resposta
callback DNS/HTTP