Como funciona uma aplicação web
Nesse artigo eu explico, de forma superficial, como uma aplicação web funciona, para compreendermos os mais variados tipos de ataque que ocorrem em aplicações web.
Last updated
Nesse artigo eu explico, de forma superficial, como uma aplicação web funciona, para compreendermos os mais variados tipos de ataque que ocorrem em aplicações web.
Last updated
Para detectarmos anomalias em aplicações web, precisamos primeiro saber como elas funcionam na prática. Aplicações web utilizam protocolos específicos para se comunicarem precisamente com outros ativos. No caso das aplicações web, elas utilizam o protocolo Hypertext Transfer Protocol (HTTP). Vamos ver, mais abaixo, como funciona o protocolo HTTP.
O protocolo HTTP atua na sétima camada do modelo OSI (Aplicação). Isso significa que protocolos como Ethernet, IP e SSL são utilizados antes do protocolo HTTP.
A comunicação HTTP é estabelecida entre o servidor e o cliente da seguinte maneira:
Primeiro, o cliente solicita algum recurso específico do servidor
O servidor recebe a requisição HTTP e envia uma resposta (HTTP) ao cliente, após passar por alguns controles e processos
O dispositivo do cliente então recebe a resposta e mostra o recurso solicitado no formato apropriado
Abaixo, veremos sobre requisições e respostas HTTP em maiores detalhes.
Uma requisição HTTP é utilizada para obter algum recurso específico do servidor. Esse recurso pode ser um arquivo HTML, um vídeo, dados em json etc. O trabalho do servidor, nesse caso, é processar a requisição recebida e apresentar a resposta ao usuário.
Existe um formato HTTP padrão que todas as requisições devem possuir, para que os servidores a compreendam corretamente. Se a requisição é enviada em um formato diferente, o servidor web não irá entender e responderá com uma mensagem de erro para o usuário, ou simplesmente não conseguirá entregar o serviço.
Uma requisição HTTP consiste de uma linha de requisição (Request Line), linhas de cabeçalho (Request Headers) e o corpo da mensagem (Request Message Body). A linha de requisição contém o método HTTP utilizado e o recurso solicitado ao servidor. Nas linhas de cabeçalho existem informações específicas de cabeçalho que o servidor irá processar. A linha de corpo da mensagem contém as informações a serem enviadas ao servidor.
Examinando a requisição na imagem acima, temos as seguintes linhas:
GET
-> Método utilizado para solicitar o recurso/
dentro do servidor. Uma solicitação sem nome como essa nos diz que a página principal do servidor web foi solicitada
Host
-> Hoje em dia, existem aplicações web que pertencem a mais de um domínio encontrado em um único servidor, então os navegadores web utilizam esse para descrever a qual domínio o recurso solicitado pertence
Cookie
-> Quando uma aplicação web precisa armazenar informações no dispositivo do cliente, ela utiliza o cabeçalhoCookie
para tal. Cookies são, geralmente, utilizados para armazenar informações de sessão do usuário. Graças a esse cabeçalho, não precisamos digitar nossas credenciais a todo tempo quando visitamos uma aplicação que requer login
Upgrade-Insecure-Requests
-> Utilizado para informar que o cliente deseja realizar uma comunicação criptografada (SSL)
User-Agent
-> Nesse cabeçalho são passadas as informações sobre o navegador e sistema operacional utilizados pelo cliente. Os servidores utilizam essa informação para enviar respostas HTTP específicas para cada tipo de dispositivo. Existem, inclusive, scanners de vulnerabilidades que utilizam User-Agents específicos, justamente para sua fácil identificação
Accept
-> Cabeçalho que descreve o tipo de informação solicitada pelo cliente
Accept-Encoding
-> Descreve o tipo de codificação que o dispositivo do cliente compreende é passado no cabeçalho
Accept-Language
-> Nesse cabeçalho, temos as informações a respeito do idioma do cliente. O servidor web utiliza essa informação para entregar o conteúdo no idioma adequado ao cliente
Connection
-> Esse cabeçalho mostra como a conexão HTTP será realizada. Se a informaçãoclose
estiver nesse cabeçalho, quer dizer que a conexão será fechada após a resposta do servidor ser recebida. Se a conexão forKeep-Alive
, sigifica que a conexão será mantidaUma linha vazia é inserida entre os cabeçalhos da requisição e seu corpo, para que as informações sejam particionadas
Após isso, entramos no corpo (
Body
) da requisição, onde são passadas as informações que o cliente deseja comunicar ao servidor. Se uma requisição utilizar o métodoPOST
por exemplo, então os parâmetros POST são passados nesse campo
Uma vez que o servidor web recebe a requisição HTTP, ela executa os controles necessários, processa e envia o recurso solicitado ao cliente. Não existe um processo muito "uniforme" nessa parte, por conta das inúmeras e diferentes tecnologias e designs utilizados mundialmente. O servidor pode enviar dados a partir de um banco de acordo com o recurso solicitado, ou ela pode processar de acordo com os dados de entrada. Porém, a mensagem de resposta HTTP deve chegar ao cliente após todos os processos.
Uma mensagem de resposta HTTP contém uma linha de status, cabeçalhos e corpo de resposta. A linha de status contém o código de status (como por exemplo, 200 (OK)) e informações a respeito do protocolo HTTP. Existem cabeçalhos utilizados para inúmeras finalidades dentro dos cabeçalhos de resposta. Informações sobre o recurso solicitado são localizadas no corpo da resposta.
Temos as seguintes informações a partir da requisição de exemplo acima:
Status Line
-> Informações sobre a versão e código de status de resposta HTTP. O código de status HTTP representa o status da requisição. Existem inúmeros códigos de status de resposta HTTP, mas eles podem ser sumarizados em:
100-199 -> Respostas informacionais
200-299 -> Respostas de êxito
300-399 -> Respostas de redirecionamento
400-499 -> Respostas de erro do cliente
500-599 -> Respostas de erro do servidor
Response Headers
-> Cabeçalhos comumente encontrados em respostas HTTP:
Date
-> Data e hora exatos em que o servidor enviou a resposta ao cliente
Connection
-> Como a conexão será manipulada, assim como no cabeçalho de requisição
Server
-> Informações sobre o sistema operacional e versão do servidor
Last-Modified
-> Última vez que o recurso solicitado foi modificado. Esse cabeçalho é utilizado em mecanismos de cache
Content-Type
-> Tipo de informação enviada ao cliente
Content-Length
-> Tamanho da informação enviada ao cliente
Response Body
-> No corpo da resposta contém a informação solicitada pelo cliente e, consequentemente, enviada pelo servidor.