segunda-feira, 16 de novembro de 2009

Hacker - SQL Injection

Esse é so um exemplo de como há muitas falhas na net. Deixando assim visivel a todos os leitores a fragilidade de alguns sites para 0 acesso de hackers. Estou apresentando esse tema como meio de alerta, não se responsabilizo pelo utilização da Tecnica.

1 - Modo Básico, passando por senhas em sites.



Hoje em dia é uma prática comum os sites pedirem um cadastro do visitante, e criar-lhe um login, dando acesso a áreas restritas e especiais do site. Cadastro esse que na maioria das vezes é gratuito, com a intenção apenas de fidelizar o usuário e claro, ter mais um e-mail para uma possível divulgação, que neste caso não se caracteriza spam, pois o devido usuário previamente aceitou informações vindas daquele site.

Em sites onde o cadastro é pago, a coisa muda de figura. O site imagina estar vendendo alguma informação ao visitante, e por isso, pode pedir alguns dados sigilosos do usuário e guardá-los seguramente no seu banco de dados.

O que venho apresentar, jogará seu login no vento e o site arderá no mármore do inferno, mas só vou falar como funciona porque Alah mandou e estava escrito com o bit sagrado.(huauha)


Essa técnica geralmente é chamada de SQL Injection, ou seja, injeção de SQL. Funciona em sites que testam a entrada do login em scripts ASP com chamadas internas de SQL.

Então vamos a lógica, como nada escapa dela.

O programador, iniciante ou não, pensa em criar uma área restrita para o site, logo precisará de um login e senha para os usuários. Então é criado dentro do banco de dados (em sql ou mdb, mais comum em mdb) uma tabela chamada Users(ou algo parecido, pra se tornar mais facio a memorização dessas tabelas, na hora de criar o codigo fonte), com alguns campos, dentre eles Usuário, Senha, Nome e Admin. Esses campos informarão exatamente o que o nome diz, ou seja, o login do usuário, a sua respectiva senha, seu nome e um campo flag indicando se é admin do site ou não. Se for admin, geralmente tem acessos a cliques extras, do tipo incluir/editar/deletar alguma informação.

Feito isso, cria dentro da sua página um bloco onde pede o login e senha para o usuário ter acesso as devidas áreas. Geralmente, o formulário tem apenas os dois campos mesmo, user e senha. Esses dois campos são enviados para um script .asp, que validará ou não o login informado. Se for válido, redireciona para a área restrita, senão, volta ao login ou no máximo, informa que o login estava errado.

Bonito não!? "Teoricamente funciona".

Agora é hora de botão na prática:

Dentro desse script .asp, o programador colocou algo desse tipo:

Código: Selecionar Tudo
‘ Isso pega o usuário e senhaInformados no formulário
cUser = trim(request(usuario))
cSenha = trim(request(senha))

‘Isso verifica no banco de dados se o usuário e senha conferem
‘ (vamos supor que o banco já esteja aberto com o nome de objConn)
SQLOpen = select usuario, senha, nome, admin from Users where usuario=’ & cUser & ‘ and senha=’ & cSenha & ‘
objRS.Open SQLOpen, objConn

‘ Verifica se achou um usuário com o login e senha informados

if not objRS.bof then
response.write Bem vindo & objRS.fields(nome) & !
else
response.write Login inválido.
end if

Na prática inocente, isso funciona. Funciona muito bem. Testa os usuários, se a senha não for a correta, realmente não entra. Se um usuário foi digitado errado, também não dá acesso.

Mas, na prática hacker, isso funciona melhor ainda, pois permite entrarmos como qualquer usuário do sistema. Até mesmo com status de admin.

Código: Selecionar Tudo
select usuario, senha, nome, admin from Users where usuario= ' cUser ' and senha= ' cSenha ';

Essa é a string do SQL. Em VB e ASP e outras, sabemos que para concatenarmos uma string dentro de outra, devemos usar aspa simples, invés de aspa dupla, pois a aspa dupla é para a string mestre, e a aspa simples é para a string interna.

Traduzindo a string acima, teríamos:

Código: Seleiconar Tudo
select usuario, senha, nome, admin from Users where usuario= 'geek' and senha= 's3nh4'

Dessa forma, trocamos as variáveis cUser e cSenha, pelos seus respectivos conteúdos.

Repito, isso funciona muito bem, quando usamos de forma inocente. Vale lembrar que de 10 sites em asp que pedem login e senha, 8 tem essa forma de consulta e estão sujeitos a algum tipo de invasão, dependendo do nível de acesso que permita aos seus usuários.

Você falou, falou, falou…. mas e daí!? Cadê o erro nisso?

Respondo pra você..... VAMOS lá !

Se quando formos digitar um login, tivermos essa string de programação do Sql na cabeça, podemos formar outra facilmente, que injeta um comando de Sql, dentro do que o programador já fez.

Ou seja, se eu digitar Mario no username, o Sql ficará:

Código: Selecionar Tudo
select usuario, senha, nome, admin from Users where usuario= 'Mario' and senha= 's3nh4'

Repare que as aspas simples continuam e fazem realmente parte do comando, que mostra ao sql que aquele campo deve ser comparado com um dado do tipo string.

Agora, se digitarmos no username Ma’rio (com uma aspa simples no meio), a página dará um erro, pois o comando ficaria desse tipo:

Código: Selecionar Tudo
select usuario, senha, nome, admin from Users where usuario= 'Ma'rio' and senha= 's3nh4'

Analisando, vemos que quando fomos comparar o campo usuário, abrimos uma aspa simples, colocamos o conteúdo Ma (Mario) e fechamos a aspa simples. Para o Sql, a comparação terminou aí, o que vem depois, deveria ser comandos. Mas não era. Era a continuação do username, a palavra rio e mais uma aspa simples, que deveria estar fechando a primeira (antes da palavra Ma), mas na realidade está abrindo uma nova string no SQL, e como não é comparado com nada, o SQL retorna erro de programação.

Então, já que o SQL aguarda ansiosamente por outra aspa simples para fechar aquela primeira, porque nós não damos a ele, e aproveitando, injetamos um comando nele.

Imagine se usarmos a string ‘ or ‘1 (isso mesmo: aspa simples + espaco + or + espaco + aspa simples + 1), ficaria assim:

Código: Selecionar Tudo
select usuario, senha, nome, admin from Users where usuario= '' or '1' and senha= 's3nh4'

Lendo o comando, seria a mesma coisa que falar pro SQL: me retorne o usuário que seja igual a vazio OU 1. Lembrando que 1 em informática é a mesma coisa que True (verdadeiro). Lendo novamente: Me retorne o usuário que seja igual a vazio (não existe nenhum) OU verdadeiro (opa.. verdadeiro é verdadeiro, então achei). Nisso, a tabela pega todos os usuários, pois todos dão verdadeiro. Não são igual a vazio, mas o 1 garante que todos sejam válidos. Agora falta só filtrar a senha.

Se usarmos a mesma string mágica na senha, nós seremos o primeiro usuário da tabela, pois:

Código:Selecionar Tudo
select usuario, senha, nome, admin from Users where usuario= ''or '1' and senha= '' or '1'
Ai so usar a ideia para conseguir injentar outros códigos SQL. Proximos post devo detalhar mais os resultados.

Obrigado!

Nenhum comentário:

Postar um comentário