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.
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.
Após isso, depois de uma investigação no endpoint comum robots.txt
, temos obtemos a seguinte resposta:
Visitando esse path, temos:
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.