ClickJacking – A falha de Ilusão de Ótica

Faala pessoal, hoje vamos aprender sobre uma falha pouco falada no mundo do Bug Bounty: o Clickjacking ou furto de click.

Primeiro, vamos exemplificar o que é esta falha e depois analisar como ela funciona:

Imagine que você está acessando um site e um surge uma tela dizendo que você acabou de ganhar um Iphone 12 e quando você clica no botão “Pegar meu Iphone”, seu telefone toca e sumiram R$3000,00 de sua conta no banco.

Ok, passado o susto, vamos pensar, como isso aconteceu?

Imagina se fosse possível sobrepor o elemento “Pegar meu Iphone” com o botão de transferência do banco ai quando a vítima clicasse no botão estaria, na verdade, transferindo dinheiro de sua conta, essa é uma possibilidade. Na realidade, não. Isto é exatamente o que ocorreu.

Um hacker fez uso de um site malicioso para aplicar esta falha de “ilusão ótica”, adicionando nele, o site vulnerável neste caso o banco e o seu elemento falso, o botão.

Nos bastidores, temos uma página maliciosa com a seguinte tag HTML:

<iframe src="<https://vulnerable.com>"></iframe>

Ela é usada para inserir uma página dentro de outra, no código acima o atributo src indica a url do site renderizado no iframe, mas as coisas não param por ai, é possível incorporar até arquivos de vídeo e imagem com esta tag, entretanto, neste artigo vamos focar em inserir sites.

Entendido isto, vamos analisar o código completo da página maliciosa:

<!DOCTYPE >
<html>
	<head>
		<style>
			#alvo {
				position: relative
				width: x;
				height: y;
				opacity: 0.00001;
				z-index: 2;
			}
			#conteudo {
				width: c;
				height: b;
				z-index: 1;
			}
		</style>
	</head>
	<body>
		<div id="conteudo">Conteúdo do site</div>
		<iframe id="alvo" src="<https://alvo.com>"> </iframe>
	</body>
</html>

Vamos começar pelo Cascading Style Sheets (CSS), em ambos os seletores há as propriedades width e height, para este exemplo coloquei valores randômicos nelas já que eles variam de cenário para cenário.

Agora vamos para a propriedade opacity seu valor pode variar de 0 até 1 e indica qual a opacidade do elemento, sendo 1 equivalente a totalmente visível e 0 equivalente a invisível.

No nosso exemplo ela foi configurada em um valor muito baixo, pois aqui não queremos que a vítima perceba onde está clicando.

O z-index utilizado por ambos os seletores indica como a posição dos elementos deve estar em relação ao eixo Z, para os que faltaram as aulas de matemática (como eu) este eixo, num plano tridimensional, representa profundidade ou seja com ele é possível sobrepor um elemento com outro, no qual, o maior valor está em cima e o menor, em baixo.

Por fim, #alvo possui a propriedade position configurada em relative, ela deve se utilizada nesta configuração pois, sem ela, a propriedade z-index não funcionaria.

Este código geralmente é utilizado em cenários reais, mas em Bug Bounties as coisas são mais simples basta provar que é possível inserir o iframe do alvo na página maliciosa já que com isto o resto se torna muito simples de ser executado.

Bom, já entendemos o que é e como funciona esta falha, mas onde a encontramos?

Para descobrir onde encontrá-la primeiro vamos descobrir onde ela não está e, para isto, devemos analisar os métodos de proteção usados contra ela de longe o mais usado é o cabeçalho X-FRAME-OPTIONS, de acordo com o site do mozilla ele é usado para indicar quando um documento pode ser inserido em um iframe, de modo geral, ele aceita três valores:

  • Deny: Aqui a página não pode ser inserida em nenhum iframe.
  • Sameorigin: Somente páginas com a mesma origem podem se enquadrar, por exemplo, caso este cabeçalho esteja inserido na página https://example.com somente este a união deste domínio (example.com) com este protocolo (https://) poderão enquadrá-la.
  • Allow-From: Esta ocorrência é obsoleta e não deve ser mais usada, pois muitos navegadores a ignoram ou a removem, caso encontre-a isto pode inciar que a página é vulnerável a clickjacking pois a maioria dos browsers simplesmente a removem da response. Inseri abaixo de como os navegadores a tratam

Bom, entendido o método de proteção contra esta falha imaginar o que fazer para encontrá-la é simples: basta procurar páginas que não contenham este header ou que o possuam, mas configurado erroneamente.

Agora, basta entendermos um exemplo real desta falha e você já estará apto a sair por ai procurando-a nos seus programas.

Eu separei um caso que ocorreu no Twitter, quem o reportou foi o hunter eo420, ele começa seu relatório dizendo que encontrou uma falha nos subdomínios do Twitter chamados https://canary-web.pscp.tv/ e https://canary-web.periscope.tv/, ele diz que ela só ocorre pois o header X-Frame-Options foi configurado no valor ALLOW-FROM, como citado anteriormente, esta configuração indica que, muito provavelmente, o site está vulnerável.

O hunter também anexa o código utilizado, o qual é composto apenas pega tag Iframe, o atributo src com o domínio vulnerável e o atributo frameborder que configurado em 0 indica para navegador não deve traçar fronteira entre o quadro do iframe e os outros quadros.

Como impacto, é falado que pode-se remover ou desabilitar a conta da vítima.

Por fim, quero que se atentem a uma coisa:

Mostrar o real impacto da falha que você esta reportando é muito importante, isto muitas vezes diferencia um report inválido de um bounty, por exemplo, caso esta falha do Twitter somente pudesse ser usada para realizar logout do usuário ela muito provavelmente seria considerada como N/A já que isto não trás nenhum impacto ao programa, então, antes de realizar seu report verifique e comprove como a falha impacta o sistema alvo.

O link para o report pode ser encontrado aqui.

Fontes:

X-Frame-Options, Mozilla. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Headers/X-Frame-Options>. Acesso em: 16 de set de 2021.

filedescriptor,Highly wormable clickjacking in player card, Hackerone, 18 de Maio de 2018. Disponível em:<https://hackerone.com/reports/85624>. Acesso em: 16 de set de 2021

0 Compart.
Twittar
Compartilhar
Compartilhar
Pin