Segurança das aplicações Web. Vulnerabilidade Target="_blank
Lukasz Kolko
A utilização de aplicações Web tornou-se um lugar-comum para todas as sociedades. Lidamos com elas todos os dias. Podemos dizer que nos rodeiam. Utilizamo-las no trabalho, para nos divertirmos e como ferramentas de comunicação com os outros. Muitas vezes, como utilizadores e como programadores, não nos apercebemos de quantas vulnerabilidades de segurança são descobertas todos os dias nessas aplicações.
A vulnerabilidade discutida neste documento foi com nós há muito tempo e, devido à sua simplicidade, é frequentemente subestimado ou mesmo desconhecido por alguns criadores de aplicações web.
Quase todas as aplicações Web contêm ligações que, quando clicadas, abrem num novo separador para não fechar o separador com a página original. Este é um comportamento preferido porque os criadores querem que o utilizador passe o máximo de tempo possível na aplicação.
Um ataque que explora esta vulnerabilidade é o chamado "reverse tabnabbing". Trata-se de um ataque em que uma página ligada a partir da página de destino é capaz de substituir essa página, por exemplo, por um sítio de phishing.
Cenário de ataque
Suponhamos que a vítima utiliza o Facebook, que é conhecido por abrir ligações através de target="_blank",
Criar uma página viral falsa,
Criar um sítio Web de phishing que se pareça com a página de início de sessão do Facebook,
Colocar o seguinte código na página viral, por exemplo, através de uma vulnerabilidade XSS encontrada window.opener.location = 'https://phishing-website/facebook.com';
A vítima clica na ligação no Facebook para a página viral,
A página viral redirecciona o separador do Facebook para o site de phishing, pedindo ao utilizador para iniciar sessão novamente.
Assim, podemos alterar o separador principal da página de destino infetada através de um objeto de janela da API Web. Normalmente, um ataque envolve a utilização de várias vulnerabilidades descobertas e esquemas de phishing em paralelo.
O problema
Quando abrimos um novo separador no browser utilizando uma ligação com o target="_blank" temos acesso ao nosso "referenciador" a partir do novo separador. Mais especificamente, ao atributo abridor propriedade do Janela que devolve uma referência à janela que o abriu, a nossa página-mãe.
Isto deve-se ao comportamento do Janela.open() função. Com acesso a este atributo, podemos facilmente substituir a nossa página-mãe. Note que alguns navegadores modernos podem fazer com que o janela.abridor função no separador de destino como nulo para evitar este comportamento.
Exemplo de código
<code> <a href="https://github.com" target="_blank">Ir para o GitHub - ligação infetada</a>const
se (link)
link[0].onclick = () => {
if (window) window.opener.location = 'https://stackoverflow.com'
}
Acima pode ver a ligação infetada que, originalmente, abre um novo separador com uma página do GitHub mas, entretanto, altera a nossa página "mãe" para o site Stackoverflow.
Exemplo em direto
1. Ligações HTML
Adicionar rel="noopener noreferrer" para o <a> tag.
O rel define a relação entre um recurso ligado e o documento atual.
noopener diz ao browser para navegar para o destino sem conceder acesso ao pai que o abriu. Separador de destino Janela.abridor será nulo.
noreferrer impede que o navegador, ao navegar para o destino, envie para o pai o endereço ou qualquer outro valor como referenciador através do referenciador Cabeçalho HTTP. Note-se que o nome deste cabeçalho HTTP está intencionalmente mal escrito como "referrer".
Para o JavaScript Janela.abrir é possível adicionar os valores noopener e noreferrer no windowFeatures do parâmetro Janela.abrir mas os diferentes browsers podem responder de forma diferente, pelo que se recomenda fazer Janela.abridor como nulo depois de utilizar Janela.open() função.