SQL INJECTION
O QUE É SQL INJECTION (SQLI)?
o SQL injection ou SQLI, é uma das uma das vulnerabilidades mais famosas, e uma das mais perigosas tambem.
a vulnerabilidade consiste em alterar parametros usados em requisições para que o banco de dados nos devolva informações que nao deveriamos ter acesso normalmente, como: dados de outras colunas da tabela que podem ter informações sigilosas, colunas com os dados de outros usuarios, como email,senha,telefone e e.t.c. ou até outras tabelas do banco de dados.
O QUE PODE CAUSAR?
como citado, o SQL injection pode nos devolver informações de outros usuários, podendo causar vazamentos de dados muito sérios e prejudiciais aos usuários e a propria impresa responsavel pelo site.
imagine o site de um banco, se o banco possuir tal vulnerabilidade, o atacante pode acessar indevidamente a conta de diversos usuarios, e fazer trasnferencias de dinheiro, compras em seu nome, emprestimos e muitos outros danos aos usuarios e ao banco, inclusive a venda dessas informações sigilosas em mercados ilegais de dados.
COMO ACONTECE A VULNERABILIDADE? (exemplos)
para entender melhor o como pode acontecer o SQL injection, seguiremos com o seguinte exemplo:
esse é um site de compras(falso) que exibe seus produtos em diferentes categorias, e ele possui uma vulnerabilidade SQLI nesse seu mecanismo de categorias de produtos:
note que quando clicamos na categoria de produtos "accessories", o navegador solicita a URL com category recebendo esse parametro
no exemplo desse site o que acontece nessa consulta SQL é o seguinte codigo:
SELECT * FROM products WHERE category = 'accessories' AND released = 1
essa consulta SQL solicita que o banco de dados nos retorne:
- todos os detalhes(*)
- da tabela products
- que a categoria é accessories
- e *released = 1
no codigo released é uma condição responsavel por exibir apenas produtos com essa condição(released) sendo 1, podemos presumir que released = 0 são produtos ocultos, porque ainda não lançaram ou outro motivo para estarem ocultos do usuario.
sabendo que o site nao possui nem uma defesa contra SQLI e está vulneravel, o atacante poderia simplismente modificar o parametro de category na URL:
note os (--), no sql isso significa de abrirá um comentario,entao, aquela mesma consulta ficaria assim:
SELECT * FROM products WHERE category = 'accessories'--' AND released = 1
após o (--), tudo será tratado como comentario, inclusive a restrição de released ser igual a 1, o que faz nos retornar os produtos ocultos:
requisição normal
requisição com SQLI
note que temos acesso a 1 produto que estava oculto.
esse é um exemplo muito simplis, e pouco danoso, mas pode dar uma noção de como tudo funciona.
VAMOS CONSIDERAR OUTRO EXEMPLO
esse site permite que o usuario logue com seu nome e senha.
o site verifica os dados do usuario da conta usando a seguinte consulta SQL:
SELECT * FROM users WHERE username = 'light' AND password = '1234'
a tabela onde username = "light" e password = "1234" é retornada se os dois campos forem validos.
note que username e password são os parametros para que retorne os dados da conta corretamente,se qualquer um estiver incorreto o login não acontecerá.
Mas agora, se no lugar do nome colocassemos o nome de usuario e um sinal de comentario(--), o que aconteceria?
Como ja vimos antes o sinal de (--) é um indicativo que tudo em seguida será comentado, o que fará o parametro da senha tambem ser comentado, assim a verificação seria baseada apenas no nome do usuario, nos dando acesso a qualquer conta sem a nessecidade da senha.
assim que a consulta SQLI se pareceria:
SELECT * FROM users WHERE username = 'light'--' AND password = '0000'
note que o invasor colocou a senha "0000"(incorreta), mas mesmo assim teria acesso a conta, ja que a verificação da senha foi comentada.
mais exemplos em breve estou um pouco oculpado agora, e nao vou conseguir me aprofundar em outros exemplos, mas para quem souber sobre, os comentarios são um otimo acrecimo ao post original, sinta-se a vontade para explicar mais:)
COMO TESTAR ATIVAMENTE:
em construção
TIPOS DE SQLI E COMO CADA UM FUNCIONA:
existem varios tipo de SQL injection, cada um com certas diferenças em como explora-los e como pode afetar o sistema.
os principais são:
-
Union-Based SQL Injection
https://www.tabnews.com.br/LIGHTdev4687/sql-injection-baseado-em-union -
Error-Based SQL Injection
-
Time-Based Blind SQL Injection
-
Boolean-Based Blind SQL Injection
-
Out-of-Band SQL Injection
por hoje é isso:)
vou tentar atualizar constantemente esse post,com mais exemplos, explorando os diferentes tipos de sqli e melhorar algo que possa estar errado ou confuso.
espero que nos comentarios tambem expliquem sobre, assim criando muito conteudo para quem clicar nesse post em busca de aprender mais.
é sempre recomendavel olhar a fonte para esse post