O que é um Ataque SQL Injection / Injeção de SQL

Introdução

Recentemente, foi feito um anúncio sobre o gestor de conteúdos (CMS) Drupal, em relação ao risco de segurança que os sites correm ao usarem esta plataforma. Esta falha de segurança surge sob a forma de ataque injecção SQL, contra a camada de abstração da base de dados (DAL), que consistiu na permissão da entrada de utilizadores anónimos, com o fim de aumentar os seus privilégios e percorrer a base de dados acedendo aos scripts. O propósito deste artigo consiste em analisar a causa da violação de segurança e como pode ser prevenida no futuro.

O que é a Injeção de SQL?

SQL é a linguagem de programação utilizada para comunicar com a base de dados. Os gestores de conteúdos usam a base de dados para armazenar os conteúdos dos websites assim como a informação acerca dos utilizadores registados. A falha de segurança ocorre quando um utilizador malicioso entra no SQL, acedendo aos dados da aplicação web. Este método alternativo pode ser usado para recuperar, inserir, mudar ou apagar as tabelas da base de dados do sistema. A injeção de SQL só pode ser usada para explorar uma pré-existente falha de segurança.

Um simples exemplo

Assumindo que uma página Web com um campo para o utilizador colocar o seu "user id" para autênticação dos seus dados pessoais, remetendo a aplicação para o código do servidor:

SELECT * FROM Users WHERE UserId = " + txtUserId

Isto permite ao utilizador colocar maliciosamente "321 or 1=1" onde 321 é um incorreto "user id".

SELECT * FROM Users WHERE UserId = 123 or 1=1

Porque 1=1 é sempre um registo verdadeiro na tabela de utilizadores da base de dados.

Defesa contra as Injeções SQL

Existem três métodos básicos de defesa contra a injeção de SQL. Primeiramente, o mais simples, mas porém o método menos eficiente de proteção, consiste em usar um comando de validação de entrada (input) para confirmar se o comando recebido está digitado corretamente e se é o comando esperado. É também possível detetar certos caracteres e prevenir a sua entrada, como um comando válido. O problema deste método é que tudo o que pode ser usado maliciosamente, tem que ser detetado em todos os comandos possíveis; este é um processo demorado para implementar e potencialmente está sujeito a algumas lacunas. O outro problema com este processo diz respeito a alguns comandos que podem ser usados maliciosamente podem também ser completamente válidos em algumas situações.

O melhor método de defesa é usar consultas parametrizadas e procedimentos armazenados em vez dos encadeados comandos de utilizador para determinar as execuções SQL. Utilizar consultas parametrizadas funciona de maneira semelhante à colocação de parênteses à volta de uma expressão numa equação. Por exemplo na situação exposta, "123 or 1=1" é comparado contra o Id do utilizador "UserID" em cada registo da tabela como uma frase completa em vez de ser comparada separadamente.

Algumas das ferramentas modernas (ORM, LINQ) abstraem-se da escrita SQL e ao mesmo tempo protegem-na imediatamente da injeção. O DNN utiliza um mix parameterizado de procedimentos armazenados, nomeadamente, LINQ e uma ferramenta de mapeamento, (PetaPoco) de forma a interagir com a base de dados oferecendo um nível intrínseco de proteção contra as "injeções de SQL".

Qual é a causa da falha do Drupal

Todas as violações das contas Drupal foram causadas pela introdução ao acesso da camada de dados API, que serve especialmente para proteger das injeções de SQL executadas pelas consultas parametrizadas. No entanto, isto foi colocado no topo do código fonte que permitiu consultas não-parametrizadas, o que resultou num método de exploração que é explicado detalhadamente aqui. Esta exploração que depois foi usada de variadas maneiras, controlou inúmeros sites Drupal.

Vantagens do .NET sobre o PHP

A defesa contra a injeção SQL é possível em .NET e PHP através da utilização das consultas parametrizadas, apesar de argumentarem que o método PHP oferece esta funcionalidade, sendo mais pesado e suscetível a erros, do que a solução .NET. Esta é exacerbada pelo processo de variados desatualizados/errados tutoriais PHP em torno da web, que não é a melhor prática.

A parametrização das consultas PHP são construídas em torno de uma sequência de passos. Primeiramente a base de dados está preparada com os caracteres de preenchimento deixados onde as variáveis vão ser eventualmente injetadas. Os caracteres de preenchimento são em seguida colocados em variáveis para completarem os comandos SQL. Finalmente os comandos são executados. Um simples exemplo do uso de PHP com PDO é demonstrado no exemplo.

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName, Address, City)

VALUES (:nam, :add, :cit)");

$stmt->bindParam(':nam', $txtNam);

$stmt->bindParam(':add', $txtAdd);

$stmt->bindParam(':cit', $txtCit);

$stmt->execute();

Esta sequência pode tornar-se muito complexa nas mais complicadas consultas (como aconteceu com as explorações da Drupal) que pode ser afetada pelas falhas de segurança criadas.

A solução ASP.NET pode ser abrangida pela única função de chamada usada no mapeamento do uso do objeto relacional, passando a ser um único objeto pré-definido parametrizado pelo SQL, gerado e executado em segundo plano.

var rep = ctx.GetRepository();

rep.Insert(Customer);

Em certas situações, SQL em linha continua a ser utilizado; apesar disso continua a ser englobado numa simples função chamada para uso de PetaPoco micro-ORM API.

var rep = ctx.GetRepository();

Customer = rep.Find("WHERE CustomerName = @0 AND Address = @1", CustName, Address);

Obviamente muitos destes fatores são determinados pela preferência pessoal; apesar da simplicidade e clareza do uso parametrizado das consultas em .NET, onde mais facilmente é feita a prevenção da injeção de SQL.

Adaptado de: SQL Injection Attacks against Content Management Systems

PWM is a Hootsuite Partner

Hootsuite Solution Partner

Inscrição na Digital Marketers - Associação de Marketing Digital

Powered by PWM - Power Web Marketing  •  Terms Of Use  •       Home • O DNN • Webdesign • e-Commerce • Módulos DNN • Intranets