3.7 KiB
Bloqueando a página principal para roubar postmessage
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Ganhar RCs com Iframes
De acordo com este artigo do Terjanq, documentos de blob criados a partir de origens nulas são isolados para benefícios de segurança, o que significa que se você mantiver a página principal ocupada, a página do iframe será executada.
Basicamente, nesse desafio, um iframe isolado é executado e logo após ele ser carregado, a página pai vai enviar uma mensagem post com a flag.
No entanto, essa comunicação postmessage é vulnerável a XSS (o iframe pode executar código JS).
Portanto, o objetivo do atacante é permitir que o pai crie o iframe, mas antes de permitir que a página pai envie os dados sensíveis (flag), mantenha-o ocupado e envie o payload para o iframe. Enquanto o pai está ocupado, o iframe executa o payload que será algum JS que irá ouvir a mensagem postmessage do pai e vazar a flag.
Finalmente, o iframe executou o payload e a página pai deixa de estar ocupada, então ela envia a flag e o payload a vaza.
Mas como você poderia fazer o pai ficar ocupado logo após gerar o iframe e apenas enquanto espera o iframe estar pronto para enviar os dados sensíveis? Basicamente, você precisa encontrar uma ação assíncrona que o pai possa executar. Por exemplo, nesse desafio, o pai estava ouvindo as postmessages assim:
window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});
Então, era possível enviar um grande inteiro em um postmessage que seria convertido em string na comparação, o que levaria algum tempo:
const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);
E para ser preciso e enviar aquele postmessage logo após o iframe ser criado, mas antes de estar pronto para receber os dados do pai, você precisará brincar com os milissegundos de um setTimeout
.