Tutorial SQL Injection em INSERT INTO
Autor: G@BRIEL | Publicado: 2012-11-11T11:56:00-08:00


Tutorial SQL Injection em INSERT INTO

 

            
                         
                    
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    
                    
                        
                                                
                        Olá a todos (e à quanto tempo não nos vemos, não é?).
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.