Falhas de Segurança - Injection
Semana passada recebi um e-mail falando sobre injection com JavaScript no navegador, podendo explorar falhas de algumas páginas....Bem, vamos ao exemplo :
- Entrem no images.google.com
- Informe qualquer coisa e pesquise as imagens
- insira o javascript abaixo no campo de pesquisa de endereços(é só copiar e colar na barra de endereços de seu navegador):
javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName("img"); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+"px"; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+"px"}R++}setInterval('A()',5); void(0);
Já vi outros injections com JavaScript, principalmente no Orkut, e isso me lembra outro exemplo de injection que é sempre bom estar atento, que é o SQL INJECTION.
Para quem não conhece ainda pode ser bastante interessante, e possível que você já tenha desenvolvido algum sistema suscetível a esse tipo de ataque...
Bem, vamos a explicação : os injections na verdade, como o próprio nome já define, é uma injeção de código(s) que algum programador pode introduzir para mudar o curso normal do programa, sendo que este código pode ser inserido tanto em navegadores como vimos no exemplo a cima, como em caixas de textos e requisições. Indo além de SQL e JavaScript, podendo ser usado também em várias linguagens de programação (as mais suscetíveis são as voltadas para WEB) e até comandos SHELL.
Vamos a um exemplo :
Imagine um site web onde você encontra um painel de controle com os campos usuários e senhas.
Geralmente, se as informações ficarem guardadas em banco de dados (com certeza estarão) a consulta mais provável que será feita para validar esta etapa é a seguinte :
SELECT usuarios.Username FROM Usuarios usuarios WHERE usuarios.Username = 'Username' AND UserList.Password = 'Password'
Caso o programador não tenha previsto a falha, alguma pessoa mal
intencionada poderia aproveitar da falha injetando o seguinte código no campo senha ou usuário :
SELECT usuarios.Username FROM Usuarios usuarios WHERE usuarios.Username = 'Username' AND UserList.Password = 'Password' or '1' = '1'
O que é considerado verdade, pois no meu mundo '1' é igual a '1'...e no seu ?
Antes de mostrar como solucinar este problema, gostaria de mostrar algumas "soluções" comumente adotadas,
mas que na verdade não conseguem solucionar o problema...
Caso o programador não tenha previsto a falha, alguma pessoa mal
intencionada poderia aproveitar da falha injetando o seguinte código no campo senha ou usuário :
SELECT usuarios.Username FROM Usuarios usuarios WHERE usuarios.Username = 'Username' AND UserList.Password = 'Password' or '1' = '1'
O que é considerado verdade, pois no meu mundo '1' é igual a '1'...e no seu ?
Antes de mostrar como solucinar este problema, gostaria de mostrar algumas "soluções" comumente adotadas,
mas que na verdade não conseguem solucionar o problema...
Maneiras Erradas
1 - Tratamento através de JavaScript, não permitindo que seja digitado algum caracter especial nos campos de login e senha.
Desvantagem : Veja no vídeo abaixo o problema do JavaScript :
Desvantagem : Veja no vídeo abaixo o problema do JavaScript :
2 - Tratamento no SQL limitando o número de linhas...
select u.usuario from user u where u.usuario = 'legal' and u.senha = 'legal' and rownum <=1
Desvantagem : O caracter -- funciona como comentário para o que vem a seguir, ou seja, furada...
select u.usuario from user u where u.usuario = '' or '1' = '1'
-- and u.senha = 'qqcoisa' and rownum <=1
Existem outras maneiras de contornar as falhas de injection, algumas mais trabalhosas e outras menos..vamos enumerá-las :
select u.usuario from user u where u.usuario = '' or '1' = '1'
-- and u.senha = 'qqcoisa' and rownum <=1
Existem outras maneiras de contornar as falhas de injection, algumas mais trabalhosas e outras menos..vamos enumerá-las :
Maneiras Corretas
1 - Tratamento das informações no servidor, no caso não permitir caracteres especiais, porém fazer esta validação ao receber as informações no seu request...
Desvantagem : Tempo de resposta para o usuário será maior.
2 - Tratamento através da resposta do banco de dados :
Comparar o retorno da consulta com os dados que o usuário digitou.
3 - Usar comandos próprios da linguagem para garantir a segurança :
Função addslashes() do PHP, que adiciona uma barra de scape antes de cada aspa simples ou dupla encontrada.
Exemplo :
$user_protegido = addslasehs($usuario); $sql = 'select * from usuarios where usuario = '. $user_protegido .';
O retorno seria algo como : select * from usuarios where usuario = ' \' or \'1\' = \'1\'
4 - Se possível usar um misto de todas...caso alguém contorne alguma das soluções temos três barreiras para barrar o intruso...
Existem vários outros tipos de injection, como citei, em algum post futuro falarei sobre alguns como inject em PHP, e redirecionamento de páginas com o mesmo.
Abraços !
Desvantagem : Tempo de resposta para o usuário será maior.
2 - Tratamento através da resposta do banco de dados :
Comparar o retorno da consulta com os dados que o usuário digitou.
3 - Usar comandos próprios da linguagem para garantir a segurança :
Função addslashes() do PHP, que adiciona uma barra de scape antes de cada aspa simples ou dupla encontrada.
Exemplo :
$user_protegido = addslasehs($usuario); $sql = 'select * from usuarios where usuario = '. $user_protegido .';
O retorno seria algo como : select * from usuarios where usuario = ' \' or \'1\' = \'1\'
4 - Se possível usar um misto de todas...caso alguém contorne alguma das soluções temos três barreiras para barrar o intruso...
Existem vários outros tipos de injection, como citei, em algum post futuro falarei sobre alguns como inject em PHP, e redirecionamento de páginas com o mesmo.
Abraços !
Marcadores: Segurança
0 Comentários:
Postar um comentário
Assinar Postar comentários [Atom]
<< Página inicial