4.4 KiB
Blocking main page to steal postmessage
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Winning RCs with Iframes
이 Terjanq writeup에 따르면, null origin에서 생성된 blob 문서는 보안상의 이점으로 격리되어 있으며, 이는 메인 페이지가 바쁘면 iframe 페이지가 실행된다는 것을 의미합니다.
기본적으로 이 도전에서 격리된 iframe이 실행되고 바로 로드된 후 부모 페이지가 플래그와 함께 post 메시지를 보냅니다.
그러나 그 postmessage 통신은 XSS에 취약합니다( iframe이 JS 코드를 실행할 수 있습니다).
따라서 공격자의 목표는 부모가 iframe을 생성하게 하되, 부모 페이지가 **민감한 데이터(플래그)**를 보내기 전에 바쁘게 유지하고 payload를 iframe으로 보내는 것입니다. 부모가 바쁠 때 iframe은 payload를 실행하며, 이는 부모 postmessage 메시지를 듣고 플래그를 유출하는 JS가 될 것입니다.
마지막으로, iframe이 payload를 실행하고 부모 페이지가 바쁘지 않게 되면, 플래그를 보내고 payload가 이를 유출합니다.
하지만 부모가 iframe을 생성한 직후에 바쁘게 만들고, 민감한 데이터를 보내기 위해 iframe이 준비되기를 기다리는 동안 어떻게 할 수 있을까요? 기본적으로 부모가 실행할 수 있는 비동기 작업을 찾아야 합니다. 예를 들어, 이 도전에서 부모는 다음과 같이 postmessages를 듣고 있었습니다:
window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});
그래서 postmessage에서 큰 정수를 보내는 것이 가능했으며, 이는 그 비교에서 문자열로 변환될 것이고, 시간이 좀 걸릴 것입니다:
const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);
정확하게 postmessage를 iframe이 생성된 후에, 그러나 부모로부터 데이터를 받을 준비가 되기 전에 setTimeout의 밀리초를 조정해야 합니다.
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.