Falhas antigas em sistemas modernos — SQLi

Rennan Cockles
4 min readFeb 21, 2019

--

Navegando pelo site de um laboratório da cidade onde moro pude notar que eles possuem uma área para acessar resultados de exames. Ao clicar no link aparece uma tela onde posso escolher acessar uma área do paciente ou uma área do médico, porém ambas me redirecionam para a mesma url com um formulário para login.

Formulário de login

Acessando essa nova tela, a primeira coisa que pude notar foi a url com o domínio “zapto.org” que é um dos domínios fornecidos pelo no-ip. Podemos deduzir, então, que o servidor onde são armazenados os exames é local e não remoto, pois necessita de um serviço de dns dinâmico para acessá-lo o que significa que não possuem um ip real para o mesmo. Utilizando o whois para analisar o ip atribuído ao domínio, pude verificar que ele pertence à um provedor da própria cidade, o que comprovou a hipótese acima.

Voltando ao formulário de login, resolvi tentar algumas combinações de usuário e senha comuns. Sem sucesso, resolvi tentar um simples SQLi e fiquei surpreso ao descobrir que estava vulnerável. Utilizei o usuário admin e um simples 'or'1'='1 na senha e pronto, estou logado como administrador.

Acesso como administrador

Já no sistema vemos um novo formulário para consultar os exames. Nele podemos preencher as informações do nome do paciente, modalidade do exame e o ano em que o exame foi feito.

No campo para preencher o nome do paciente pude notar que ele faz a consulta utilizando um LIKE no banco de dados e possui um wildcard % embutido no final do parâmetro.

Quando pesquiso utilizando um nome, a consulta me retorna resultados.

Busca por nome

Quando pesquiso pelo sobrenome, nenhum resultado é retornado.

Busca por sobrenome

Mas pode ser facilmente burlado inserindo o wildcard % no início da consulta.

Busca por sobrenome com wildcard

Brincando com o formulário, pude notar que a consulta é feita via GET, portanto todos os parâmetros são passados na URL e é aí que a brincadeira começa a melhorar.

Testando alguns payloads na URL, pude descobrir que o parâmetro ‘ano’ estava vulnerável à SQLi e que o banco de dados utilizado é o PostgreSQL, pois função PG_SLEEP passada no payload foi executada com sucesso atrasando o retorno das informações.

Parâmetros fornecidos
Payload sendo executada

Com as descobertas feitas até o momento utilizei a ferramenta Sqlmap e automatizei um pouco as coisas para obter novas informações. Ao final dos testes consegui obter um dump completo de 431 tabelas do banco de dados com o nome dos bancos utilizados, as tabelas, dados das tabelas, usuários, entre outras informações.

Bancos utilizados
Nome dos usuários

A falha foi reportada no dia 21/02/2019 à equipe técnica da empresa para que as devidas correções possam ser efetuadas.

OBS: Nenhuma informação do banco de dados foi alterada e/ou apagada. O acesso foi feito apenas com fins educacionais para mostrar que vulnerabilidades simples e conhecidas ainda são encontradas em sites importantes nos dias de hoje.

--

--