Segurança: SQL Injection, Os dados de sua empresa estão protegidos?

[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 &nbsp;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-&gt;prepare('SELECT COUNT(1) as qtd FROM usuario WHERE &nbsp;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

    1. Post
      Author

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *