Executando verificação de segurança...
-1

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/

Carregando publicação patrocinada...
5

Ver mais em:

Melhor exemplo (olha a gambi que tive que fazer para publicar):

Código

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).

1

legal!! essa é mais uma forma de fazer SQL injection. há uma lista de queries que podem ser usados, tanto em inputs quanto no próprio URL do site. obrigado por compartilhar!

1

A sua só funciona em algumas circunstâncias, e mesmo assim na forma que mostrou, não fica claro que dá para fazer a injeção, eu diria que na maioria das linguagem não dá, teria que ser uma bem esquisita que dá.

1

o objetivo era citar um exemplo simples mesmo, só pra mostrar o conceito. como falei no post, normalmente essas queries são muitos mais complexas.
além disso, todos os exemplos usados nesse post foi retirado do vídeo do NetworkChuck caso queira dar uma olhadinha na fonte, o vídeo é excelente e explica de forma bem simples e direta. ele também cita um exemplo usando OR 1=1 mas eu resolvi compartilhar apenas o último exemplo pensando no tamanho do post.
mas obrigado pelo feedback maniero! acrescentou ao assunto no geral! ;)

1

O vídeo não é bom. Ele é simplista e tudo o que não pode com segurança é ser simplista. Mas não é trágico por isso. E de fato ele dá contexto que ajuda, seu texto não dá o mesmo contexto. Ele não mostra que o ataque vai funcionar sempre, apenas que dá para fazer alguma injeção. Mas o pior é que ele não mostra porque você pode causar isso. Ficou uma caixa mágina no vídeo dele. Tente reproduzir o que ele fala só com o que ele mostra, sem você fazer nada extra.

Por isso que eu falo para as pessoas pararem de seguir influencers e aprender com engenheiros. Influenciadores só querem views, o compromisso com a relidade é de baixo a zero.

0

amigo, eu só queria compartilhar com o pessoal o conceito de SQL injection que eu vi pela primeira vez essa semana. meu objetivo não era dar uma aula. talvez o post, assim como a aula do Filipe no curso me incentivou a pesquisar mais sobre o assunto, também incentive outros a conhecer e procurar saber mais.
por isso fiquei feliz com seu primeiro comentário, mais fontes para pesquisar!

3