Alura > Cursos de Cibersegurança > Cursos de AppSec & DevSecOps > Conteúdos de AppSec & DevSecOps > Primeiras aulas do curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada

Desenvolvimento Seguro: estratégias de segurança para dados de entrada

Lidando com SQL Injection - Apresentação

Boas-vindas ao curso de Desenvolvimento seguro: estratégias de segurança para dados de entrada.

Sou a Camila e serei sua instrutora!

Audiodescrição: Camila é uma mulher com os olhos castanhos escuros, cabelos longos, pretos e encaracolados. Usa uma camiseta preta e fone de ouvido também preto. Está sentada em uma cadeira e ao fundo há uma parede lisa com iluminação degradê do roxo para o azul.

Esse curso é para pessoas Devs que possuem interesse em trabalhar com desenvolvimento seguro de aplicações.

O que vamos aprender

Para isso, usaremos a Voll Med, uma API REST de uma aplicação que faz o gerenciamento de uma clínica médica.

Realizaremos o cadastro de médicos, pacientes e consultas. Em seguida, faremos o code review desses cadastros e aplicaremos técnicas de segurança.

Pré-requisitos

Par que você tenha a melhor experiência nesse curso é importante que você tenha conhecimento sobre:

A API Voll Med já faz todos esse passo a passo. Por isso é importante que você saiba identificá-los no banco de dados, afinal, faremos modificações nas interações.

Esperamos que você tenha se interessado pelo conteúdo!

Vamos nessa?

Lidando com SQL Injection - Conhecendo a API

Nesse curso trabalharemos com a API Voll Med, na qual faremos um code review.

Antes de fazermos uma análise de vulnerabilidade, conheceremos melhor a API.

Conhecendo a API

Para ter acesso Voll Med na sua máquina, basta acessar o repositório e clonar a API.

Feito isso, vamos analisá-la. Temos uma pasta nomeada de "src" que possui todos os arquivos em TypeScript, além de outros diretórios como auth, avaliacoes e consultas. Isso significa que a API faz diversas requisições relacionadas a esses serviços da clínica.

Nessa mesma pasta, também encontramos os arquivos data-source.ts e o server.ts que estão relacionados as configurações do banco de dados e servidor.

Fora da pasta encontramos o arquivo .env que possui algumas variáveis de ambiente que precisam ser configuradas para rodar o servidor.

E também arquivos de configurações, como o docker-compose.yaml, que roda o servidor por meio do Docker. Faremos isso agora.

Primeiro abrimos o terminal. Depois, passamos o comando docker-compose up seguido de "Enter".

docker-compose up

Assim, rodamos a aplicação. No nosso caso, deu um erro de conflito com a porta 3306, a qual estamos utilizando no banco de dados.

Para descobrirmos o processo que está utilizando esse comando escrevemos no terminal sudo lsof -i :3306, seguido de "Enter".

sudo lsof -i :3306

Descobrimos que quem está utilizando é o PID USER 1870. Precisaremos matá-lo, então, passamos o comando sudo kill 1870.

sudo kill 1870

Em seguida, passamos o comando docker-compose up. Agora deu certo!

Lembrando que é muito importante que você faça esse comando antes de começarmos a alterar a API.

Para interagir com a API utilizaremos o Insomnia. Ao abri-lo, na lateral esquerda da tela, encontramos diversas pastas como "Autenticação", "Pacientes" e "Especialistas".

Dentro dessas pastas encontramos as requisições http, protocolos utilizados para interagir com a API.

Desenvolvemos um conteúdo explicativo no Preparando Ambiente sobre como o Insomnia deve ser configurado.

Feito isso, voltamos para o VS Code. No terminal, notamos que o servidor está pronto para ser utilizado.

Além disso, como a API é dividida em pastas por funcionalidades, você pode encontrar arquivos controladores, Controller.ts ou entidades, Entity.ts.

