Escolar Documentos
Profissional Documentos
Cultura Documentos
Por: Juancarloscunha
juancarloscunha.wordpress.com
Índice
Criando uma query Pag: 3
Principio do sqlinjection Pag: 5
Criando um sistema de login E senha para testes Pag: 6
Burlar uma query Pag: 9
Burlar um sistema de login e senha Pag: 11
Usando parâmetro UNION Pag: 16
Inserindo dados no banco de dados sem permissão Pag: 17
Alterando dados do banco de dados sem permissão Pag: 19
Excluindo dados do banco de dados sem permissão Pag: 21
Excluindo tabelas do banco de dados sem permissão Pag: 22
Excluindo database sem permissão Pag: 23
Descobrir nome das colunas do banco de dados Pag: 24
Descobrir nomes de tabelas do banco de dados Pag: 26
Protegendo dados do banco pag: 29
Emunizando site, sistema... do sqlinjection pag: 29
Proteção na query pag: 31
conclusão 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
Exemplo1:
$query_rr = ”select id, nome, descrição, valor, data, tipo from 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
O principio do sql injection, é você saber o máximo 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 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 aprender a si proteger contra estas pecas raras que saem invadindo todos 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 você saber só um pouquinho sobre html e 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.
Vamos criar primeiramente um formulário de envio, e colocar a ação dele(action) para, valida.php.
<body>
<form id="form1" name="form1" method="post" action="valida.php">
</form>
</body>
</html>
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, 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.
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 código:
<body>
Bem vindo ao sistema.
</body>
<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.
Código da pagina, local.php
<?php
$local_host ="localhost";
$local_database ="teste";
$local_passe ="";
$local_user ="root";
$local =mysql_pconnect($local_host,$local_user,$local_passe) or trigger_error(mysql_error(),
E_USER_ERROR);
?>
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
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 e do banco de dados.
Exemplo:
GET => via URL, --à noticias.php?id=1
POST => via formulário, --à noticias.php
Suponha que você está tentando explorar um site que manda os dados via GET.
noticias.php?id=1
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:
Então, para você realizar um ataque sql injection você tem que pensar o seguinte. Qual o código que eu
posso colocar nesta query para que esse select tenha uma união com outras tabelas do banco de dados. Eu já
pensei em um código.
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)
‘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!=’’
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 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:
Código:
“select id,usuário,senha from usuarios where usuário=’$usuario’ and senha=’$senha’”;
Admin --
Explicação:
Para quem não lembra os dois traços(--), em linguagem de banco de dados, significa que que está na frente
são comentário. Então na verdade, o que iria valer na query seria.
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.
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.
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.
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 (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.
Então, já que o SQL aguarda ansiosamente por outra aspa simples para fechar aquela primeira, porque nós
não damos a ele, e aproveitando, injetamos um comando nele.
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 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 igual ao que foi informando no 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: ‘or’1’=’1
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 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.
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 nos verificamos 7 colunas e não deu erro, então 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.
Não vou entrar em muitos detalhes de sql injection, pois meu propósito não é 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, 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.
Não sei si você já sabe, mais eu quero explicar para que serve o ponto e virgula(;) , no mysql.
; - Serve para você terminar uma execução do banco de dados, e começar 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');
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.
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ê já leu, vai perceber que para editar dados do banco de dados; não será tão difícil quanto
pareceu quando você estava 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, já está sendo executada alguma coisa ai, porque tem ate alguns dados listados ai.
Obs: Para aqueles que não gostam de estudar. Uma noticia mal: Não dá para copiar este 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 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.
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 no lugar dos espacos o “+’ mais, ou %20 para que não 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 parâmetros diferentes.
Drop = delete
Table = especificando tabela
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)
Mais depois que você saber o nome do banco de dados, você só precisa saber os parâmetro.
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:
‘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á.
_INFORMATION_SCHEMA.COLUMNS > nome da coluna em que o parâmetro WHERE especificará.
_Where column_name!=’kkkkk > em que o nome da tabela seja diferente de ‘kkkkk’
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 a praticar ataques sqlinjection acha 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.
TABLE_NAME - este parametro é para especificar um nome de alguma tabela que ainda será chamada.
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.
____________________________________)________________________________
http://www.vitima.com.br/index.php ?cod=’1’
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’
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 fácil para quem sabe. Mais mesmo assim,
existem muitos grandes genius porai que ainda assim conseguem executar um sqlinjectio contra e sistema...
Então 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 fáceis de si
proteger.
Quando você está lidando com códigos numéricos via GET ou POST. A maneira mais fácil e melhor de si
proteger, é quando você for pegar as variáveis via GET ou POST, fazer validação si 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ê 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.
Faça uma pagina de erro parecida com essa, para aqueles que estiverem tentando invadir sua pagina, ficar
com medo.
if(!is_numeric($_POST['codigo'])){
header("location:paginaerror.php")
}
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 mudado’,’mudado’, $oque foi mudado);
Este parâmetro acima, é para retirar 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 =str_replace("+","",$variavelrecebe);
$variavelrecebe =str_replace("%","",$variavelrecebe);
$variavelrecebe =str_replace(" ","",$variavelrecebe);
$variavelrecebe =str_replace("-","",$variavelrecebe);
$variavelrecebe =str_replace("select","",$variavelrecebe);
$variavelrecebe =str_replace("update","",$variavelrecebe);
$variavelrecebe =str_replace("drop","",$variavelrecebe);
$variavelrecebe =str_replace("delete","",$variavelrecebe);
$variavelrecebe =str_replace("database","",$variavelrecebe);
$variavelrecebe =str_replace("table","",$variavelrecebe);
Nesta validação acima nós retiramos alguns caracteres especiais e alguns parâmetros que geralmente são
utilizados no sqlinjection..
Retiramos: aspa simples(‘), mais(+),porcentagem(%),espaç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(juancarloscunha606@hotmail.com)
Proteção na query
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 em uma variável, e colocar uma 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”,””, $utilizador);
Para você bloquiar todos os ataques, faca varias trocas com a função str_replace.
$utilizador = $_POST[‘utilizador’];
$utilizador =str_replace(“select”,””, $utilizador);
$utilizador =str_replace(“union”,””, $utilizador);
$utilizador =str_replace(“update”,””, $utilizador);
$utilizador =str_replace(“insert”,””, $utilizador);
$utilizador =str_replace(“;”,””, $utilizador);
$utilizador =str_replace(“’”,””, $utilizador);
$utilizador =str_replace(“from”,””, $utilizador);
$utilizador =str_replace(“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: error.php");
}
juancarloscunha.wordpress.com
Segurança em rede
Protegendo-se contra sqlinjection
Por: Juancarloscunha
juancarloscunha.wordpress.com