Entenda como os sites funcionam – Protocolo HTTP

Dessa vez resolvi escrever um artigo mais técnico mas que vai te ajudar muito, principalmente se você for iniciante nesse excitante mundo que é o hacking. Sim, o assunto de hoje é o Protocolo HTTP/HTTPS.

Primeiro de tudo, precisamos definir o que é protocolo e depois o que é o protocolo HTTP.

De forma simples, um protocolo pode ser definido como uma sequência de regras que regem uma conexão, caso elas não possam ser cumpridas, temos um problema de conexão.

No cenário web o HTTP é responsável por garantir que possamos nos comunicar de maneira eficiente com um site.

Mas antes de analisarmos com calma esse protocolo vamos entender primeiro o modelo cliente servidor sob o qual a web funciona.

Para entendermos esse modelo, podemos fazer um paralelo com uma pizzaria, onde o dono dela seria nosso servidor e nós, os clientes, o que podemos entender dessa analogia é que há vários clientes para apenas um servidor, o mesmo ocorre na web.

Também podemos perceber que o servidor possui a responsabilidade de fornecer um serviço ao cliente que, por sua vez, possui a responsabilidade de fornecer todas as informações necessárias para que o serviço possa ocorrer. Ou seja, o servidor responde as requisições do cliente.

Agora, se em nossa analogia adicionarmos os garçons podemos dizer que eles fazem o papel do protocolo HTTP/HTTPS já que fornecem um meio para que as informações entre um lado e outro sejam transmitidas, é interessante perceber que o modo como a mensagem será usada fica totalmente a cargo do destinatário.

Blz, com essa base já podemos partir para analisar sua estrutura e o melhor jeito de fazer isso é analisando uma requisição que é uma mensagem enviada do cliente, ou seja de você, para o servidor.

GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection: close
Cookie:

A princípio isto pode parecer confuso, mas vamos simplificar.

Tudo o que está escrito acima representa o cabeçalho (header) da request. Ele é usado para enviar informações técnicas da conexão.

Além do cabeçalho, podem ser anexados também um corpo (body), nele são colocados as informações que o cliente quer enviar para o servidor, como por exemplo email e senha para validação de login.

POST / HTTP/1.1 
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type: text/plain
Content-Lenght: 325
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: 

body

Observe que o cabeçalho e o corpo da request são separados por uma quebra de linha, caso ela não existisse tudo seria considerado como parte do cabeçalho.

Depois desses dois exemplos vamos analisar linha por linha da requisição, a primeira é responsável por definir três coisas:

  1. O método da requisição:
    • GET – O cliente requisita algum recurso, como uma página ou uma imagem.
    • HEAD – Muito parecido com o GET, porém aqui o cliente requisita somente o cabeçalho header da página.
    • POST – O cliente está enviando dados que estão contidos no corpo da request.
    • PUT – Parecido com o POST, diferindo apenas em como o servidor irá lidar com os dados enviados. Por exemplo: Caso seja necessário atualizar os dados de um usuário, usa-se o método PUT, pois com ele o servidor irá sobrescrever os dados antigos com os novos, gerando somente um registro, com o POST o servidor cria vários registros, um para cada request feita.
    • DELETE – O cliente requisita que algum recurso seja excluído do servidor.
  2. O endpoint para que ela está sendo enviada
  3. A versão do protocolo HTTP

O restante do header pode conter diversos dados, sendo eles sempre definidos por CHAVE: VALOR. Os mais comuns são:

  • Host – Nome do domínio do servidor. Ex: www.google.com; www.youtube.com
  • User-Agent – Usado pelo servidor para identificar quem está fazendo a request. Ela contém dados como navegador e sistema operacional do cliente.
  • Accept – Exprime quais tipos de dados o cliente é capaz de entender. Ex: text/plain; application/json
  • Content-Type – Indica qual o tipo dos dados que o servidor ou o cliente está enviando. Ex: text/plain; application/json
  • Accept-Language – Indica qual linguagem o cliente entende. Usado para definir se uma página estará em português ou inglês, por exemplo.
  • Connection – Define se a conexão com o servidor deve ser mantida para futuras requisições, no primeiro caso seu valor é keep-alive, no segundo close.
  • Cookie – Funciona como um identificador e mantenedor de sessão. Por definição o HTTP é um protocolo stateless, o que significa que ele não mantém estado, ou seja, se você fizer login na sua rede social e tentar fazer outra ação, como mandar uma mensagem, você teria que se autenticar novamente, pois não há nada que defina você como logado, por isto foram definidos os cookies, com eles o usuário não precisa se autenticar toda vez. Entretanto, eles precisam ser enviados em todas as requisições subsequentes.
  • Referer – Contém o endereço de onde a request foi originada. Isto é usado pelo servidor para saber de onde os visitantes de seu site se originam.
  • Origin – Este header é muito parecido com o Referer, pois ambos indicam de onde a solicitação foi originada, no entanto este indica só o nome do site, não o caminho todo. Exemplo: Referer: exemplo.com/artigos/protocolo%20HTTP%20HTTPS Origin: exemplo.com

Durante sua carreira como Bug Hunter muito provavelmente você encontrará diversos headers que não estão presentes nessa lista, quando isso ocorrer recomendo que de uma olhada no site da mozilla, lá eles possuem uma lista com todos os header usados.

Okk, por fim, vamos analisar a estrutura da response, uma padrão geralmente tem a seguinte estrutura:

HTTP/1.1 200 OK
Date: Mon, 11 May 2020 19:45:35 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Strict-Transport-Security: max-age=31536000
Server: gws
X-Frame-Options: SAMEORIGIN
Set-Cookie: 
Connection: close
Content-Length: 194814

Essa é a response para a primeira request que fizemos, no item anterior temos apenas seu cabeçalho e body não será anexado pois é muito grande.

Como na requisição a primeira linha da response também é muito importante pois dela define duas coisa: a versão do protocolo usado e o status da resposta, os mais comuns são

  • 1XX: Passa informações: Se a solicitação foi aceita, ou se o processo continua em desenvolvimento.
  • 2XX: A solicitação foi executada com sucesso.
  • 3XX: Indica que há a necessidade de redirecionamento para que a solicitação possa ser concluída.
  • 4XX: Mostra que houve um erro na solicitação por parte do cliente.
  • 5XX: Indica que o servidor não pôde responder a solicitação.

Também temos headers importantes na response, os mais comuns são:

  • Date: Data em que a resposta foi originada.
  • Expires: Indica quando o conteúdo deve ser considerado desatualizado, neste caso o valor -1 significa que o conteúdo expira imediatamente após ser enviado.
  • Cache-Control: Define políticas de cache.
  • Etag: Identifica uma versão específica de algum recurso. Permite assim que o servidor não envie a resposta completa, proporcionando uma maior velocidade.
  • Server: Define informações acerca do servidor.
  • Set-Cookie: Usado para o servidor enviar cookies para o cliente.
  • X-Frame-Options: Indica se o navegador deve ou não renderizar uma página em <iframe>.
0 Compart.
Twittar
Compartilhar
Compartilhar
Pin