Lojinha da HawkSec
A HawkSec resolveu entrar no ramo do varejo e abriu a Lojinha da HawkSec, cheia de swags exclusivos pra quem curte um estilo hacker. De brinde, jogamos a flag desse desafio no catálogo. Mas não se engane: não é só clicar e comprar. A loja tem seus truques, e só os mais espertos vão conseguir colocar a flag no carrinho. Seu dinheiro chega lá? Ou vai precisar de algo a mais pra levar esse item pra casa?
Autor: @jackskelt
O desafio foi inspirado no Shopping Time do TUCTF24. Temos writeup aqui
Ao acessar o site, vemos que é uma loja online da HawkSec, onde podemos buscar por produtos.

Entretanto, temos o produto "Flag do Desafio", que ao ser acessado, recebemos o erro de Termo Proibido. O site acessa a rota /review?item=Flag do Desafio.


Analisando o código provido no desafio, temos o arquivo server.js:
Analisando o código, achamos algumas informações importantes:
A variável
BLOCKLISTcontém os itens que não podem ser acessados. No caso, o item "Flag do Desafio" está nessa lista.
Caso o item esteja na
BLOCKLIST, a rota retorna o erroTermo Proibido.
A rota
/reviewé responsável por mostrar os detalhes do produto. Ela utiliza omd5do nome do item como id para buscar no banco de dados. Omd5é cortado para os 6 primeiros caracteres, e esse valor é utilizado para buscar o item no banco de dados.Caso o item seja encontrado, a rota retorna os detalhes do produto, como nome, preço, descrição e imagem.
O md5 é uma função de hash, que transforma uma string em um valor fixo de 32 caracteres. Porém o servidor só utiliza os 6 primeiros caracteres do hash. Isso significa que existem várias strings diferentes que podem gerar o mesmo hash. Esse tipo de ataque é conhecido como collision attack.
Então por mais que o item "Flag do Desafio" esteja na BLOCKLIST, podemos ter uma string que gere os mesmos 6 primeiros caracteres do hash. Para isso, podemos utilizar o código:
Rodando o código, encontramos a colisão:
Com isso, conseguimos acessar a rota /review?item=hawk90435475, e conseguimos ver os detalhes do produto, onde a flag está localizada.
hawk{th4l3s_j0g0u_0_sh0rt_f0r4}

Atualizado