Umas das vulnerabilidades mais comuns são as injeções SQL, que existem há muito tempo. Atualmente, continuam sendo utilizadas amplamente pelos cibercriminosos.
O ataque aproveita erros na programação de um site, que permitem que sejam realizadas consultas às bases de dados para extrair informações confidenciais como usuários, nomes, emails e hash das senhas dos usuários, através de alguma interação com uma página. A finalidade destes ataques é comprometer servidores para utilizá-los com outras finalidades.
Quais tipos de ataques existem?
Apesar de existir uma grande variedade de ataques e regularmente aparecerem novos, um dos mais comuns e clássico é o que tenta validar uma condição de consulta como verdadeira. Isso é possível de forma bastante simples:
[‘OR ‘1’=’1]
Desta maneira, se a seção do código onde a consulta é realizada não se encontra desenvolvida com as medidas de segurança adequadas, esta consulta será uma condição verdadeira e a pergunta original lançará todos os resultados. Supondo que existe uma consulta como a seguinte:
SELECT * FROM usuarios WHERE usuario=’$usuario’ AND password=’$password’;
Na consulta anterior, os parâmetros injetáveis são ‘$usuario’ e ‘$password’. Caso seja aplicada a injeção antes especificada sobre ambos parâmetros, a consulta original se transformará na seguinte:
SELECT * FROM usuarios WHERE usuario=’ OR ‘1’=’1‘ AND password=’ OR ‘1’=’1‘;
De qualquer forma, a consulta lançará todos os resultados e consequentemente o cibercriminoso conhecerá toda a informação hospedada nessa tabela. Isso se deve a que “1=1” é sempre verdadeiro. Tal como destacamos anteriormente, esta é uma das injeções mais clássicas e é facilmente solucionável.
Como podemos solucionar este tipo de injeção?
Para isso, basta escanear os parâmetros para que não seja possível injetar parâmetros especiais como, por exemplo, as vírgulas. Caso esteja trabalhando com uma base de dados sob o MySQL, uma ferramenta muito utilizada, é possível escanear os parâmetros tal como é indicado a seguir:
SELECT * FROM usuarios WHERE usuario= mysql_real_escape_string(‘$usuario’) and mysql_real_escape_string(password=’$password’);
Existem outros tipos de injeções?
Existem diversos tipos de injeções sendo algumas mais complexas que outras. Entre as mais comuns, é possível mencionar a Blind SQL Injection. Este método é muito mais fácil de prever na hora do desenvolvimento do sistema. De qualquer forma, também torna bem mais difícil a exploração por um cibercriminoso utilizando Blind SQL Injection.
O que é o Blind SQL Injection?
Blind SQL Injection é utilizado quando não existe mensagens de erro contra uma possível injeção ou caso os mesmos tenham sido alterados pelo desenvolvedor. Além disso, muito menos é possível a visualização dos dados das consultas na página web. Desta forma, o atacante tenta injetar consultas que lancem um valor verdadeiro e assim poder entender qual tipo de informação é lançada pela consulta. Portanto, quando a consulta é correta, será visualizado um mesmo conteúdo e não a mensagem de erro personalizada.
Para estes tipos de injeções também costumam utilizar, com o objetivo de comprovar se é explorável, a consulta básica que foi explicada anteriormente.
É importante explicar que existem diversas técnicas para se proteger contra estes tipos de injeções. Algumas delas são mais complexas que outras. No entanto, em primeira instância, é importante realizar os controles necessários sobre os parâmetros que sejam utilizados como dados de entrada. Sempre temos que pensar quais podem ser os pontos de acesso para um cibercriminoso e, dessa forma, poder antecipar as possíveis injeções.
É importante que os desenvolvedores tenham em conta estes tipos de problemas de segurança. O que ocorre é que muitos aplicativos existentes possuem erros de validação. Por isso, é importante realizar revisões de código assim como o testing sobre as mesmas. Portanto, sempre indicamos que a segurança deve ser gerenciada para evitar estes tipos de ataques.
Em breve, continuaremos falando sobre esta temática e ofereceremos mais exemplos de como estar protegido contra diferentes ataques de injeção SQL.