# 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` 能够访问父级秘密**。 .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 的访问。 - 防止链接与其他浏览上下文交互。 - 禁止通过 `