Ícone do site Diego Macêdo

Protocolo HTTP: Estrutura, solicitações, respostas, métodos e códigos de status

Hypertext transfer protocol (HTTP) é o protocolo de comunicações usado para acessar a World Wide Web e por todos os aplicativos da web de hoje. É um protocolo simples que foi originalmente desenvolvido para a recuperação de recursos estáticos baseado em texto. Desde então, foi ampliado e alavancado em várias maneiras para apoiar as complexas aplicações distribuídas que são agora comuns.

HTTP usa um modelo baseado na mensagem em que um cliente envia uma mensagem de solicitação e o servidor retorna uma mensagem de resposta. O protocolo é essencialmente sem conexão (connectionless): embora HTTP usa o protocolo TCP stateful como o seu mecanismo de transporte, cada troca de solicitação e resposta é uma transação autônoma e pode usar uma conexão TCP diferente.

Solicitações HTTP

Todas as mensagens HTTP (solicitações e respostas) consistem em um ou mais cabeçalhos, cada um em uma linha separada, seguido por uma linha em branco obrigatória, seguido de um corpo da mensagem opcional. Uma solicitação HTTP típica é a seguinte:

GET /auth/488/YourDetails.ashx?uid=129 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml,
image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwaveflash,
*/*
Referer: https://mdsec.net/auth/488/Home.ashx
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64;
Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR
3.0.30729; .NET4.0C; InfoPath.3; .NET4.0E; FDM; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: mdsec.net
Connection: Keep-Alive
Cookie: SessionId=5B70C71F3FD4968935CDB6682E545476

A primeira linha de cada solicitação HTTP é composto por três itens, separados por espaços:

Vejamos alguns outros pontos interessantes no exemplo dado:

Respostas HTTP

Uma resposta HTTP típica seria assim:

HTTP/1.1 200 OK
Date: Tue, 19 Apr 2011 09:23:32 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1067
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><html xmlns=”http://
www.w3.org/1999/xhtml” ><head><title>Your details</title>
...

A primeira linha de toda resposta HTTP consiste em três itens, separados por espaços:

Vejamos outros pontos interessantes nesta resposta:

Métodos HTTP

Quando você está atacando aplicações web, você estará lidando quase que exclusivamente com os métodos mais comumente usados: GET e POST. Você precisa estar ciente de algumas diferenças importantes entre estes métodos, uma vez que pode afetar a segurança da aplicação, se negligenciado.

Método GET

O método GET é projetado para recuperar os recursos. Ele pode ser usado para enviar parâmetros para o recurso solicitado na string da URL. Isto permite aos usuários guardar uma URL de recurso dinâmica para que possam reutilizar depois ou outros usuários podem obter o recurso equivalente numa ocasião posterior (como numa consulta de pesquisa guardada nos favoritos). URLs são exibidas na tela e são logados em vários locais, tais como o histórico do navegador e os logs de acesso do servidor web. Eles são também transmitidos no cabeçalho Referer para outros locais quando links externos são seguidos. Por estas razões, a string de consulta não deve ser usada para transmitir informações sensíveis.

Ao consultar por Maceió no Google, podemos ver que o parâmetro q está passando o valor que digitei Maceió

https://www.google.com.br/search?&q=Maceió

Método POST

O método POST é projetado para executar ações. Com este método, os parâmetros de solicitação podem ser enviados tanto na string de consulta URL e no corpo da mensagem. Embora o URL ainda possa ser armazenada, todos os parâmetros enviados no corpo da mensagem serão excluídos ao ser guardado nos favoritos. Estes parâmetros também serão excluídos dos vários locais em que as URLs são armazenadas e do cabeçalho Referer. Porque o método POST é projetado para executar as ações, se um usuário clicar o botão Voltar do navegador para retornar a uma página que foi acessado usando este método, o navegador não reeditar automaticamente o pedido. Em vez disso, ele avisa o usuário de que ele está prestes a fazer, como mostrado abaixo na imagem. Isso impede que os usuários inadvertidamente executar uma ação mais de uma vez. Por esta razão, as solicitações POST deve ser sempre usado quando uma ação está sendo executada.

Para comprovar isto, visite o site http://www.w3schools.com/php/demo_form_post.php e preencha o formulário. Após enviar, tente atualizar a página e você será alertado sobre reenviar as informações.

Firefox – Alerta para reenviar as informações no POST do formulário

Além dos métodos GET e POST, o protocolo HTTP suporta outros métodos que têm sido criadas para fins específicos. Aqui estão os outros que são mais mais conhecidos:

Existem outros métodos HTTP, mas que não são relevantes para ataques de aplicações web. Entretanto, um servidor web pode se expor para ataque se um método específico perigoso esteja ativo. Veremos estes exemplos em outra postagem.

URLs

Uma Uniform Resource Locator (URL) é um identificador único para um recurso da Web através do qual aquele recurso pode ser recuperado. O formato da maior parte das URLs é a seguinte:

protocolo://hostname[:porta]/[caminho/]arquivo[?param=valor]

Vários componentes deste sistema são opcionais. O número da porta é normalmente incluídos somente se ele for diferente do padrão utilizado pelo protocolo em questão. A URL usada para gerar o pedido de HTTP mostrada anteriormente é a seguinte:

https://mdsec.net/auth/488/YourDetails.ashx?uid=129

Além desta forma absoluta, URLs podem ser especificadas para um host em particular ou relativo a um determinado caminho naquele host. Por exemplo:

/auth/488/YourDetails.ashx?uid=129
YourDetails.ashx?uid=129

Estas formas relativas são frequentemente utilizadas em páginas da web para descrever a navegação dentro do site ou aplicação em si.

Representational State Transfer (REST) é um estilo de arquitetura para sistemas distribuídos em que solicitações e respostas contêm representações do estado atual dos recursos do sistema. As principais tecnologias empregadas na World Wide Web, incluindo o protocolo HTTP e o formato de URLs, estão de acordo com o estilo arquitetônico REST.

Embora as URLs que contenham parâmetros dentro da string de consulta que eles mesmos estão em conformidade com as restrições REST, o termo “URL estilo REST” é muitas vezes usado para significar uma URL que contém os parâmetros dentro do caminho do arquivo da URL, ao invés da string de consulta. Por exemplo, a URL seguinte contendo uma string de consulta:

http://www.aplicacaowebfalsa.com.br/busca?marca=fiat&modelo=uno

Corresponde ao estilo de URL contendo os parâmetros “estilo REST”:

http://www.aplicacaowebfalsa.com.br/busca?marca=fiat&modelo=uno

Cabeçalhos HTTP

HTTP suporta um grande número de cabeçalhos, alguns dos quais são implementados para fins específicos e incomuns. Alguns cabeçalhos podem ser usados para ambos os pedidos e respostas, e os outros são especificos a um destes tipos de mensagens. Veremos abaixo os cabeçalhos que são possíveis de encontrar quando for atacar aplicações web.

Cabeçalhos gerais

Cabeçalhos de solicitações

Cabeçalhos de respostas

Cookies

Os cookies são uma parte fundamental do protocolo HTTP que a maioria das aplicações web dependem. Frequentemente pode ser usado como um meio para a exploração de vulnerabilidades. O mecanismo de cookie permite que o servidor enviar dados para o cliente, o qual o cliente armazena e reenvia para o servidor. Ao contrário dos outros tipos parâmetros de solicitaçõess (aqueles dentro da string de consulta URL ou no corpo da mensagem), cookies continuam a ser reenviados em cada pedido subsequente sem qualquer ação especial solicitada pelo aplicativo ou o usuário.

Um servidor emite um cookie usando o cabeçalho de resposta Set-Cookie, como você pode ser visto:

Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

O navegador do usuário então automaticamente adicionar o cabeçalho seguinte nas solicitações subsequentes de volta para o mesmo servidor:

Cookie: tracking=tI8rk7joMx44S2Uu85nSW

Cookies normalmente consistem de um par de nome/valor, como mostrado, mas podem consistir de qualquer string que não contenha um espaço. Vários cookies podem ser emitidos usando vários cabeçalhos Set-Cookie na resposta do servidor. Estes são submetidos de volta para o servidor no mesmo cabeçalho Cookie, com um ponto e vírgula separando diferentes cookies.

Além do valor real do cookie, o cabeçalho Set-Cookie pode incluir qualquer um dos seguintes atributos opcionais, que podem ser utilizados para controlar a forma como o navegador lida com o cookie:

Cada um destes atributos de cookies pode afetar a segurança do aplicativo. O impacto principal é sobre a capacidade do atacante de alvejar diretamente os outros utilizadores da aplicação.

Código dos Status HTTP

Cada mensagem de resposta HTTP deve conter um código de status em sua linha primeiro, indicando o resultado do pedido. Os códigos de status caem em cinco grupos, de acordo com o primeiro dígito do código:

Existem numerosos códigos de status específicos, muitos dos quais são utilizados apenas em situações especiais. Aqui estão os códigos de status que são mais suscetíveis de encontrar ao atacar uma aplicação web, junto com a frase habitualmente associado a eles:

HTTPS

O protocolo HTTP usa TCP simples como seu mecanismo de transporte, que é criptografado e, portanto, pode ser interceptado por um atacante que esteja adequadamente posicionado na rede. HTTPS é, essencialmente, o mesmo protocolo da camada de aplicação como HTTP, mas é encapsulado sobre o mecanismo de transporte seguro, Secure Sockets Layer (SSL). Isso protege a privacidade e integridade dos dados que passa sobre a rede, reduzindo as possibilidades de ataques de interceptação não-invasivas. Solicitações e respostas HTTP funcionam exatamente da mesma maneira, independentemente de SSL estar sendo usado para o transporte.

Observação: SSL tem sido estritamente substituída por Transport Layer Security (TLS), mas ultimamente ainda é referido utilizando o nome antigo.

HTTP Proxies

Um proxy HTTP é um servidor que faz o intermédio do acesso entre o navegador do cliente e o servidor Web de destino. Quando um navegador estiver configurado para usar um servidor proxy, ele fará solicitações para este servidor. O proxy retransmite as solicitações para os servidores web relevantes e encaminha suas respostas de volta para o navegador. A maioria dos proxies também oferecem serviços adicionais, incluindo cache, autenticação e controle de acesso.

Você deve estar ciente de duas diferenças na forma como HTTP funciona quando um servidor proxy está sendo usado:

HTTP Authentication

O protocolo HTTP inclui seu próprio mecanismo para autenticação de usuários usando vários esquemas de autenticação, incluindo os seguintes:

É relativamente raro encontrar estes protocolos de autenticação sendo usadas pelas aplicações web na internet. Eles são mais usadas comumente dentro das organizações para acessar serviços baseados em intranet.

Fonte: The Web Application Hacker’s Handbook – 2nd edition.

Mapa Mental

Mapa Mental – Protocolo HTTP

Sou bacharel em Sistemas de Informação pela Estácio de Sá (Alagoas), especialista em Gestão Estratégica da Tecnologia da Informação pela Univ. Gama Filho (UGF) e pós-graduando em Gestão da Segurança da Informação pela Univ. do Sul de Santa Catarina (UNISUL). Certificações que possuo: EC-Council CEH, CompTIA (Security+, CySA+ e Pentest+), EXIN (EHF e ISO 27001), MCSO, MCRM, ITIL v3. Tenho interesse por todas as áreas da informática, mas em especial em Gestão e Governança de TI, Segurança da Informação e Ethical Hacking.

Sair da versão mobile