[wp_ad_camp_3]
SQL Injection, é um furo muito comum em programas de computador. Essa falha atinge sistemas que façam interação com bases de dados, é uma falha que pode levar o cracker a acessar, manipular, modificar e até remover informações de seu banco de dados sem autorização. Para isso basta sua aplicação se comunicar com o banco de dados sem tratar a entrada de usuários. O SQL Injection, pode ser explorado desde aplicações desktop’s até aplicações web.
O Ataque!
[wp_ad_camp_1]
Um cracker pode fazer o uso de uma entrada de uma informação que interaja com alguma consulta SQL dentro da aplicação.
Exemplo: Um sistema de autenticação, até mesmo para um script para buscar um conteúdo.
Supondo que você seja uma pessoa que saiba sobre programação, observe o código abaixo escrito em PHP:
<?php $conn = mysql_connect('localhost','root','suasenha'); mysql_select_db('teste',$conn); $autenticar = mysql_query('SELECT COUNT(1) as qtd FROM usuario WHERE usuario="'.$_POST['usuario'].'" AND senha = "'.$_POST['pwd'].'"', $conn); $res = mysql_fetch_assoc($autenticar); if($res['qtd'] >= 1) { echo "ACESSOU, TUDO OK!!!"; } else { echo "Usuário ou senha incorretos."; }
Agora vamos fazer um teste, colocando no payload da requisição o valor admin para a chave ‘usuario’ e admin para a chave ‘pwd’. A query que iria para o MySQL executar seria a query abaixo:
SELECT COUNT(1) as qtd FROM usuario WHERE usuario="admin" AND senha = "admin"
Agora vamos modificar as informações enviadas pelo usuário, vamos supor que seu usuário seja um cracker e deseja obter acesso a sua aplicação para isso ele vai modificar o valor de usuario para admin” OR 1=1 — agora vamos fazer a mesma análise de como a query vai ser enviada ao banco de dados, segue abaixo:
SELECT COUNT(1) as qtd FROM usuario WHERE usuario="admin" OR 1=1 --" AND senha = ""
Caso você possua o usuário que o cracker colocou na injeção, ele vai ter o acesso sem necessitar de possuir a senha.
Esse tipo de ataque, abre leque para que o cracker explore falhas de XSS em telas de cadastro em seus painéis administrativos.
Mas falhas de injeção abrem um leque muito alto para o atacante, como por exemplo a exclusão de sua própria base de dados, imagine que no campo de usuário foi informado esse conteúdo “; DROP DATABASE DATABASE(); — a query final seria a seguinte:
SELECT COUNT(1) as qtd FROM usuario WHERE usuario=""; DROP DATABASE DATABASE(); --" AND senha = ""
E assim você acaba de perder TODO o seu banco de dados, tudo isso por não tratar uma simples entrada de informação.
Como se prevenir:
[wp_ad_camp_2]
Para se prevenir pasta você fazer o tratamento de qualquer informação antes de encaminha-lá ao banco de dados.
Vamos mudar a extensão do mysql_* para a extensão do PDO do php:
<?php $conn = new PDO('mysql:host=localhost;dbname=teste','root','suasenha'); $autenticar = $conn->prepare('SELECT COUNT(1) as qtd FROM usuario WHERE usuario=:usuario AND senha = :pwd'); $autenticar->bindParam(':usuario', $_GET['usuario']); $autenticar->bindParam(':pwd', $_GET['pwd']); $autenticar->execute(); $res = $autenticar->fetch(PDO::FETCH_ASSOC); if($res['qtd'] >= 1) { echo "ACESSOU, TUDO OK!!!"; } else { echo "Usuário ou senha incorretos."; }
Pronto! A partir de agora qualquer tipo de informação enviada pelo usuário vai ser tratada, vamos ver como ficaria a consulta enviada para o MySQL com o valor da chave usuario contendo admin” OR 1=1 —:
SELECT COUNT(1) as qtd FROM usuario WHERE usuario="admin\" OR 1=1 --" AND senha = ""
Obrigado!
Espero que com esse POST eu tenha contribuído para que vocês melhorem a segurança em suas aplicações.
Comments
Muito útil ao público, belo conteúdo!
Author
Obrigado Lucas, fico feliz que tenha gostado.