# Iframes in XSS, CSP and SOP {{#include ../../banners/hacktricks-training.md}} ## Iframes in XSS 有3种方式来指示iframe页面的内容: - 通过`src`指示一个URL(该URL可以是跨源或同源) - 通过`src`使用`data:`协议指示内容 - 通过`srcdoc`指示内容 **访问父变量和子变量** ```html ``` ```html ``` 如果您通过 HTTP 服务器访问之前的 HTML(如 `python3 -m http.server`),您会注意到所有脚本都会被执行(因为没有 CSP 阻止它)。**父级将无法访问任何 iframe 内部的 `secret` 变量**,**只有 if2 和 if3(被视为同站)可以访问原始窗口中的 secret**。\ 请注意 if4 被认为具有 `null` 来源。 ### 带 CSP 的 Iframes > [!NOTE] > 请注意,在以下绕过中,响应的 iframed 页面不包含任何阻止 JS 执行的 CSP 头。 `script-src` 的 `self` 值将不允许使用 `data:` 协议或 `srcdoc` 属性执行 JS 代码。\ 然而,即使 CSP 的 `none` 值也将允许执行在 `src` 属性中放置 URL(完整或仅路径)的 iframes。\ 因此,可以通过以下方式绕过页面的 CSP: ```html ``` 注意到**之前的 CSP 仅允许执行内联脚本**。\ 然而,**只有 `if1` 和 `if2` 脚本将被执行,但只有 `if1` 能够访问父级秘密**。 ![](<../../images/image (372).png>) 因此,如果您可以将 JS 文件上传到服务器并通过 iframe 加载,即使 `script-src 'none'`,也有可能**绕过 CSP**。这也可以**通过滥用同站 JSONP 端点来实现**。 您可以通过以下场景进行测试,即使在 `script-src 'none'` 的情况下也会窃取 cookie。只需运行应用程序并使用浏览器访问它: ```python import flask from flask import Flask app = Flask(__name__) @app.route("/") def index(): resp = flask.Response('') resp.headers['Content-Security-Policy'] = "script-src 'self'" resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET' return resp @app.route("/cookie_s.html") def cookie_s(): return "" if __name__ == "__main__": app.run() ``` ### 在野外发现的其他有效载荷 ```html ``` ### Iframe sandbox iframe 中的内容可以通过使用 `sandbox` 属性受到额外限制。默认情况下,此属性不适用,这意味着没有限制。 使用时,`sandbox` 属性会施加几个限制: - 内容被视为来自唯一来源。 - 任何提交表单的尝试都被阻止。 - 禁止执行脚本。 - 禁用对某些 API 的访问。 - 防止链接与其他浏览上下文交互。 - 禁止通过 ``、``、`` 或类似标签使用插件。 - 防止内容自身导航到其顶级浏览上下文。 - 自动触发的功能,如视频播放或表单控件的自动聚焦,被阻止。 属性的值可以留空(`sandbox=""`)以应用上述所有限制。或者,可以设置为以空格分隔的特定值列表,以使 iframe 免于某些限制。 ```html ``` ## SOP中的Iframes 检查以下页面: {{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md {{#endref}} {{#ref}} ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md {{#endref}} {{#include ../../banners/hacktricks-training.md}}