Nome:
Local: Rio de Janeiro, RJ, Brazil

Que perguntinha hein?! Mas vamos lá, adoro estudar assuntos relacionados à web, sempre que posso aprendo uma tecnologia, técnica ou linguagem nova. Tento sempre ver quais são as tendências e acompanha-las, enfim eu sou um eterno aprendiz. Deixando o lado profissional, entrando no lado pessoal, sou uma pessoa super gente-boa (pelo menos eu me acho. rs), adoro curtir a night, sair com os amigos, fazer novas amizades e viajar (tem coisa melhor do que isso?) Acho que você já está sabendo demais sobre mim. Fuiii...

quinta-feira, 5 de junho de 2008

SQL In jection - Parte I

Estou começando à estudar um pouco mais sobre SQL Injection, Code Injection etc, esses conhecimentos são de suma importância para todos os desenvolvedores, pois com medidas básicas de segurança, é possível evitar muitos ataques, claro que se quer evitar todos é necessário um estudo aprofundado e ainda assim não está 100% seguro, pois sempre se arranja um modo de burlar a segurança, a dica é sempre estudar sobre o assunto. Esse é um tema, que você pode usar para o bem ou para o mal e abordarei o tema para tentar se prevenir e não para o uso maléfico, é como eu sempre digo: “Sua cabeça é seu guia”, então ao invés de tentar prejudicar os outros, vamos nos beneficiar com essas informações.

Bom, no tópico de hoje abordaremos um erro que é cometido aos montes por aí, é o de autenticação no site, um SQL inofensivo como esse, pode dar-lhe muita dor de cabeça:

Obs: Nos exemplos utilizarei como código de programação PHP e banco de dados MySQL.


$sql = “SELECT *
FROM logaUsuario
WHERE login = ‘$login’ AND senha = ‘$senha’“;


Aposto que você já fez um esquema de login parecido com esses muitas vezes (confesso, eu também), pois bem, uma pessoa com um mínimo de conhecimento de SQL Injection consegue entrar no seu sistema com muita facilidade, como sabemos na tabela-verdade, o AND para se ter um resultado verdadeiro é necessário que as duas partes das sentenças sejam verdadeiras, já no OR se apenas um sentença for verdadeira o resultado é verdade, agora que temos essa informação bem definida, vamos alterar um pouco o sql de cima:


$sql = “SELECT *
FROM logaUsuario
WHERE login = ‘$login’ OR ‘1’=’1’ AND senha = ‘$senha’ OR ‘1’=’1’“;


Após cada um dos testes (login e senha) adicionei um OR ‘1’=’1’, ou seja, se login for igual à um login cadastrado no banco de dados ou 1=1 ( o que temos certeza que é verdade) e senha repetindo o mesmo processo, obteremos sempre uma consulta que retornará resultado. Você deve estar se perguntando agora como adicionar esse OR na consulta, pois bem:


  • No input de login, colocar a seguinte expressão: ‘ OR ‘1’=’1

  • No input de senha, colocar a seguinte expressão: ‘ OR ‘1’=’1



Com isso você já consegue retornar todos os valores da tabela logaUsuario. Mas vamos supor que depois desse sql o desenvolvedor fez um teste que somente se logará no sistema se a pesquisa retornar apenas um linha, e esse teste sendo feito pela função mysql_num_rows, bom para isso o procedimento é bem parecido, agora só temos que limitar para que o sql nos retorne apenas uma linha e para fazermos isso:


  • No input de login, colocar a seguinte expressão: ‘ OR ‘1’=’1

  • No input de senha, colocar a seguinte expressão: ‘ OR ‘1’=’1’ LIMIT 1 --



Adicionei um LIMIT 1 e o -- (comentário no MySql), precisa-se coloca-lo para ignorar a última aspas que sobrou. Com esses dois passos bem simples, muita gente consegue entrar em um sistema de login. Com essas alterações o sql ficou dessa forma:


$sql = “SELECT *
FROM logaUsuario
WHERE login = ‘$login’ OR ‘1’=’1’ AND senha = ‘$senha’ OR ‘1’=’1’ LIMIT 1 --‘“;



Com uma medida muito mais simples você pode tirar essa falha do sistema. O grande causador desse estrago foram as aspas, pois através dela o atacante consegue abrir e fechar uma string e adicionar o código que ele quiser em seu sql. Para evitar esse problema, utilize a função nativa do php addslashes() na variáveis, para você que não usa php essa função adiciona ‘\’ (slash) antes de todas as aspas da sua string, agora o atacante não consegue adicionar código malicioso no seu sql.


$login = addslashes($login);
$senha = addslashes($senha);


Espero que saiba usar essas informações de forma inteligente e sem tentar prejudicar os outros. Senão aparecer muitos ataques por aí de sql injections, eu apareço com mais informações sobre o assunto. XD
Saiba isso é apenas o começo.

That’s all Folks!!!

Marcadores: ,

3 Comentários:

Blogger Ronaldo Santos disse...

Este comentário foi removido pelo autor.

26 de junho de 2008 22:14  
Blogger Ronaldo Santos disse...

Parabéns pelo blog, Ramon. Suas dicas são muito preciosas. Irei divulgar aos alunos da faculdade. Abraço.
Prof. Ronaldo Candido

26 de junho de 2008 22:18  
Blogger ramon disse...

Obrigado Professor,
Bom que tenha gostado. Volte sempre.

Fuiii...

26 de junho de 2008 22:37  

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial