SQLi: ataque de injeção

O que é SQL Injection?
SQLi é um tipo de ataque em aplicativo baseado na web onde o invasor pode executar consultas maliciosas no banco de dados de um site. SQL é uma técnica de injeção de código usada para executar instruções SQL maliciosas.
Por exemplo, se você deseja fazer login no site e esqueceu o nome de usuário e a senha, usando a injeção SQLi podemos fazer login ou acessar a página da Web sem saber a senha.
Como funciona a injeção de SQL?
A injeção de SQL contém inserir ou injetar a consulta SQL através dos dados de entrada do cliente no aplicativo. Estes são injetados no plano de dados que afetam os comandos SQL predefinidos.
Os ataques de injeção de SQL visam vulnerabilidades em instruções SQL dinâmicas. Pense em uma instrução SQL dinâmica como uma função matemática multivariada cujos parâmetros são fixos enquanto o resultado é determinado pelos valores colocados nas variáveis independentes.
Da mesma forma, uma instrução SQL dinâmica também consiste em um conjunto predefinido de parâmetros (como um formulário da Web) e a instrução completa é gerada somente quando o usuário fornece entrada.
Veja o exemplo a seguir de uma instrução SQL de um formulário de login:
SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')
Se existir uma vulnerabilidade em uma instrução SQL dinâmica, um invasor pode inserir um script complexo em um formulário para corromper os parâmetros existentes e alterar o significado de toda a instrução.
Tipos de injeção SQL:

In-band SQLi: A injeção de SQL em banda é um tipo de injeção de SQL em que o invasor recebe o resultado como uma resposta direta por meio do mesmo canal de comunicação. Por exemplo, se um invasor iniciar manualmente um ataque por meio de seu navegador da Web, os resultados do ataque serão exibidos no mesmo navegador da Web. A injeção de SQL em banda também é conhecida como injeção de SQL tradicional.
Injeção SQL baseada em erro — Aqui o invasor executa determinadas ações que fazem com que o banco de dados gere uma mensagem de erro. Você pode usar a mensagem de erro para determinar qual banco de dados está sendo usado, qual versão do servidor o manipulador está usando, etc.
Injeção SQL baseada em união — Uma instrução gerada pelo banco de dados para obter uma única resposta HTTP. Você pode construir a consulta na URL ou combinar várias declarações no campo de entrada para tentar gerar a resposta
Blind SQLi: Injeção cega de SQL é um tipo de injeção SQL em que o invasor não obtém uma resposta explícita do banco de dados que está sendo atacado, mas observa o comportamento do servidor de banco de dados e do aplicativo para reconstruir a estrutura do banco de dados de forma incremental. A injeção SQL cega também é conhecida como injeção SQL inferencial.
Boolean Based — Aqui, o invasor envia uma consulta SQL ao banco de dados e solicita que o aplicativo retorne resultados diferentes, dependendo se a consulta retorna True ou False.
Baseado em tempo — Neste ataque, um invasor envia uma consulta SQL a um banco de dados e faz com que o banco de dados espere um período de tempo especificado antes de compartilhar os resultados. O tempo de resposta ajuda um invasor a determinar se uma consulta é verdadeira ou falsa.
Out-of-Band SQLi: Out-of-Band SQL Injection (OOB SQLi) é um tipo de injeção de SQL em que o invasor não recebe uma resposta do aplicativo que está sendo atacado pelo mesmo canal de comunicação, mas pode ser induzido a enviar dados para um endpoint remoto controlado pelo invasor. A injeção de SQL fora de banda só é possível se o servidor que você está usando tiver comandos que acionam solicitações de DNS ou HTTP. No entanto, isso se aplica a todos os servidores SQL populares.
Exemplo em SQLi

O primeiro exemplo é muito simples. Ele mostra como um invasor pode usar uma vulnerabilidade de SQL Injection para burlar a segurança do aplicativo e se autenticar como administrador.
O script a seguir é um pseudocódigo executado em um servidor da web. É um exemplo simples de autenticação com um nome de usuário e uma senha. O banco de dados de exemplo possui uma tabela nomeada users
com as seguintes colunas: username
e password
.
# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)
password' OR 1=1
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16

As organizações podem aplicar as seguintes políticas para proteger contra ataques de injeção de SQL.
- Nunca confie na entrada do usuário. Eles sempre devem ser limpos antes de serem usados em instruções SQL dinâmicas.
Stored Procedures — Permite encapsular instruções SQL e tratar todas as entradas como parâmetros. - Instruções Preparadas — Instruções preparadas que funcionam primeiro construindo uma instrução SQL e, em seguida, processando os dados do usuário enviados como parâmetros. Isso não afeta a sintaxe das instruções SQL.
Expressões regulares — podem ser usadas para detectar código potencialmente malicioso e removê-lo antes que uma instrução SQL seja executada. - Permissões de usuário de conexão de banco de dados — A conta usada para conectar ao banco de dados deve receber apenas as permissões necessárias. Isso ajuda a reduzir o desempenho das instruções SQL no servidor.
- Mensagens de erro — Não revelam informações confidenciais ou a localização exata do erro. “Desculpe, ocorreu um erro técnico. Já entrei em contato com a equipe técnica. Tente novamente mais tarde” em vez de exibir a instrução SQL que causou o erro.
Isso é exatamente o que um firewall de aplicativo da Web (WAF) faz. Analise todas as entradas do usuário em seu aplicativo da Web em busca de correspondências com códigos suspeitos.
Esperamos que você tenha entendido a comparação e claro com os conceitos.
Deixe um comentário e compartilhe sua opinião!!
do autor:
Akash Shekhavat, Madhuri Shelke, Chetan Shinde, Swarali Sole
Referências:
https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16
https://systemweakness.com/sql-injection-attacks-53e942aae1f8
https://qawerk.com/blog/what-is-sql-injection/
https://brightsec.com/blog/sql-injection-attack/