Vou mostrar na pratica como o sql injection funciona.
Eu criei uma pagina de login e criei também um banco de dados para nós fazermos o teste de sqlinjection.
Vamos ao que interessa.
Primeiramente, crie uma pagina em php com o nome de index.php, o sequinte código:
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<title>login</title>
</head>
<body>
<form id=”form1″ method=”post” action=”entraounao.php”>
<p>
<input type=”text” />
</p>
<p>
<input type=”text” />
</p>
<p>
<input name=”Submit” value=”Submit” />
</p>
</form>
</body>
</html>
E CRIE outra com o nome de entraounao.php, com o seguinte código:
<?php require_once(“Connections/local.php”); ?>
<?php
//pegando o usuario e a senha via post
$user = $_POST['usuario'];
$senha = $_POST['senha'];
//Selecionando o banco de dados para depois fazer a verificaçao da senha no banco
mysql_select_db($database_local, $local);
$sql = “select * from usuarios where usuario=’$user’ and senha=’$senha’”;
$rs = mysql_query($sql, $local) or die(mysql_error());
$dados = mysql_fetch_assoc($rs);
//fazendo verificaçao
if (mysql_num_rows($rs)==0){
echo “sua senha digitada está encorreta”;
}
else if (mysql_num_rows($rs)>0){
header(‘location:admin/index.php’);
}
else{
}
?>
Crie um banco de dados com o nome de P1, e cole importe o seguinte código:
# HeidiSQL Dump
#
# ——————————————————–
# Host: 127.0.0.1
# Database: p1
# Server version: 5.1.30-community-log
# Server OS: Win32
# Target-Compatibility: Standard ANSI SQL
# HeidiSQL version: 3.2 Revision: 1129
# ——————————————————–
/*!40100 SET CHARACTER SET latin1;*/
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=’ANSI’;*/
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;*/
#
# Database structure for database ‘p1′
#
CREATE DATABASE /*!32312 IF NOT EXISTS*/ “p1″ /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci */;
USE “p1″;
#
# Table structure for table ‘usuarios’
#
CREATE TABLE /*!32312 IF NOT EXISTS*/ “usuarios” (
“cod” int(20) NOT NULL AUTO_INCREMENT,
“nome” varchar(255) DEFAULT NULL,
“usuario” varchar(20) NOT NULL,
“senha” varchar(255) DEFAULT NULL,
“nivel” varchar(20) DEFAULT NULL,
“dt_cadastro” varchar(50) DEFAULT NULL,
“dt_alteracao” varchar(50) DEFAULT NULL,
PRIMARY KEY (“cod”),
UNIQUE KEY “usuario” (“usuario”)
) AUTO_INCREMENT=6 /*!40100 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci*/;
#
# Dumping data for table ‘usuarios’
#
LOCK TABLES “usuarios” WRITE;
/*!40000 ALTER TABLE “usuarios” DISABLE KEYS;*/
REPLACE INTO “usuarios” (“cod”, “nome”, “usuario”, “senha”, “nivel”, “dt_cadastro”, “dt_alteracao”) VALUES
(1,’ADMINISTRADOR’,'admin’,'123456′,’3-Administrador’,'Sexta, 27 de Março de 2009′,’Sexta, 27 de Março de 2009′);
REPLACE INTO “usuarios” (“cod”, “nome”, “usuario”, “senha”, “nivel”, “dt_cadastro”, “dt_alteracao”) VALUES
(4,’juan carlos’,'juan’,'123456′,’3-Administrador’,'Quinta, 16 de Abril de 2009′,’Segunda, 01 de Junho de 2009′);
REPLACE INTO “usuarios” (“cod”, “nome”, “usuario”, “senha”, “nivel”, “dt_cadastro”, “dt_alteracao”) VALUES
(5,’joao’,'joao’,'123456′,’2-Gerenciador’,'Segunda, 20 de Abril de 2009′,’Segunda, 20 de Abril de 2009′);
/*!40000 ALTER TABLE “usuarios” ENABLE KEYS;*/
UNLOCK TABLES;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE;*/
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;*/
Agora, basta testar o sqlinjection!
Este código é vulnerável a SQL injection!
Teste a pagina de login com o seguinte código:
Login: ‘or’1’=’1
Senha: ‘or’1’=’1
Teste outros códigos na sua pagina.
Vou ensinar agora algumas formas de si livrar do SQL injection:
Primeiro:
1 – A criptografia na senha e si possível no login, é muito importante pois evita alguns códigos de SQLinjection.
2 – Na hora que for fazer o login, faça uma validação para que a pessoa não possa deixar o campo senha em branco
3 – Faça a conversão para criptografia, na hora do login
4 – Mude o nome das suas tabelas, não deixe nomes conhecidos, exemplo: usuários,users…
Gerasist