A sua aplicação está segura a SQL injection? 🤔
Acredito que a resposta seja sim, essa vulnerabilidade já foi mais comum há alguns anos. Apesar de ser bem conhecida no meio de segurança de dados, eu tive o primeiro contato com essa vulnerabilidade na última aula que assisti no curso.dev do Filipe Deschamps. E eu achei muuuuuito massa! E como o próprio Filipe frisou, saber reconhecer e consertar esse tipo de brecha vale ouro!
SQL injection (SQLi) é uma vulnerabilidade na segurança de uma aplicação que permite a “injeção” 💉 de queries maliciosas com o objetivo de atacar o banco de dados. Uma SQL injection bem sucedida pode acarretar ao acesso não autorizado a dados sensíveis ou até mesmo ter o poder de modificar e apagar dados importantes.
No vídeo do canal NetworkChuck é citado um exemplo bem básico usando um input “username” e “password” onde depois de preencher os dados e apertar “login” a aplicação conecta com o banco de dados e roda uma query para ver se o username e password existem. Se sim, o login é bem sucedido.
E é bem aqui que podemos encontrar uma brecha! ⚠️⚠️ A query enviada para o banco de dados provavelmente é parecida com isso aqui:
SELECT * FROM users WHERE username = ‘user’ AND password=’senha’
Quando estamos codando, é comum usarmos comentários para descomplicar o código, certo? Em SQL é possível fazer isso apesar adicionando “--” e tudo que vier depois disso vai ser ignorado.
No final do nosso nome de usuário “user” podemos abrir aspas e adicionar “--”, assim: user’--
E a query vai ficar dessa forma:
SELECT * FROM users WHERE username = ‘user’-- ’ AND password=’senha’
Isso significa que o “AND password=’senha’” vira comentário e é totalmente ignorado. Presumindo que exista um username = ‘user’, como o restando não vai ser processado ele só precisa desse dado e BOOM!! Login bem sucedido! Sem precisar de senha.
Não é legal?! 🤩
Isso aqui é só o básico, normalmente é bem mais complicado que isso. E apesar de ser uma forma de hack bem antiga, ainda pode ser encontrada. Por isso a importância de fazer um Query Sanitization ou Limpeza de Consulta. O lado bom é que podemos encontrar muitas bibliotecas e módulos que oferecem formas de sanitização para implementar em nosso código de forma bem fácil! Assim vamos estar tranquilos com nossas aplicações bem seguras. 😎
Fontes: https://portswigger.net/web-security/sql-injection https://www.youtube.com/watch?v=2OPVViV-GQk https://www.linkedin.com/feed/update/urn:li:activity:7151913275763417088/
Ver mais em:
Melhor exemplo (olha a gambi que tive que fazer para publicar):
Sendo que user
e senha
não variáveis do seu código que receberam diretamente os dados vindo externamente à sua aplicação sem nenhum tratamento. Só nessas condições dá certo.
Em geral vão mandar o nome do usuário assim (se o user
não aceitar tantos caracteres, pode tentar na senha
, se também não der, não sei se tem solução pensada para todos os DBs, portanto ter poucos caracteres é ruim de um lado, mas pode previnir esse tipo específico de ataque, ainda pode conseguir de outra forma, então melhor fazer certo):
Isso fecha as aspas da query, e em seguida garante que será verdadeiro sempre conectando com OR
ue exihge que só um lado seja verdadeiro, e 1=1
é verdadeiro, e depois usa o comentário para o resto do texto que já estava no seu código ser desconsiderado e não dar erro, ficando assim quando for executar (a senha não importa):
Pode testar. Espero não ter comido alguma bola, eu não testei :D
Espero ter ajudado. Em geral estou à disposição na plataforma (sem abusos :D)
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).
O XKCD tem uma clássica sobre o assunto.