Explorando o SSRF ( Server-side Request Forgery)
O Server-side request forgery (mais conhecido como SSRF) é uma vulnerabilidade muito encontrada em programas de bug bounty, e atualmente está inclusa no OWASP Api Security TOP 10.
O que é o SSRF?
O SSRF (Server-side request forgery) é uma vulnerabilidade que permite com que o atacante envie requisições utilizando o servidor em que a aplicação está hospedada.
Na maioria das vezes, o SSRF é utilizado para acessar serviços internos ou aplicações que aceitam apenas conexões da rede interna. Em alguns cenários, o SSRF pode ser muito prejudicial, permitindo com que o atacante consiga ler arquivos ou executar comandos no servidor.
Como ocorre o SSRF?
O SSRF normalmente é encontrado em cenários que solicitam uma URL para o usuário, que seja para download de uma imagem, ou para verificar se um site está funcionando, etc...
O motivo do SSRF normalmente ser encontrado nesses cenários, é porque são "endpoints" que enviam uma requisição para a URL inserida pelo usuário.
Explorando o SSRF
No hackingclub tem diversas máquinas que apresentam o SSRF em uma de suas vulnerabilidades. Para a demonstração da vulnerabilidade, estaremos utilizando a máquina "Rain".
Em uma das etapas dessa máquina, temos que explorar o SSRF em uma página que checa URLs:
Para verificarmos se essa aplicação está realizando uma requisição, podemos subir um webserver utilizando o python3 e especificarmos a URL do nosso servidor para a aplicação:
Vemos que a aplicação realizou a requisição para a URL inserida.
Com o poder de realizar requisições do lado do servidor, podemos tentar acessar serviços da rede interna ou ler arquivos do sistema utilizando o schema "file". Ao tentar realizar uma requisição HTTP para "localhost:3306", recebemos a seguinte resposta:
O serviço que se hospeda na porta 3306 é o MySQL, então se acessarmos ele utilizando o protocolo HTTP, receberemos essa mensagem de erro. Isso já foi o suficiente para validar que temos acesso a serviços internos da rede.
Outro teste que podemos fazer é, verificar se conseguimos ler arquivos do servidor utilizando o schema "file". Para utilizar esse schema, precisamos especificar o caminho do arquivo depois de "file://", sendo assim, se quisermos ler o arquivo "/etc/passwd", precisamos especificar: "file:///etc/passwd".
Veja na imagem acima que conseguimos ler o arquivo: "/etc/hosts". Com o poder de ler arquivos do servidor, podemos ler arquivos que contém credenciais de autenticação ou arquivos de configuração. Nessa máquina conseguimos ler o arquivo de configuração do redis e obter a credencial para nos autenticar:
Filtrando por "requirepass" no arquivo, encontramos a senha para autenticar no redis:
Impacto
Através de um SSRF, conseguimos ler os arquivos do servidor e obter uma credencial para autenticação no redis. Já imaginou o quão prejudicial isso é? Com essa vulnerabilidade, um atacante poderia ler arquivos do servidor que contém credenciais para entrar no banco de dados, ou para acessar o SSH de algum usuário no servidor.
Como protegemos uma aplicação contra o SSRF?
Para protegermos as nossas aplicações contra o SSRF, sempre precisamos validar a URL inserida pelo usuário. Devemos verificar se a URL começa com http ou https, caso contrario bloquear a requisição. Outra condição que precisamos criar é, se o host especificado na URL aponta para o localhost.
Existem diversos bypass de filtros para SSRF, que consistem em criar endereços IPs em hexadecimal, ou IPv6, que apontam para o localhost. Por isso é importante fazer a resolução do host para verificar se estão apontando para o localhost.
Referências
Onde praticar Hacking ?
O Hacking Club é uma plataforma de treinamento em cybersecurity, que permite você aprender hacking de forma totalmente prática.
Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para você treinar e aprender hacking. Semanalmente lançamos máquinas gratuitas para você praticar e se desafiar no hacking!