Você está na página 1de 22

Web & Mobile Exploitation

Aula 3
23/02/2022
Agenda
Bypass do código corrigido na última aula?
Ainda sobre HTTP:
Versões do protocolo e suas principais diferenças
Métodos HTTP
HTTP Status codes
HTTP vs HTTPS
Interceptando e manipulando requisições HTTP
Primeiro check point e sorteio
Bypass do código corrigido na última aula?

O que podemos enviar via GET para o parâmetro `url` que nos permitiria redirecionar o usuário para uma página
de nossa escolha?

1 <?php
2 $page = $_GET['url'];
3 $valid_urls = array("http://www.malvados.com.br", "http://www.xkcd.com", "http://www.pudim.com.br");
4 if (in_array($page, $valid_urls)){
5 header("Location: " . $page, 302);
6 }
7 else {
8 echo "<h1> XISPA SEU HACKER !@#$%#DO! >:/ </h1>";
9 echo "<pre>";
10 print_r(parse_url($page));
11 echo "</pre>";
12 die();
13 }
14 ?>
Bypass do código corrigido na última aula?

Revise o código pensando: qual informação eu, enquanto atacante, controlo? 🤔


1 <?php
2 $page = $_GET['url'];
3 $valid_urls = array("http://www.malvados.com.br", "http://www.xkcd.com", "http://www.pudim.com.br");
4 if (in_array($page, $valid_urls)){
5 header("Location: " . $page, 302);
6 }
7 else {
8 echo "<h1> XISPA SEU HACKER !@#$%#DO! >:/ </h1>";
9 echo "<pre>";
10 print_r(parse_url($page));
11 echo "</pre>";
12 die();
13 }
14 ?>
Bypass do código corrigido na última aula?

Apenas 2 alunos me informaram a solução correta até o momento, congratz! 🙌🏾


HTTP: versões do protocolo e suas principais diferenças

5 versões diferentes do HTTP:

HTTP/0.9

HTTP/1.0

HTTP/1.1

HTTP/2.0 (SPDY)

HTTP/3.0 (QUIC)
HTTP: versões do protocolo e suas principais diferenças
HTTP/0.9: protocolo "one-liner"
Muito simples. Suporta apenas GET
Suporta apenas o envio de HTML
Exemplo de request:
1 GET /hello.html

Exemplo de response:
1 <html>Hello friend.</html>

HTTP/1.0: protocolo extendido e base do que utilizamos hoje


Adiciona informação de versão em cada request (ex: `GET /saldo.html HTTP/1.1`)
Introduz os verbos HTTP e status codes
Status codes aparecem no início das respostas
Introduz os cabeçalhos (headers) HTTP
Capacidade de enviar outros documentos além de HTML
Exemplo de request e response no HTTP/1.0

