hacktricks/pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md
2024-02-10 21:30:13 +00:00

4.7 KiB

메인 페이지 차단하여 postmessage 도용하기

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

Iframes로 RC 획득하기

Terjanq의 writeup에 따르면, null 원본에서 생성된 blob 문서는 보안상의 이점을 위해 격리되어 있습니다. 이는 즉, 메인 페이지를 계속 유지하면 iframe 페이지가 실행될 것이라는 것을 의미합니다.

이 도전에서는 격리된 iframe이 실행되고, 그 로딩이 완료된 직후부모 페이지가 플래그를 포함한 post 메시지를 보냅니다.
그러나, 이 postmessage 통신은 XSS에 취약합니다 (iframe에서 JS 코드를 실행할 수 있음).

따라서, 공격자의 목표는 부모가 iframe을 생성하도록 하되, 부모 페이지가 민감한 데이터(플래그)를 보내기 전에 바쁘게 유지하고 페이로드를 iframe으로 보내는 것입니다. 부모가 바쁜 동안 iframe은 페이로드를 실행하며, 이는 부모 postmessage 메시지를 수신하고 플래그를 유출할 JS 코드입니다.
마지막으로, iframe이 페이로드를 실행하고 부모 페이지가 바쁨을 멈추면 플래그가 전송되고 페이로드가 이를 유출합니다.

그러나, 부모가 iframe을 생성한 직후에 바쁘게 유지하고 iframe이 준비되어 민감한 데이터를 보낼 때까지 어떻게 할 수 있을까요? 기본적으로, 부모가 실행할 수 있는 비동기 작업을 찾아야 합니다. 예를 들어, 이 도전에서는 부모가 다음과 같은 postmessage청취하고 있었습니다:

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의 밀리초를 조절해야 합니다.

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!