- SQL Injection
SQL Injection (ou Injeção SQL) é o nome dado a uma falha no código de uma aplicação qualquer que possibilita, por meio de uma entrada qualquer, a manipulação de uma consulta SQL.
Exemplo prático – PHP + MySQL
PHP + HTML
Insira em seu arquivo .php o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php if($_SERVER['REQUEST_METHOD'] == 'POST') { mysql_connect('127.0.0.1', 'root', ''); mysql_select_db('injection'); $usuario = $_POST['usuario']; $senha = $_POST['senha']; $query = "select usuario, senha from usuario where usuario='$usuario' and senha='$senha'"; $result = mysql_query($query); $rows = mysql_fetch_array($result); if($rows) { echo "Logado com sucesso"; } else { echo "Não logou. Tente novamente."; } } ?> <!DOCTYPE html> <html> <head> <title>Demonstrando Injection - Canal TI</title> </head> <body> <form action="index.php" method="POST"> <h2>Demonstrando SQL Injection - Canal TI</h2><br> Usuário:<br> <input type="text" name="usuario"><br><br> Senha:<br> <input type="text" name="senha"><br><br> <input type="submit" value="Logar"> </form> </body> </html> |
Lembre-se de setar o IP do seu servidor web, usuário e senha na função mysql_connect, nessa ordem.
Lembre-se de setar o nome da base de dados na função mysql_select_db.
OBS: Lembrar que esse código é para fins didáticos. O recomendado atualmente é utilizar PDO para conexões com banco de dados no PHP.
MySQL
Inicialmente crie uma database nova para testes chamada injection.
Comando:
1 |
CREATE DATABASE injection |
Após isso utilize o comando USE para utilizar essa database:
1 |
USE injection |
Após isso, cole o seguinte script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-- -- Table structure for table `usuario` -- DROP TABLE IF EXISTS `usuario`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `usuario` ( `usuario` varchar(20) DEFAULT NULL, `senha` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `usuario` -- LOCK TABLES `usuario` WRITE; /*!40000 ALTER TABLE `usuario` DISABLE KEYS */; INSERT INTO `usuario` VALUES ('canal','ti'); /*!40000 ALTER TABLE `usuario` ENABLE KEYS */; UNLOCK TABLES; |
OBS: Lembrar que esse script é para fins didáticos. Utilizamos uma tabela sem chave primária e sem hash na senha, o que não é recomendado.
Pronto. Basta acessar a página e fazer o teste final.
Para conseguir ‘burlar’ a validação simulando assim um ataque SQL Injection, utilize no campo senha: ' or ''='
Após clicar em logar, é dado a mensagem: “Logado com sucesso”, validando o SQL Injection.