30 segundos para amar a Lain, todos precisamos de 30 segundos para amar a LAIN !!!
BOITA{C0d3_r3V1eW_e_SSt1_4_tH3_w1n}

Nesse desafio, somos primeiro apresentados a uma interface com referências ao anime LAIN.

center

Ao observar as referências aos endpoints presentes na página, temos:

  • /login
  • /dashboard
  • /api/users

Ao visitar a página que mais nos convém (/api/users), podemos perceber que existem usuários vazados, juntamente com seus IDs.

center

Após isso, depois de uma investigação no endpoint comum robots.txt, temos obtemos a seguinte resposta:

center

Visitando esse path, temos:

center

Como o código fonte da página de login está exposto, podemos observar falhas de lógica no processo de autenticação no setor de login por código. No segmento:

if (request.form.get("password", type=int) == (user.code == request.form.get("password", type=int)))

É possível perceber que o código de login é convertido em int, e depois comparado com uma segunda comparação entre o código do usuário com o código fornecido, convertido em int.

Executando o código passo a passo, podemos perceber que, devido ao fato de converter a entrada de usuário para um valor do tipo inteiro, ao final da execução, teremos um:

if (int("0") == (user.code == int("0")))
if (0 == (user.code == 0))
if (0 == 0)
if (True)

Ou seja, temos um bypass na aba de login de usuário. Agora que estamos logado, podemos utilizar os outros endpoints mostrados no /.debug para alterar o nome do usuário e conseguir um (CWE-1336) Server-Side Template Injection (SSTI). Assim, colocando o payload:

{{config.__class__.from_envvar.__globals__.__builtins__.__import__('os').popen(request.args.cmd).read()}}

Podemos obter a flag passando o parâmetro cmd como cat flag.txt no dashboard do usuário logado.

center