The Sticker Shop
Difficulty: Easy
Last updated
Difficulty: Easy
Last updated
Em breve.
O desafio consiste em conseguirmos ler a flag que fica em:
http://10.10.50.176:8080/flag.txt
A página é bem simples, contendo apenas um menu para a Home (/
) e Feedback(/submit_feedback
)
O caminho para leitura da flag.txt
não temos permissão de acessar
Vamos focar no único caminho que temos um INPUT de dados, que é o /submit_feedback
Sempre que enviamos qualquer coisa, ele retorna a mesma mensagem.
Tentamos algumas técnicas de XSS mas não tivemos muito sucesso.
Se não há mudança e nenhuma vulnerabilidade aparente, talvez estejamos em um cenário de Blind
Vamos tentar pelo /submit_feedback
técnicas focadas em XSS Blind
Para isso, vou precisar prover um servidor web na minha máquina, uma forma rápida e simples de fazer isso é com o python
Agora podemos tentar uma abordagem simples de XSS Blind, tentando fazer ele trigar nesse servidor web
Observe que conseguimos com sucesso que o servidor alvo, realizasse um GET
no nosso servidor web. E com isso confirmamos que esta vulnerável a XSS Blind.
Agora precisamos ler o conteúdo da flag.txt
Temos uma informação importante da descrição do desafio:
Se tudo esta rodando no mesmo host, então podemos tentar acessar internamente como 127.0.0.1:8080
e tentar ler a flag.
Há diversas formas de criar esse payload, uma das que eu mais gosto é com o XMLHttpRequest()
, ela é uma API Nativa do javascript, que serve basicamente para permitir a comunicação com servidores Web.
Instanciar:
A primeira linha,
var xhr = new XMLHttpRequest();
, cria um "mensageiro". Ele será usado para buscar informações de algum lugar.Configurar o mensageiro:
A função
xhr.open()
diz para onde o mensageiro deve ir, o que ele deve fazer e se deve esperar a resposta.Os argumentos de
xhr.open()
são como as instruções para o mensageiro:
'GET'
: Diga para o mensageiro "vá buscar algo".
'http://127.0.0.1:8080/flag.txt'
: Esse é o endereço onde o mensageiro vai buscar a informação.
true
: Isso significa "vá buscar, mas não precisa esperar parado para a resposta, continue fazendo outras coisas". Isso é chamado de pedido assÃncrono.O que fazer quando ele voltar:
O código em
xhr.onload
é como dizer: "Quando você voltar com a resposta, aqui está o que deve fazer com ela."Nesse caso, ele pega a resposta (
xhr.responseText
), que seria o conteúdo doflag.txt
, e manda para o servidor do atacante (10.13.74.92:8888
).Enviar o mensageiro:
xhr.send()
é o comando final que manda o mensageiro sair para buscar os dados.
Quando enviamos conseguimos o resultado da Flag.txt
Observe que ele esta em URL Encode
graças a função nativa do javascript encodeURIComponent
que inserimos no nosso código. Isso nos garante que qualquer caractere especial no conteúdo da flag(espaços ou sÃmbolos) seja transformado em algo que possa ser enviado na URL, ou seja, URL ENCODE.
Se decodarmos vamos ter o valor da flag correto, vamos usar o CyberChef para nos ajudar:
Vamos criar um script em javascript, para que ele possa fazer um GET em nesse endpoint e enviar o conteúdo para o nosso servidor web python, pela vulnerabilidade de XSS Blind que descobrimos.