Great Lakes Security Conference CTF — Hackeando Apps NodeJS — Parte 3
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:
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/flagGLSC{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
- Parte 1 da série: https://neptunian.medium.com/great-lakes-security-conference-ctf-hackeando-apps-nodejs-parte-1-6e0f90a6b9a3
- Perfil do CTF — no CTF Time: https://ctftime.org/event/1051
- Meu perfil no CTF Time: https://ctftime.org/team/122851
- Link Direto do Evento: https://glsc.tech/
- Prototype Poisoning/Pollution: https://medium.com/intrinsic/javascript-prototype-poisoning-vulnerabilities-in-the-wild-7bc15347c96
- Twitter: @NeptunianHacks