█     █░▓█████  ▄▄▄▄        ██████ ▓█████  ▄████▄   █    ██  ██▀███   ██▓▄▄▄█████▓▓██   ██▓
▓█░ █ ░█░▓█   ▀ ▓█████▄    ▒██    ▒ ▓█   ▀ ▒██▀ ▀█   ██  ▓██▒▓██ ▒ ██▒▓██▒▓  ██▒ ▓▒ ▒██  ██▒
▒█░ █ ░█ ▒███   ▒██▒ ▄██   ░ ▓██▄   ▒███   ▒▓█    ▄ ▓██  ▒██░▓██ ░▄█ ▒▒██▒▒ ▓██░ ▒░  ▒██ ██░
░█░ █ ░█ ▒▓█  ▄ ▒██░█▀       ▒   ██▒▒▓█  ▄ ▒▓▓▄ ▄██▒▓▓█  ░██░▒██▀▀█▄  ░██░░ ▓██▓ ░   ░ ▐██▓░
░░██▒██▓ ░▒████▒░▓█  ▀█▓   ▒██████▒▒░▒████▒▒ ▓███▀ ░▒▒█████▓ ░██▓ ▒██▒░██░  ▒██▒ ░   ░ ██▒▓░
░ ▓░▒ ▒  ░░ ▒░ ░░▒▓███▀▒   ▒ ▒▓▒ ▒ ░░░ ▒░ ░░ ░▒ ▒  ░░▒▓▒ ▒ ▒ ░ ▒▓ ░▒▓░░▓    ▒ ░░      ██▒▒▒ 
  ▒ ░ ░   ░ ░  ░▒░▒   ░    ░ ░▒  ░ ░ ░ ░  ░  ░  ▒   ░░▒░ ░ ░   ░▒ ░ ▒░ ▒ ░    ░     ▓██ ░▒░ 
  ░   ░     ░    ░    ░    ░  ░  ░     ░   ░         ░░░ ░ ░   ░░   ░  ▒ ░  ░       ▒ ▒ ░░  
    ░       ░  ░ ░               ░     ░  ░░ ░         ░        ░      ░            ░ ░     
                      ░                    ░                                        ░ ░     
=----------------------------------------------------------------------=
=--[ 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 User-Agent: node Host: meu[.]collaborator[.]rs Accept: */* Accept-Language: * Sec-Fetch-Mode: cors Accept-Encoding: br, gzip, deflate Connection: 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