Essa é a organização da API, que também utiliza algumas ferramentas, como o Typescript, o servidor pelo Express e o banco de dados no MySQL.

Caso você não tenha familiaridade com essas ferramentas, não se preocupe. Tudo o que manipularemos ao longo do curso faremos um passo a passo bem detalhado.

O próximo passo é analisar quais são as vulnerabilidades do Voll Med. A partir disso, poderemos identificar quais melhorias podemos aplicar.

Até o próximo vídeo!

Lidando com SQL Injection - Vulnerabilidade de SQL Injection

Agora que já conhecemos a API Voll Med e rodamos o comando docker-compose up, podemos fazer requisições.

Começamos abrindo o Insomnia. Na lateral esquerda, clicamos na pasta "Paciente" e depois em POST Cadastro Paciente.

Percebemos que a rota é feita por meio da url "localhost:3000/paciente". Nesse POST enviaremos dados por meio de um JSON que pede diversos dados como CPF.

Para isso, utilizaremos o gerador de CPF do 4devs no navegador. Ao acessá-lo, nos deparamos com alguns campos de preenchimento.

O primeiro se refere a pontuação do CPF, como não queremos, selecionamos a opção "Não". Depois, no campo "Estado de Origem do CPF" deixamos selecionado a opção "Indiferente". Após, clicamos no botão "Gerar CPF".

Clicamos para copiar o CPF que foi gerado. Depois, voltamos para o Insomnia para criar o cadastro do paciente.

Criando o cadastro do paciente

Na primeira linha de código, em cpf, colamos o número gerado no 4devs. Em nome, escrevemos Vinicius e em e-mail passamos vinicius@email.com. Em estaAtivo, manteremos como true.

Abaixo encontramos outros dados, como:

A única regra para criar novos pacientes é que o CPF seja único, portanto, como o restante dos dados já estavam preenchidos, manteremos.

O planosSaude está preenchido como [1], pois esse número indica um plano específico criado no front-end. Nesse caso o 1 se refere a Unimed.

Considerando tudo isso, o código fica da seguinte forma:

{
"cpf": "70792109090",
"nome": "Vinicius",
"email": "vinicius@email.com",
"estaAtivo":true,
"endereco": {
"cep": 38410272,
"rua": "Rua 28",
"numero": 1020,
"complemento": "casa",
"estado": "MG"

},
"senha": "senhaforte123",
"telefone": "27999335534",
"possuiPlanoSaude": true,
"planosSaude":[1],
"historico": ["sinusite, moderado"],
"imagemurl":
"https://media.discordapp.net/attachments/885931151980658698/1121873215606751232/shutterstock_1151921795.jpg"
}

No topo direito da tela, clicamos no botão "Send" para enviar os dados. Feito isso, o paciente é cadastrado. Aparentemente está tudo certo com nossa aplicação, até mesmo um id foi gerado para o paciente.

Na lateral esquerda do Insomnia, encontramos um GET do tipo Consulta por Paciente, clicamos nele. Verificaremos se o paciente Vinicius foi mesmo cadastrado.

No centro da tela, encontramos a seguinte url:

http://localhost:3000/paciente/consulta-por-paciente?userInput=Camila

Conseguimos entender que o userInput é um parâmetro que precisa ser enviado na url, nesse caso o nome do paciente. Sendo assim, apagamos o "Camila" e escrevemos "Vinicius". Feito isso, temos como resposta todos os dados do Vinicius.

Existem alguns cuidados que podemos tomar em relação a colocar nomes na url. Aprenderemos isso no vídeo seguinte.

Te esperamos lá!

Sobre o curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada

O curso Desenvolvimento Seguro: estratégias de segurança para dados de entrada possui 148 minutos de vídeos, em um total de 56 atividades. Gostou? Conheça nossos outros cursos de AppSec & DevSecOps em Cibersegurança, ou leia nossos artigos de Cibersegurança.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda AppSec & DevSecOps acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas