Você não é registrado, por favor registre-se para ter acesso ao conteúdo completo.
Caso seja registrado, efetue login.
Esqueceu sua senha? Clique aqui
Recomendamos o uso do Mozilla Firefox para uma melhor visualização.    


Início Postados Hoje Marcar Fóruns Como Lidos Álbums Banidos SE Team Medalhas
Voltar   Secret Experience > Área L2J > [L2J] Tutoriais
Registrar Loteria VIPStaff SERegras do fórum Membros Arcade Pesquisar Postados Hoje Marcar Fóruns Como Lidos Experience
   

Secret Experience.NET   Secret Experience Corporation - Welcome To The Real World
     Anúncios SE

Resposta
 
LinkBack Ferramentas do Tópico Modos de Exibição
Antigo 23-02-2009, 09:46 PM   #1
[GUIA] ~ Inject SQL ~ Aprenda a se proteger
fetish fetish está offline 23-02-2009, 09:46 PM

GUIA ~ INJECT SQL ~
Realizando e Protegendo teu servidor

nível: intermediário

Índice~
0- Código de ética.
1- O que é?
2- Localizando sites com proteção falha.
3- Protegendo-se
4- Créditos


------------
0- Código de ética.
O Inject SQL é um erro sério.
Ao ler o guia você concorda em não utilizar para destruir sites e nem invadir servidores.
Esse guia tem como objetivo explicar o que é e como funciona o Inject SQL.
Não, você não é nenhum h4x0r por saber isso pois até uma criança de 8 anos consegue dar inject SQL.


------------
1- O que é?
Inject SQL é um erro detectado recentemente que permite você logar como administrador e fazer outras coisas fodásticas!
Como a divulgação do erro foi propagada muito rápida poucos sites hoje em dia estão desprotegidos...


2- Localizando sites com proteção falha.
Simplesmente vá no google e digite:
Citação:
/admin/index.asp
/admin/login.asp
/adm/index.asp
/adm/login.asp
/admin/index.php
/admin/login.php
/adm/login.php
/adm/index.php
Procure por páginas que haja login de administrador.
Agora para ver se a proteção não está boa, digite os seguintes login e senha:


Citação:
Login: '
Senha: '='
Esse simples código não irá injetar porém é capaz de confundir MySql e irá retornar um erro do prórpio MySql.
Se não der nenhum erro de MySql então eles estão protegidos...


Se der erro então esse site é vuneravél.
Para injetar ponha ' no login e na senha tente um desses códigos:
Citação:
' or '1'='1'
' or 'a'='a'
'or''='or'1'='1
Se entrou parabéns você conseguiu!

3- Protegendo-se

Abaixo colocarei alguns scripts com a proteção anti-SQL Inject, para serem inseridos no teu website.


Criar conta

Citação:
<?php
//set host, username and password for MySQL
$dbhost = "localhost";
$dbuser = "YOURMYSQLUSERNAME";
$dbpass = "YOURMYSQLPASSEORD";

//connect to MySQL or return an error
$conn = mysql_connect("$dbhost", "$dbuser", "$dbpass")
or die('Could not connect: ' . mysql_error());

//set database name
$dbname = "l2jdb";

//select database or return an error
$dbselect = mysql_select_db("$dbname")
or die ('Could not select database');

//get username and password info from the form, protecting against SQL injection
$pass = mysql_real_escape_string($_POST["pass"]);
$confirm = mysql_real_escape_string($_POST["confirm"]);
$user = mysql_real_escape_string($_POST["name"]);

//validate user input
if(!preg_match('/^[a-zA-Z0-9]{5,20}$/',$user)) {
die ('Error: Usernames can only contain alphanumeric characters and must be between 5 and 20 characters in length.');
}

if(!preg_match('/^[a-zA-Z0-9]{5,20}$/',$pass)) {
die ('Error: Passwords can only contain alphanumeric characters and must be between 5 and 20 characters in length.');
}

if($pass != $confirm) {
die ('Error: Passwords do not match.');
}

//make sure user doesn't already exist and if it doesn't, add new record to the database
$result = mysql_query("SELECT login FROM accounts WHERE login='$user'");

if(mysql_num_rows($result)>0) {
die ('Error: Username already exists.');
}else{
mysql_query("INSERT INTO accounts (login, password, access_level) VALUES ('".$_POST['name']."', '".base64_encode(pack('H*', sha1($_POST['pass'])))."', 0)")
or die ('Error: ' . mysql_error());
}

//report successful registration
echo "Account created successfully.";

//close MySQL connection
mysql_close();

?>
salve o código como acc.php, e em seguida salve o seguinte código html para adicionar o formulario de registro em uma página html.

Citação:
<form action="acc.php" method=post>
Login: <input type="text" name="name" size=20><br><br>
Senha: <input type="password" name="pass" size=20><br><br>
Confirmar senha: <input type="password" name="confirm" size=20><br><br>
<input type=submit name="submit" value="Create"></form>

O script foi construído na proteção contra o SQL Injection, e também força o usuário a apresentar um nome de usuário e senha que estão entre os 5 e os 20 caracteres de comprimento, e limita-los a apenas caracteres alfanuméricos.

Scripts de Redefinição de senha são ainda mais sujeitos a SQL Inject , então aqui está um script para redefinição de senha:

Alterar senha
Citação:
<?php

//set host, username and password for MySQL
$dbhost = "localhost";
$dbuser = "YOURMYSQLUSERNAME";
$dbpass = "YOURMYSQLPASSEORD";

//connect to MySQL or return an error
$conn = mysql_connect("$dbhost", "$dbuser", "$dbpass")
or die('Could not connect: ' . mysql_error());

//set database name
$dbname = "l2jdb";

//select database or return an error
$dbselect = mysql_select_db("$dbname")
or die ('Could not select database');

//get username and password info from the form, protecting against SQL injection
$user = mysql_real_escape_string($_POST["name"]);
$currentpass = mysql_real_escape_string($_POST["currentpass"]);
$newpass = mysql_real_escape_string($_POST["newpass"]);
$confirm = mysql_real_escape_string($_POST["confirm"]);

//username and password should already be valid and newpass and confirm should match or this script will die
//so just validate the newpass and then check to see if newpass and confirm are the same
if(!preg_match('/^[a-zA-Z0-9]{5,20}$/',$newpass)) {
die ('Error: Passwords can only contain alphanumeric characters and must be between 5 and 20 characters in length.');
}

if($newpass != $confirm) {
die ('Error: New passwords do not match.');
}

//encrypt the passwords
$currentpass = base64_encode(pack('H*', sha1($currentpass)));
$newpass = base64_encode(pack('H*', sha1($newpass)));

//if the user input passed all the checks, make sure the account exists and then update the password
$result = mysql_query("SELECT login,password FROM accounts WHERE login='$user' AND password='$currentpass'");

if(mysql_num_rows($result)>0) {
mysql_query("UPDATE accounts SET password='$newpass' WHERE login='$user' AND password='$currentpass'");
echo "Password succesfully updated.";
}else{
die ('Error: Account does not exist or password is incorrect.');
}

//close MySQL connection
mysql_close();

?>
salve o código como changepass.php, e em seguida salve o seguinte código html para adicionar o formulario de registro em uma página html.

Citação:
<form action="changepass.php" method=post>
Login:<input type="text" name="name" size=20><br><br>
Senha: <input type="password" name="currentpass" size=20><br><br>
Nova senha: <input type="password" name="newpass" size=20><br><br>
Confirmar senha:<input type="password" name="confirm" size=20><br><br>
<input type=submit name="submit" value="Update Password">
Um simples comando chamado addslashes()
Veja esse exemplo de código:


Citação:
<?php
$user = $_POST['user'];
$pass = $_POST['pass'];
mysql_query("SELECT * FROM users WHERE user='$user' AND pass='$senha'")
?>
Ele está desprotegido e eu posso simplesmente burlar esse login...
Mas se por acaso adicionarmos umas linha:


Citação:
<?php
$user = $_POST['user'];
$pass = $_POST['pass'];
$user_escape = addslashes($user);
$pass_escape = addslashes($pass);
mysql_query("SELECT * FROM users WHERE user='$user_escape' AND pass='$senha'_escape")
?>
O que acontece no código?
O comando addslashes irá adicionar uma barra invertida "\" antes de todo ' ou "
No caso, isso irá fazer com que o interpretador ignore isso criando um erro no login.

4- Créditos

Near
e _Dudu_1533 por suas dicas.


o Changelog:
Citação:
24/02/2009
* Adicionado ao tutorial, mais algumas dicas.
__________________
<?php $som1 = 10; $som2 = 10; echo: "O resultado da soma referente as variáveis dá: $som1 + $som2"; ?> Qual o nome do filme? ;)

 
Avatar de fetish
fetish
Everybory lies

Quadro de Medalhas

Registrado em: Dec 2008
Posts: 476
Pontos: 2,001, Nível: 27
Pontos: 2,001, Nível: 27 Pontos: 2,001, Nível: 27 Pontos: 2,001, Nível: 27
Atividade: 0%
Atividade: 0% Atividade: 0% Atividade: 0%

Nome Real: João.
Visitas: 1772
Os Seguintes 4 Usuários disseram Obrigado(a) para fetish por gostarem deste post :
Handy (21-06-2009), macabriNn (24-02-2009), SerialKiller (23-02-2009), xxxvalterxxx (23-02-2009)
Links Patrocinados
Antigo 23-02-2009, 10:35 PM   #2 (permalink)
Amigo SE
 
Avatar de _Dudu_1533
 
Registrado em: Oct 2008
Posts: 170
Agradeceu: 32
Agradecido 1,411 Vezes em 95 Posts
Achei Ruim:
Acharam ruim Vezes em Posts

Inventório de _Dudu_1533

Padrão

Bom, já que estamos falando de MySQL + PHP, vou dar meu parecer.
Hoje em dia, SQL Injection é uma questão bem discutida, mas é o tipo de assunto que o pessoal não passa soluções. É difícil você ir em algum site de Webmaster e encontrar uma solução cabível para tal problema.

Temos várias formas de proteger contra SQL Injection.

Lista de alguns:

Com esses 3 métodos básicos, que ao meu ver, todo site deve ter, você consegue proteger-se, com qualquer tipo de sistema que utilizar.

Vale lembrar, que para uso de expressões regulares, é necessário uma leitura minuciosa sobre cada propriedade. Mas a recompensa é gratificante, pois é um ótimo recurso, e proporciona muita coisa.

Mas devemos lembrar que SQL Injection não usa-se somente em formulários.
Temos que nos previnir quando usamos métodos $_GET, $_COOKIE, ou todos os tipos onde o usuário tem o poder de editar a informação.


Outro fator importante, é trabalhar com cada informação ligada às consultas.
Como nosso amigo disse, o caractere ' (aspas simples) é muito perigoso.
Por quê?
Pois é um caractere que o SQL (Todos os tipos de banco que utilizam a linguagem SQL) utiliza para caracterizar um dado como string.

Exemplo:

Código: [Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
$string = "O Dudu é 'Bonito";
$sql = mysql_query("SELECT * FROM usuario WHERE descricao = '".$string."'") or die(mysql_error());
O Código acima retornará erro, pois possui uma aspa jogada na string ' (aspas simples), onde, ela será a limitadora, e sobrará uma, gerando erro. Como sabemos, tudo que abre, fecha. ^^

Qual a solução?
Simples, "escapar" estas aspas.

Como?
É só adicionar barra invertida \ antes de aspas simples.
A função nativa do php, addslashes(), adiciona automaticamente essa barra antes de todas as aspas simples de uma string, com isso, a aspa será considerado como um caractere, e não um limitador do SQL.

Bom, a dica está aí.
Boa leitura à todos.



Uma dica ao autor do tutorial, é que ele passe estes conceitos.
Você passou muito exemplo prático, tente colocar mais conceitos, pois existem muitos leigos no assunto.

Se quiser aproveitar este meu post, fique à vontade.

Qualquer dúvida, é só perguntar.
Até mais ^^

_Dudu_1533 está offline   Responder com Citação
Os Seguintes 3 Usuários disseram Obrigado(a) para _Dudu_1533 por gostarem deste post :
fetish (25-02-2009), John-X (24-02-2009), macabriNn (24-02-2009)
Resposta

Ferramentas do Tópico
Modos de Exibição

Regras para Posts
Você não pode postar novos tópicos
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar seus posts

Código [IMG] Sim
Código HTML Não
Trackbacks are Sim
Pingbacks are Sim
Refbacks are Sim


Tópicos Similares
Tópico Tópico Iniciado Por Fórum Respostas Última Mensagem
[Tutorial]Criando um servidor de Knight Online John-X Knight Online 9 16-02-2013 09:43 PM
[Tutorial] Mu Server com SQL 2005 MaNoFmZ [MU] Database 2 02-01-2010 01:42 PM
Site ^^ Setokaiba [L2J] Tutoriais 10 05-06-2009 11:14 PM
CacheD ERRO filipephp [L2OFF] Dúvidas Solucionadas 1 29-03-2009 07:52 PM
[Interlude] previnir dos kras nao usar SQL Inject felipefranz [L2J] Pedidos 2 13-03-2009 01:51 PM


Horários baseados na GMT -3. Agora são 03:27 AM.
 



Search Engine Optimization by vBSEO 3.3.0