![]() |
||||||||
|
|
||||||||
![]() ![]()
![]() Gostou
da Página?
Então para um amigo! |
Falhas de Segurança de Programação Enquanto todas as atenções se voltam para os problemas de segurança de rede e as invasões de hackers com cada vez maiores conhecimentos técnicos e cada vez mais audaciosos outro problema de abrangência e gravidade muito maior é deixado de lado : A segurança contra falhas de programação que sejam capazes de expor um sistema na web. Testei muitos sites e me assustei com o que encontrei : Sites de e-commerce muito famosos encontram-se com falhas de programação grosseiras que permitem que qualquer um roube informações de seus bancos de dados. Ironicamente estes mesmos sites utilizam o selo da verisign "site seguro". Com os testes me assustei com a constatação de que não existe e-commerce seguro. E não estou falando da possibilidade de super-hackers quebrarem qualquer coisa, estou falando que qualquer amador tem em mãos todos os recursos necessários para entrar em sites de e-commerce famosos : um browser e o notepad. Vale ainda mencionar que plataforma utilizada não fez a menor diferença : testei sites com ASP, PHP, ColdFusion, SQL Server, Oracle, Access, MySQL, todos com o bug, que é um bug de programação e independe da linguagem utilizada. O que ? Falha de programação não faz isso ? Pois veja e se assuste.
Mas o fato é que ninguém está seguindo esta regra. E o resultado são três algorítimos falhos :
Passo 1 : Obtendo informações sobre a vítima. Tudo se inicia na caixa de login. Inicia-se digitando-se um apóstrofo e clicando-se no botão para seguir adiante. As reações podem ser as mais diversas : Uma mensagem de erro gerada pelo próprio site : Essa é a melhor reação possível, quando bem utilizada, quando não fica inútil. O fato da própria aplicação no site gerar a mensagem de erro significa que, se é que houve um erro ocorreu um tratamento e o pretenso hacker ficará sem saber o que ocorreu em consequencia da entrada dele na caixa de login. Mas a alegria do administrador do site pode durar pouco : Alguns sites tem o costume de dar mensagens diferenciadas de acordo com o erro, tal como "usuario inválido", "senha inválida" ou "erro desconhecido". Neste caso o procedimento de tratar o erro é inútil, pois a mensagem de erro personalizada de acordo com o erro está informando ao hacker que a tentativa dele gerou algum resultado. O ideal é dar uma mensagem padrão do tipo "Login inválido" para qualquer erro que porventura ocorra durante o processo de login, desta forma o hacker, a princípio, não saberá se as tentativas dele geraram algum resultado ou não, dificultando (não impedindo) a ação do pretenso hacker. Vale mencionar que o tratamento padrão dos apóstrofos faz com que o apóstrofo digitado na caixa de login seja visto como um usuário. Assim sendo se o site está usando mensagens diferenciadas e, como resposta ao apóstrofo, o pretenso hacker recebe alguma mensagem diferente de "usuário inválido", ele está na verdade recebendo um convite do tipo "continue, você está no caminho certo e vai conseguir". Mensagem do servidor : Caracteres inválidos no login : Pode ser vista como a solução do problema. Se disparada a partir do servidor significa que o algorítimo de login testou o login e identificou que haviam caracteres inválidos, não indo ao banco. Isso fará com que o hacker de imediato desista do seu site. Desista, mas espalhe a todos que seu site é mal programado, já que esta não é a forma correta de se tratar os apóstrofos, apesar de funcionar. Esteja atento para o fato de que a mensagem deve partir do servidor, não do client. Infelizmente muitos programadores WEB tem dificuldades em diferenciar isso, mas esteja certo que um hacker o faz de olhos fechados e mãos nas costas.
Nesta hora o hacker dá um risinho e arregaça as mangas : isso é um desafio, ele foi desafiado por um mal programador ! Que audácia ! Em menos de 5 minutos o hacker edita o código fonte, elimina a validação e invade o site. Manter validação apenas no client é o mesmo que não manter validação nenhuma. Claro que esta mensagem ainda não é uma certeza de sucesso : Se a validação estiver duplicada tanto no client como no servidor o hacker vai perder tempo a toa. Para a sorte dele, porém, são poucos os desenvolvedores que tem verdadeiro conhecimento da arquitetura WEB para desenvolver desta forma. Erro 500.100 Característico do Windows 2000, esse erro impede que o hacker veja detalhes sobre o erro ocorrido no código ASP, dificultando a ação do hacker. Ponto para o site. Mas em primeiro lugar deve-se destacar que isso foi conseguido apenas por acaso, já que é a configuração default do windows 2000. Isso demonstra total desconhecimento por parte do desenvolvedor do fato de existir nos servidores Web uma configuração que faz com que em caso de erro apenas uma mensagem de erro padrão seja exibida. Ponto para o hacker, já que se o desenvolvedor desconhece isso as chances de haverem outras falhas são grandes. Além disso o erro 500.100 é tipico do windows 2000. Assim sendo o hacker já sabe o que está rodando do outro lado e saber isso é o primeiro passo para um ataque via rede, já que basta uma pequena busca no astalavista para descobrir os pontos falhos do sistema. Nosso artigo porém não irá se aprofundar nisso. Ocorreu uma falha, contacte o administrador Parecido com o erro 500.100, esta é a mensagem padrão normalmente utilizada quando o administrador do servidor configura uma mensagem em resposta a erros ocorridos no servidor (comentei isso logo acima). Esta mensagem é um pouquinho melhor que o erro 500.100 pois com esta mensagem o hacker não ganha informação alguma sobre o sistema que está rodando do outro lado. Porém ele ganha algo importante : A informação de que ocorreu um erro. Isso já é o suficiente para que ele saiba que está no caminho certo. O melhor teria sido tratar o erro em código e dar uma mensagem a partir do código de programação, como mencionado no primeiro tópico. Mensagem de erro de acesso a banco : Tudo o que o hacker mais deseja é ver esta mensagem. Ela diz tudo :
Estas informações ajudam o hacker a invadir os servidores de rede, já que identificou o que está do outro lado e pode buscar informações sobre as falhas de segurança existentes. Porém este não é o assunto de nosso artigo. Para invadir através do próprio site, veja a utilidade das informações para o hacker :
Se o hacker recebeu uma mensagem popup (típica do client) informando sobre caracteres inválidos a forma de invasão se altera e ele não passa pelo passo 2, não agora pois não funcionaria. Explicaremos isso mais adiante. Em todos os outros casos o hacker segue adiante com a invasão digitando : ' or '1'='1 tanto na caixa de login como na caixa de senha. A digitação disso, porém, pode ter suas dificuldades : o hacker pode esbarrar um um maxlength (para leigos: tamanho máximo) configurado ou na caixa de login ou na de senha. Na caixa de login, além de ser incomum, ele logo verá. Na caixa de senha, devido a senha ser trocada por *, fica difícil identificar e o hacker deverá estar bem atento para perceber o problema. Identificando o problema do maxlength, é fácil resolver : Basta tira-lo, assim como seria tirada a validação no client. Então há aqui um pequeno desvio antes de continuar, falaremos sobre isso posteriormente. Caso tudo de certo, as chances de haver entrado são grandes. Como ? Não entendeu ? Veja a montagem da instrução sql abaixo :
Essa seria a montagem de uma busca pelo usuário no banco em ASP. Outras linguagens, apesar de terem síntaxes para a montagem diferente, geram a mesma instrução SQL e por isso ficam sujeitas ao mesmo bug de programação. Que bug ? Não entendeu ? Então para ficar mais claro veja a instrução SQL pura concatenada com o que o hacker digitou :
A próxima pergunta seria : E como os algorítimos de autenticação reagem a isso ? Veja você mesmo :
Assim sendo se o algorítimo utilizado fosse o A o hacker já estaria com acesso ao site. Seria necessário refinar um pouco o acesso, já que o registro trazido é escolhido aleatoriamente e se o programador estiver com sorte pode ser um registro de testes criado pelo próprio programador. Vamos fazer isso no passo 3, por enquanto vamos nos dedicar a como prosseguir a partir dos passos B e C. Bem, os algorítimos B e C são mais seguros que o A, isso é inegável. Algumas informações que poderiam ser facilmente obtidas através do algorítimo A ficam inacessíveis devido ao uso do algorítimo B e C, pois já que o algorítimo faz a checagem da senha o hacker precisa saber a senha. Fica mais difícil obter-se alguns dados, mas não impossível. Então para passar pelo algorítimo B e C o hacker precisa conhecer a senha. Isso é fácil : "senha", "password", "teste","123","1234","12345" e qualquer coisa ligada ao site (em um site de Vb encontrei "VB","visual","basic"). O truque está no fato de que o hacker não precisa conhecer o nome de login. Veja o que ele deverá digitar na caixa de login :
Na caixa de senha deve ser digitada a própria senha. Veja como fica a instrução SQL :
A instrução SQL pode variar um pouco, de acordo com a senha estar ou não sendo procurada no banco (algorítimo B ou C), mas o resultado acaba sendo o mesmo. Os mais atentos observaram três coisas : A) Apenas registros com senhas fáceis ou que o hacker seja capaz de adivinhar estarão vulneráveis.
B) Não se pode buscar informações de uma pessoa específica, seria necessário conhecer a senha da pessoa.
C) É necessário saber o nome do campo que contém a senha.
Vocês devem estar pensando : "Então se utilizar um nome absurdo para meu campo de senha e configurar o servidor corretamente vou estar seguro..." De fato, mas não usaria este método. O hacker pode simplesmente tomar um atalho e apagar todo seu banco (falarei disso depois). O fato é : Você não deveria ter deixado que ele chegasse até aqui. Eu recomendo o seguinte : utilize as boas práticas de desenvolvimento, que mandam que você padronize nomes de variáveis. Aplique-as para nomes de campo. Por exemplo, se seu campo se chamar s_senha, ou quem sabe v_senha, ao invés de simplesmente senha, será bem mais difícil para o hacker adivinhar o nome deste campo. Já vi uma empresa utilizando cod_senha como padrão. Pois crie o seu padrão. Se por azar algum hacker chegar a este ponto dentro do seu site não conseguirá adivinhar o nome de seu campo e não poderá seguir adiante. Por outro lado o nome de campo padronizado não só não prejudicará você como também gerará ganhos em termos de qualidade de desenvolvimento. Passo 3 : Melhorando a obtenção de dados Agora que fizemos a invasão é hora de refinarmos seu resultado. Por exemplo : Como podemos pesquisar por um login específico ? Vamos ver exemplos em relação ao algorítimo A. Alguns exemplos podem ser adaptados para o B e C, outros não. Digamos que desejamos procurar por uma pessoa específica. Podemos fazer algo como :
Tanto na caixa de login como de senha. Teremos como resposta o registro do fulano e o algorítimo A nos deixará passar. Muitas outras combinações podem ser feitas com endereço, nome, telefone, etc., mas é necessário saber o nome dos campos. Mas e se não for possível saber os nomes dos campos ? Temos então o truque do comentário e do order by. Tanto o SQL Server como o Oracle aceitam o símbolo -- como comentário inline, assim tudo que estiver depois deste símbolo é ignorado. Perigoso, não ? Veja o que dá para fazer :
O order by aceita uma indicação numérica ao invés do nome do campo, assim sendo ele ordenará pelo campo 1, campo 2, campo 3,etc. e o hacker terá acesso a tantos registros quantos forem os campos da tabela, tudo sem saber o nome de campo algum. Porém se o hacker souber pelo menos o nome de 1 campo e conseguir acertar o nome da tabela (que, pelo que testei, em 80% dos casos é "usuarios"), veja o que ele poderá fazer :
Sacou ? Com esta linha ele está pegando o 2o registro da tabela. Agora basta aumentar o número do TOP (2,3,4,5,6) e ele pegará, registro por registro, a tabela inteira. Basta ter paciência. Paciência ? Não, não precisa. É hora de irmos ao passo 4 : A automatização da invasão.
Depois de acertar o padrão da instrução SQL que permitirá que pegue todos os dados do banco é hora de automatizar. O hacker pode criar uma aplicação VB que faça a obtenção de dados automaticamente. O componente INET do Vb pode fazer um POST para um endereço Web e obter a resposta. Veja como ele faria :
Assustador, não ? Não tanto quanto o último passo... Passo 5 : Destruir tudo A questão é : O hacker pode destruir tudo ?
Isso responde ? SQL Server processa isso sem problemas, Oracle precisa de um ; : ' ; drop table usuarios --
Tudo depende do usuário que está sendo utilizado pelo site para se conectar ao servidor Web. Se for um usuário com permissão de system administrator, db_owner ou ddl_admin (sql server) ou o equivalente no Oracle então o site estará em sérios apuros. E se não for ?
ou
É... sem salvação... Talvez uma pequena luz no fim do túnel : É provavel que a tabela usuários seja referenciada por diversas outras através de foreign keys. Isso fará com que o delete em questão não funcione. A salvação do site então acaba sendo um pequeno acaso. Mas a luz pode virar um trem se o DBA tiver feito deleção em cascata... que perigo ! Porém não é simples para o hacker fazer isso : Como a instrução que está sendo dada é a 2a de um SELECT o hacker não recebe nenhuma resposta visível que diga se a instrução funcionou ou não. A única excessão é quando a instrução gera um erro de compilação, então o hacker vê a mensagem de erro. Explico. Os bancos, antes de processarem as instruções, realizam um processo de compilação na mesma. Se nesse processo houver algum erro, em geral erro de síntaxe, o hacker vê a mensagem (conforme a configuração do servidor, claro, da qual já falamos). Mas se as instruções passarem pelo processo de compilação então o hacker não verá nenhuma mensagem de erro relativa a 2a instrução. Por exemplo, ele não saberá se acertou o nome da tabela ou não. A única forma de saber se acertou ou não o nome da tabela é verificando se alguma coisa no site parou por falta da tabela. Já que o usuário do site precisa ter permissões adequadas para fazer isso o hacker precisará identificar se tais permissões existem ou não. No SQL Server uma forma de fazer isso é a seguinte :
Essa instrução precisa que o usuário seja um system administrator para ser executada. Se não for, dará um erro de compilação. Assim sendo, se o hacker ver um erro como resultado saberá que o usuário não é system administrator (o que não significa que não tenha permissão de deletar tabelas), mas se nenhum erro aparecer, o hacker poderá fazer a festa.
Voltando um pouco : A eliminação das validações no client Um pouco antes neste artigo mencionei que a validação no client funciona como um desafio ao hacker. São basicamente 2 tipos de validação que atrapalham o trabalho do hacker : A validação em JavaScript e o MaxLength. O hacker, a principio, não tem como fazer a alteração do arquivo no servidor. Invasões do servidor via rede que possibilitariam isso não são o foco de nosso artigo. Mas para fugir das validações no client ele nem precisa fazer isso. A característica básica das validações no client é, óbvio, serem no client. Isso significa que estão rodando na máquina do usuário, o hacker, e não no servidor. O hacker tem domínio sobre o que roda na máquina dele e é isso que faz da validação no client uma validação fraquissima, que nem deveria ser chamada de validação. A primeira coisa que precisa ser feita neste caso é salvar a página na máquina local. Nisso o IE dá um show : basta dar o save e ele organiza tudo. Ele salva o arquivo HTM principal e cria uma sub-pasta com todos os arquivos que a página utiliza, tal como imagens, arquivos .HTM de cada divisão de um frame, etc. Estando tudo salvo o hacker precisa abrir o arquivo .HTM principal no notepad. Se o site utiliza frames não será o arquivo principal, mas uma das partes do frame, ele precisará identificar qual. Não é tarefa muito difícil. Tendo aberto o arquivo, o primeiro passo é fazer com que funcione offline. O formulário de login possui um parâmetro ACTION que normalmente contém um caminho relativo para uma página do site ou, as vezes, nem foi configurado (quando a página realiza POST para ela mesma). O hacker precisa ajustar este parâmetro para que a página que está em sua máquina faça um POST para a página que irá processar o login no servidor. Basta juntar o nome da página existente no Action com o domínio do site e tudo funcionará. Deve-se ter o cuidado de, não havendo action, descobrir o nome da página em questão (que é o nome da página de login) para utiliza-la. Feito isso basta tirar a validação. Veja :
Tendo tirado a validação basta dar duplo clique na página, ela abrirá no explorer. Então todas as validações do client não existirão mais e o hacker poderá prosseguir no passo 2, realizando a invasão.
Solucionando Tudo Sempre ao lidarmos com caracteres reservados de uma linguagem devemos pesquisar de que forma eles poderiam ser representados. O SQL não é uma excessão. O apóstrofo, caracter reservado no SQL, para ser representado precisa ser dobrado. Desta forma quando o banco encontra dois apóstrofos dentro de uma string entende que o que se pretende é inserir (ou consultar, no caso) apenas um e tudo funciona corretamente. Em ASP podemos utilizar a instrução replace para dobrar os apóstrofos digitados pelo usuário. Veja como ficaria a montagem da instrução :
Desta forma não fará diferença para o código o que for digitado, o código fará a busca do que o hacker digitar como se fosse um nome de usuário e o resultado será "usuário inválido". Por isso que quando o hacker recebe a mensagem "usuário inválido" ou continua recebendo uma mensagem de erro padrão após ter tentado o ' or '1'='1 ele desiste do site, pois percebe que o site fez o tratamento dos apóstrofos corretamente. Vale ainda destacar que muitos sites, apesar de não estarem com o bug, estão fazendo o tratamento dos apóstrofos de forma errada, demonstrando desconhecimento técnico por parte dos programadores. O fale conosco do site da Telemar é um exemplo : Não permite a digitação de apóstrofos nos campos do fale conosco. Conde D'eu não conseguiria enviar uma reclamação, nem ninguém da família D'avilla. Espero com este artigo ter assustado suficientemente programadores e gerentes de projeto para que jamais deixem de incluir em seus projetos uma fase de checagem de segurança. Isso que demonstrei aqui é só o início, não anime-se achando que tem a solução de todos os seus problemas : Passagem de parâmetros via Get, campos Hidden, cookies, existem dezenas de pontos falhos possíveis na montagem de um site que exigem que sua segurança seja cuidadosamente testada antes de ir ao ar. Dennes Torres ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .........
Lançamento Búfalo Informática ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Conheça mais sobre o nosso site :
|
|||||||||
|
Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
� Búfalo Informática,
Treinamento e Consultoria -
Rua Ãlvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail: contato@bufaloinfo.com.br