Great Lakes Security Conference CTF — Hackeando Apps NodeJS — Parte 3

Neptunian
2 min readApr 19, 2021

--

Desafio: Javascript Puzzle

Esta é a parte 3 da Série Great Lakes Security Conference CTF — Hackeando Apps NodeJS.

Este desafio também começa com um código Javascript disponibilizado na tela:

Código-fonte do Javascript Puzzle

Resumo do Código

  • Ele responde na URL /flag
  • Verifica se o input (postedObject) é um objeto javascript, com mais de uma chave
  • Cria um dicionário javascript vazio (localObject)
  • Faz um loop em todas as chaves do postedObject (input) e inclui como um item de dicionário no localObject (criado no servidor).

Esse desafio é similar ao anterior, no sentido de que obter a flag depende de fechar uma condição específica, que não parece possível à primeira vista:

  • O postedObject não pode ter uma chave secret (== undefined)
  • O localObject precisa ter a chave secret com o valor ‘flag’.

O problema aqui é que o localObject é criado vazio e preenchido com as chaves do postedObject. Como a chave ‘secret’ pode ser diferente nos dois, se o input em uma impacta na outra?

Exemplo abaixo — o objeto gerado é “sempre” igual:

postedObject = {"result":true, "count":3, "secret": "flag"}
localObject gerado = {"result":true, "count":3, "secret": "flag"}

A cada chave enviada acima no postedObject (exemplo: result) é gerada a mesma chave no localObject no momento do loop.

Vulnerabilidade

Aqui é possível utilizar uma vulnerabilidade chamada Prototype Poisoning, onde é possível “envenenar” um objeto Javascript no servidor com valores enviados pelo cliente. Este tipo de falha também é chamada de Prototype Pollution.

Neste caso, o cliente já controla os valores do objeto gerado (localObject), mas é possível enviar uma chave __proto__. Os itens dentro de proto viram chaves no objeto gerado, mas não no enviado. Cheque-mate!

Payload final:

'{"__proto__": {"secret": "flag"}}'

Usei o código abaixo para testar a solução:

Com isso, o POST abaixo traz a Flag:

curl -X POST --header "Content-Type: application/json" \
--data '{"__proto__": {"secret": "flag"}}' \
https://host/flag
GLSC{pr0707yp3_p011u710n_f0r_7h3_w1n}

Flawless Victory!

Parte 4

O próximo desafio da série é o Kevin, que explora também uma terceira aplicação NodeJS que utiliza o framework Express.js.

Referências

--

--