Escolar Documentos
Profissional Documentos
Cultura Documentos
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?)
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
1 URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]
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
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 )
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.
-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?
Pesquisem quais são os possíveis pontos de entrada (do usuário) em uma aplicação web.
cookies
formulários
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?
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.