Request:
1 GET /profile.php?user=admin HTTP/1.1
2 Host: 127.0.0.1:8081
3 User-Agent: curl/7.64.1
4 Accept: */*

Response:
1 HTTP/1.1 200 OK
2 Host: 127.0.0.1:8081
3 Date: Wed, 23 Feb 2022 08:14:09 GMT
4 Server: Apache
5 Content-type: text/html; charset=UTF-8
6
7 <html><body>
8 Hello, admin! <img src="/avatars/admin.png"/>
9 </body></html>

No HTTP/1.0 necessitaremos de uma nova conexão para buscar a imagem admin.png, o que é pouco eficiente :/
HTTP: versões do protocolo e suas principais diferenças
HTTP/1.1: padronização do protocolo
Connectionless
Cabeçalhos em ASCII
A conexão é reutilizada para buscar novos documentos (ex: imagens).
Gerenciamento de conexão no HTTP/1.1
HTTP Pipelining
Adição do header `HOST`
Podemos ter mais de uma aplicação web diferente no mesmo servidor! 😎
Negociação de conteúdo (idiomas e codificação)
Controle de cache

HTTP: versões do protocolo e suas principais diferenças


HTTP/2.0 (SPDY): melhora na performance ~ "speedy"
Proposto pelo Google e definido em 2015
Protocolo binário no lugar de texto, multiplexado e com suporte a compressão
Disponível em todos os browsers
Orientado a conexão
Usa TLS 1.2 (https://)
8 dos top 10 sites usam HTTP/2 por default

HTTP/3.0 (QUIC): mais melhorias na performance ~ "quick"


Protocolo customizado na camada de transporte baseado em UDP.
Métodos HTTP

O protocolo HTTP define um conjunto de métodos (verbos) de requisição (request methods) para indicar a ação
desejada a ser realizada em um determinado recurso.

GET - busca um recurso


HEAD - mesmo que o GET porém não traz o corpo da resposta
POST - envia algo para o recurso especificado. Geralmente provoca uma mudança de estado ou afeta /
modifica o servidor
PUT - substitui as representações do recurso alvo com o conteúdo (payload) da requisição
DELETE - deleta o recurso especificado
CONNECT - estabelece um túnel. Utilizado para acessar sites via proxy
OPTIONS - descreve as opções de comunicação com o recurso alvo
TRACE - realiza um teste refletindo a mensagem enviada.
PATCH - aplica uma modificação parcial ao recurso
Métodos HTTP

Um método pode ser considerado safe (seguro) caso não altere o estado do servidor.

Métodos seguros:

GET, HEAD, OPTIONS, TRACE

Métodos inseguros:

CONNECT, DELETE, PATCH, POST, PUT


HTTP Status Codes

Indicam se uma requisição foi completada com êxito. São agrupados em cinco categorias:

1. Informational (100-199)
2. Successful (200-299)
3. Redirection (300-399)
4. Client error (400-499)
5. Server error (500-599)

Respostas que não estejam nesta lista não seguem um padrão e podem ser específicas da aplicação.
HTTP Status Codes da Zoeira

Teapot

Existe uma excelente talk da DEF CON (how’s your english? 🤓) sobre defesa contra scanners automatizados
baseado em Status Codes. Confiram!
HTTP vs HTTPS
HTTPS é HTTP com criptografia. 🙃
A única diferença entre ambos é que HTTPS utiliza TLS (SSL) para criptografar requisições e respostas HTTP.
Como vimos nas versões, o HTTP/1.x utiliza os cabeçalhos em ASCII, ou seja, é passível de interceptação.

Ao utilizarmos HTTPS, ao invés de um atacante ver a requisição assim:

1 GET /hello.txt HTTP/1.1


2 User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
3 Host: www.example.com
4 Accept-Language: en

Ele a verá assim:

1 t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1
HTTP vs HTTPS
Para ler no carnaval:

O que é SSL
O que é um certificado SSL?
O que ocorre em um SSL Handshake

OBS: todos os textos estão em inglês.


Interceptando e manipulando requisições HTTP

Vamos utilizar o nosso exemplo para inspecionar requisição e resposta no Burp Suite.

Estou utilizando a versão Community do Burp Suite.

Enquanto o Burp carrega pense como um atacante: o que eu consigo controlar nesta resposta? 🤔
1 <?php
2 $page = $_GET['url'];
3 $valid_urls = array("http://www.malvados.com.br", "http://www.xkcd.com", "http://www.pudim.com.br");
4 if (in_array($page, $valid_urls)){
5 header("Location: " . $page, 302);
6 }
7 else {
8 echo "<h1> XISPA SEU HACKER !@#$%#DO! >:/ </h1>";
9 echo "<pre>";
10 print_r(parse_url($page));
11 echo "</pre>";
12 die();
13 }
14 ?>
Interceptando e manipulando requisições HTTP

Isso deveria ocorrer?

1 http://127.0.0.1:8081?url=<h1>Hacked</br>by</br>Fiap1337:b</h1>

Se nossa entrada é 'refletida' na resposta do servidor, então XSS é o caminho! 😈


1 http://127.0.0.1:8081?url=<script>window.location="https://www.exploit-db.com"</script>
Primeiro Check Point
As duplas serão sorteadas e deverão produzir uma breve pesquisa sobre 3 vulnerabilidades, conforme as
orientações a seguir:

Formato: relatório em formato PDF


Data: entrega via TEAMS no máximo até 09/03/2022 às 23:59h
Tema: 1 vulnerabilidade web escolhida pela dupla e outras 2 vulnerabilidades serão sorteadas hoje

Para cada vulnerabilidade realizar um pequeno report contendo:

Nome e impacto da falha


Para cada falha pesquisar 2 exemplos onde as ocorreram no mundo real (aqui vale notícias de vazamentos ou
ataques, reports de Bug Bounty, blogs de pesquisas e artigos)
Elaborar um pequeno trecho de código vulnerável à esta falha (pode pesquisar um exemplo pronto desde que
indique a linguagem de programação que está escrito e em qual linha a falha ocorre);
Pesquisar dois exploits que foram publicados para cada vulnerabilidade e indicar seu nome e URL;
Sorteio 🤩
Próxima aula
Trazer dúvidas sobre o CP 1
Assistir os 2 vídeos sobre HTTP/2 da KringleCon 2018: 1 e 2 e tentar decifrar o tráfego do seu acesso a algum
site que utilize esta tecnologia
Noções de Code Review, SDLC e SAST vs DAST.
Um desafio prático
Bom carnaval, turma! 🥳🍻😎

Você também pode gostar