Para que possamos hackear alguma coisa devemos primeiro entender seu funcionamento.
Dito isto veremos o como funciona o protocolo HTTP (Hypertext Transfer Protocol), que é a base da World Wide Web.
O HTTP é um protocolo da camada de aplicação do modelo TCP/IP que foi criado para possibilitar a transmissão de dados na internet.
Este protocolo funciona em cima de um modelo chamado cliente-servidor, onde o cliente faz requisições a um servidor, que como resposta lhe envia informações. Uma analogia para este modelo pode ser feita com a relação entre as pizzarias (servidores) e seus respectivos clientes, onde estes solicitam suas pizzas e as aguardam como resposta.
Sendo assim, quando um cliente acessa um site, ele está simplesmente solicitando ao servidor uma página web, que lhe é retornada (uma vez que exista) e renderizada pelo seu navegador.
Entendido o sistema cliente-servidor, veremos agora exemplos de requisições (requests) e repostas (responses) aplicadas ao protocolo HTTP:
Este é um exemplo de uma request:
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 todas as informações necessárias para que a conexão funcione adequadamente. Além do cabeçalho, podem ser anexados também um corpo (body), no qual são colocados os dados que o usuário deseja enviar para o servidor. Observe que o cabeçalho e o corpo da request são separados por uma quebra de linha.
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
- O método da request, que pode ser:
HEAD - Muito parecido com o GET, porém aqui o cliente requisita somente o cabeçalho header da página.
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.
-
A rota da aplicação para a qual a request está sendo feita.
-
A versão do protocolo HTTP.
O restante do header contém diversos itens, sendo eles sempre definidos por CHAVE: VALOR
. Os mais comuns são:
Host - Nome de 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.
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 resposta para a primeira request que fizemos, além deste conteúdo há também um corpo, porém não o anexarei por ser muito grande.
Vamos analisar os cabeçalhos dessa resposta, na primeira linha há duas coisas: A versão do protocolo HTTP usado e o status da resposta, que podem ser:
As seguintes linhas mostram cabeçalhos comuns das respostas, são eles:
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.
A diferença entre o Hypertext Transfer Protocol e o Hyper Text Transfer Protocol Secure, como o próprio nome nos induz, está na questão da segurança. O segundo é uma junção do protocolo HTTP e do protocolo SSL/TLS. O SSL/TLS permite que dados sejam transmitidos por meio de uma conexão criptografada e que o servidor e o cliente sejam autênticos. O HTTPS se faz necessário principalmente porque as conexões Wi-fi estão suscetíveis a ataques Man-in-the-Middle, no qual um atacante engana o servidor e o cliente para que as requisições e respostas passem por ele, vide a imagem: