quarta-feira, 20 de junho de 2012

Tutorial SQL Injection em INSERT INTO

sql_inject

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:
Então, ao inserir uma aspa em um campo, notamos que nos veio um erro de SQL ou nós não fomos cadastrados. Isto provavelmente quer dizer que ele está vulnerável.
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]')
Um simples escapamento de aspas pode nos barrar. Teremos que contar com a falta disso.
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');--
Vamos inserindo um campo a mais gradativamente e observar quando não há erro retornado ou quando somos cadastrados corretamente. Sim, isso é mais demorado. Digamos que estejamos lidando com 1 coluna vulnerável.
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());--
Vamos no mesmo local onde vimos o algarismo “1″ e veremos a versão do MySQL. Supomos que tenha o information_schema (ou teríamos que ir chutando o nome das tabelas e colunas). A query secundária ficará entre parêntesis. Como já dito, deve ter apenas uma coluna e uma linha. Você pode unir várias colunas em uma, usando funções como concat(), concat_ws() e group_concat().
1
,' (select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1));--
Mas pode ocorrer que você não possua acesso direto aos dados das colunas vulneráveis. Neste caso, você pode tentar usar o INTO OUTFILE pra exportar os dados para um arquivo. É necessário ter privilégios para tal.
É 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
Isso é com você. Saia procurando por erros em todos os cantos do site. É melhor ainda encontrar diretórios de uploads (já que possuem permissões de escrita – CHMOD 777). Então, faça a sua query, adicionando “INTO OUTFILE [arquivo]” no final. Veja:
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);--
(Quero aqui frizar o espaço ao final do ‘–’. É necessário). A partir daí, você simplesmente “acessa” o arquivo gerado para obter os dados.
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)
Alternativamente, você também pode atacar às cegas baseado no tempo de resposta (timing-based blind sql injection).
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.
← Postagem mais recente Postagem mais antiga → Página inicial

0 comentários:

Postar um comentário

Copyright © Hacking & Security | Powered by Xandao Design by Xandao86 | Xandao86