Descrever a injeção de SQL

Concluído

A injeção de SQL é um dos métodos mais comuns usados para violações de dados. O núcleo do ataque é que um comando SQL é anexado ao back-end de um campo de formulário na Web ou no front-end do aplicativo (geralmente por meio de um site), com a intenção de quebrar o script SQL original e, em seguida, executar o script SQL que foi injetado no campo de formulário. Essa injeção de SQL geralmente acontece quando você gerou SQL dinamicamente em seu aplicativo cliente. A principal razão por trás de um ataque de injeção de SQL se resume a práticas de codificação incorretas dentro do aplicativo cliente e dentro dos procedimentos armazenados do banco de dados. Muitos desenvolvedores aprenderam melhores práticas de desenvolvimento, mas a injeção de SQL ainda é um problema significativo devido ao número de aplicativos herdados que ainda estão sendo usados e aos aplicativos mais recentes criados por desenvolvedores que não levaram a injeção de SQL a sério durante a criação do aplicativo.

Como exemplo, suponha que o aplicativo Web front-end crie uma instrução SQL dinâmica, conforme mostrado abaixo:

SELECT * FROM Orders WHERE OrderId=25

Esse T-SQL é criado quando o usuário acessa a parte do histórico de ordens de venda do site da empresa e insere 25 no campo de formulário para o número de ID do pedido. No entanto, suponha que o usuário insira mais do que apenas um número de ID, por exemplo "25; EXCLUIR DE Pedidos;"

Nesse caso, a consulta enviada para o seu banco de dados seria como mostrado abaixo:

SELECT * FROM Orders WHERE OrderID=25; DELETE FROM Orders;

A maneira como a consulta no exemplo acima funciona é que o banco de dados SQL é informado por meio do ponto-e-vírgula ";" que a instrução terminou e que há outra instrução que deve ser executada. Em seguida, o banco de dados processa a próxima instrução conforme instruído, o que resultaria na exclusão de todas as linhas da tabela Orders.

A consulta SELECT inicial é executada normalmente, sem que erros sejam gerados. No entanto, quando você olhar para a tabela Pedidos, não verá nenhuma linha. A segunda consulta no lote, que exclui todas as linhas, também foi executada.

Uma técnica usada para evitar ataques de injeção de SQL é inspecionar o texto dos parâmetros, ou valores inseridos nos campos de formulário, procurando várias palavras-chave. No entanto, essa solução fornece apenas proteção mínima, pois há muitas, muitas maneiras de forçar esses ataques a funcionar. Algumas dessas técnicas de injeção incluem a passagem de dados binários, fazer com que o mecanismo de banco de dados converta os dados binários de volta em uma cadeia de texto e, em seguida, executar a cadeia de caracteres. Você pode ver um exemplo simples desse problema executando o código T-SQL abaixo.

DECLARE @v VARCHAR(255)

SELECT @v = cast(0x73705F68656C706462 AS VARCHAR(255))

EXEC (@v)

Quando os dados estão sendo aceitos de um usuário, seja um cliente ou um funcionário, uma boa maneira de garantir que o valor não será usado para um ataque de injeção de SQL é validar se os dados inseridos são do tipo de dados esperado. Se um número é esperado, o aplicativo cliente deve garantir que haja de fato um número sendo retornado. Se uma cadeia de caracteres de texto for esperada, verifique se a cadeia de caracteres de texto tem o comprimento correto e não contém dados binários dentro dela. O aplicativo cliente deve ser capaz de validar todos os dados que estão sendo passados do usuário. A validação pode ser feita informando o usuário do problema e permitindo que o usuário corrija o problema, ou travando graciosamente de tal forma que um erro é retornado e nenhum comando é enviado para o banco de dados ou o sistema de arquivos.

Embora a correção do código do seu aplicativo deva ser sempre a prioridade, em alguns casos isso pode não ser possível, portanto, ter Proteção Avançada contra Ameaças pode fornecer uma camada adicional de proteção para seus dados confidenciais.