Você está na página 1de 18

Web & Mobile Exploitation

Aula 2
16/02/2022
Agenda
Protocolo HTTP
Utilitário curl
Vulnerabilidade: Open Redirect
O que ocorre quando digitamos uma URL em nosso browser?
O que ocorre quando digitamos uma URL em nosso browser?
1. Resolução de nomes (na seguinte ordem):
Cache local (esse nome já foi resolvido? ele existe na minha memória [cache] ?)
Sistema Operacional tem alguma configuração para esse nome?
Arquivo hosts (/etc/hosts ou C:\Windows\System32\drivers\etc\hosts no Windows)
Consulta ao servidor DNS configurado no SO (o que está em nameserver dentro de /etc/resolv.conf?)

2. Fazer uma requisição HTTP ao IP que descobrimos no passo anterior:


Abrir uma conexão TCP para o servidor (3-way handshake)
Enviar uma requisição HTTP para o recurso a ser acessado.
Receber uma resposta HTTP - que virá com um determinado HTTP status que veremos adiante.
Protocolo HTTP

O que são esses termos:

Requisição (request)?
Resposta (response)?
GET, POST, OPTIONS, HEAD?
404? 302? 500?
Content-Type? Location?
WTF?!?!
Protocolo HTTP
HTTP = HyperText Transfer Protocol
Definido pela RFC 7231
Várias versõs: 1.0, 1.1 e 2.0
Arquitetura Cliente-Servidor: um servidor serve recursos (arquivos, etc) e um cliente solicita estes recursos para
consumi-los.
Modelo de requisição-resposta utilizado para servir Recursos
Recursos são identificados por URI e URL
URI ou Uniform Resource Identifier é uma sequência única de caracteres que identifica um recurso lógico ou
físico que será utilizado por tecnologias web.
URL ou Uniform Resource Locator é o endereço propriamente dito. Uma URL é um tipo específico de URI.
URI - Uniform Resource Identifier

De forma genérica o URI consiste no seguinte padrão:

1 URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]

Onde o componente authority se divide em três subcomponentes:

1 authority = [userinfo "@"] host [":" port]

Existem diversos schemes diferentes. Alguns úteis para SSRF como veremos adiante, por exemplo:

gopher://
ftp://
file://
URI - Uniform Resource Identifier

Vamos utilizar a função PHP parse_url para verificar cada um desses componentes nos endereços a seguir:

https://www.fiap.com.br
ftp://choko:s3cr33t@vault.fiap.box:9021/notes
http://fiap.web.hacking:9999/profile?user=fiapadmin&ip=127.0.0.1#preferences
Parseando o URI

Saída da função parse_url():

1 $url = 'ftp://choko:s3cr33t@vault.fiap.box:9021/notes';
2 print_r(parse_url($url));
3 Array
4 (
5 [scheme] => ftp
6 [host] => vault.fiap.box
7 [port] => 9021
8 [user] => choko
9 [pass] => s3cr33t
10 [path] => /notes
11 )

Dúvida rápida: o que vocês entendem por parsing?


curl 101

O curl é um programa open source utilizado desde 1998 em scripts ou linha de comando para realizar transferência de
dados. Sua versão atual é a 7.81.0 lançada em 05/01/2022.

Alguns parâmetros úteis:

-v verbose
// Mensagens iniciando em:
* são mensagens de controle do curl
> o que estamos enviando (CLIENTE > SERVIDOR)
< o que recebemos (SERVIDOR < CLIENTE)
-L seguir redirecionamentos
-A user-agent
-k aceitar certificado SSL
-X especificar um método HTTP diferente
curl 101

Pergunta: como você faria para dar um grep na saída verbosa (-v) do curl para pegar um valor determinado de
cabeçalho?

Imagine que eu quero saber para onde serei redirecionado. O comando a seguir funciona?

1 curl -v "http://www.fiap.com.br" | grep "Location"


Idéia geral de segurança em Web

Dados Confiáveis vs Dados Não-Confiáveis

Pesquisem quais são os possíveis pontos de entrada (do usuário) em uma aplicação web.

Alguns exemplos são:

cookies
formulários

Mais o que vocês podem identificar?

1 - upload de arquivo
Discussão sobre a vulnerabilidade: Open Redirect
Se defendendo contra redirects de URL Shortners como tinyurl, bit.ly, cutt.ly, etc. (ex: header Location)
Impactos como Phishing, DoS?
https://www.site_de_respeito.com.br/static/blablabla/?r=http://maldade.virus.com/confiavel.exe
Exemplo de página suscetível a Open Redirect

Arquivo index.php

1 <?php
2 $page = $_GET['url'];
3 header("Location: " . $page, true, 302);
4 ?>

Rodaremos o servidor de testes em PHP. Salvem o código o index.php no mesmo diretório execute:

1 php -S 0.0.0.0:8081

Então acesse o endereço localhost:8081 via curl ou pelo browser / DevTools, o que preferir :)
Como corrigir?

Explique com suas palavras como poderíamos impedir este redirecionamento?

Como isto seria no código?


Como corrigir?

Estratégia de correção: checar se a URL que nossa aplicação recebe está em uma lista de redirecionamentos
permitidos. Senão estiver, xingue o hacker.

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 ?>
Próxima aula:

Respondam se existe alguma forma de redirecionar o usuário para o nosso site malicioso bypassando o exemplo
"corrigido" anteriormente.

Mais diversão com HTTP :) Um pouco mais sobre os verbos / métodos e status codes.

Interceptação e manipulação de requisições.

Criem suas contas na HackerOne e na PortSwigger.

Sorteio de duplas para o CP 1!


Links:
Internet Events - Ataque aos DNS root servers em 2002
Talk sobre CTFs no Mente Binária
Web 101 // livro que você pode obter free no hackerone.com
Linguagens de Programação
Linuxzoo
RFC HTTP
HTTP CATS

Você também pode gostar