Injeção de SQL
Ao desenvolvermos uma página web com acesso ao banco de dados (BD) utilizamos queries SQL que fazem consultas a BD através de SGBDs como MySQL, Postgree etc. Estas consultas muitas das vezes não são confiáveis, podem ser manipuladas e passar por controles de acesso, podendo até ter acesso ao shell do servidor.
Ataques
A técnica que é utilizada com queries SQL é chamada de Injeção SQL, cujo ataque contiste em criar ou alterar comandos SQL introduzidos na página desenvolvida para apresentar dados guardados no banco de dados.
Pode também alterar dados importantes ou ainda executar comandos de sistema perigosos no servidor. Isso é realizado nas caixas de textos colocados na página que espera a entrada de um utilizador para realizar queries no BD. Lá são introduzidas queries adicionais com intensão de atacar as informações do BD.
Para melhor entender o que é injeção SQL, o exemplo seguinte permite ver isso: imaginemos que para validar o acesso ao sistema foi desenvolvido o seguinte script:
As variáveis $utilizador e $password recebem o conteúdo enviado do formulário através do método POST, é aí que se encontra o perigo. Suponha que a seguinte entrada foi enviada no formulário:
$sql="SELECT * FROM utilizador WHERE username='' AND password='' or 1='1' ";
Se não for realizada qualquer validação sobre os textos enviados nos formulários para verificar tal situação, qualquer utilizador mal intencionado pode obter acesso ao sistema. Esse é um exemplo muito simples de ataque.
Existem ataques mais complexos, deve haver uma verificação mais consistente dos dados enviados no formulário para o acesso e consultas ao BD.
Pode também alterar dados importantes ou ainda executar comandos de sistema perigosos no servidor. Isso é realizado nas caixas de textos colocados na página que espera a entrada de um utilizador para realizar queries no BD. Lá são introduzidas queries adicionais com intensão de atacar as informações do BD.
Para melhor entender o que é injeção SQL, o exemplo seguinte permite ver isso: imaginemos que para validar o acesso ao sistema foi desenvolvido o seguinte script:
<?php
$utilizador = $_POST['util'];
$password = $_POST['pw'];
$sql = "SELECT * FROM utilizador WHERE username='$utilizador' AND password='$password'";
?>
$utilizador = $_POST['util'];
$password = $_POST['pw'];
$sql = "SELECT * FROM utilizador WHERE username='$utilizador' AND password='$password'";
?>
As variáveis $utilizador e $password recebem o conteúdo enviado do formulário através do método POST, é aí que se encontra o perigo. Suponha que a seguinte entrada foi enviada no formulário:
- util - pode ser enviado campo vazio; é recebido pela variável $utilizador;
- pw - pode ser enviado o texto ' or 1='1; é recebido pela variável $password.
$sql="SELECT * FROM utilizador WHERE username='' AND password='' or 1='1' ";
Se não for realizada qualquer validação sobre os textos enviados nos formulários para verificar tal situação, qualquer utilizador mal intencionado pode obter acesso ao sistema. Esse é um exemplo muito simples de ataque.
Existem ataques mais complexos, deve haver uma verificação mais consistente dos dados enviados no formulário para o acesso e consultas ao BD.
Se não tiver acesso ao php.ini, pode também usar a função
error_reporting(null) pra nao exibir as mensagens de erro!
outra dica é hashar a senha antes de enviar o sql tipo
com md5(), sha1(), ou mesmo o crypt();
flw!!