在PayPal中查找DOMPolyglotXSS的简单方法( 二 )


接下来 , 我们研究了 Bootstrap gadget 。 GitHub 上存在一些 XSS 问题 , 但这些影响了 3.4.0 版本 。 我们查看了 Bootstrap 代码一段时间 , 寻找 jQuery 的使用情况 , 但没有找到合适的 gadget 。
我们没有在数据库中找 gadget , 而是想到了 PayPal gadget 。 如果 PayPal 有一些我们可以利用的不安全 JavaScript , 那岂不是更好 。 这一次 , 我们没有搜索特定的库 , 而是搜索托管库的路径的一部分(例如 “/c979c6f780cc5b37d2dc068f15894/js/lib/”) 。 在搜索结果中 , 我们注意到一个名为 youtube.js 的文件 , 并立即在其中发现了一个明显的 DOM XSS 漏洞:
这个文件使用的是 jQuery , 所以我们所需要做的就是包含 jQuery 和 youtube.js , 利用这个漏洞 , 然后我们绕过了 CSP 。 看看 YouTube .js 文件 , 我们看到它使用了一个 CSS 选择器来找到 YouTube 播放器元素:
因此 , 我们需要注入一个带有 “youtube-player” 类的元素和一个包含 jQuery XSS 向量的 data-id 属性 。 一旦我们有了通用 PayPal CSP 绕过的基础 , 要做的就是把它与原始注入结合起来 。 首先 , 我们注入了一个带有 srcdoc 属性的 iframe 。 这是因为我们想注入一个外部脚本 , 但因为这是一个基于 DOM 的漏洞 , 脚本将无法执行 。 但是有了 srcdoc , 会发生以下情况:
请注意 , 我们需要通过转义双引号并为选择器的值部分分配单引号来确保它是一个有效的选择器 。 然后再注入指向 jQuery 和 YouTube gadget 的脚本:

在PayPal中查找DOMPolyglotXSS的简单方法

文章插图
请注意 , 我们必须对向量进行 HTML 编码 , 因为我们不希望它以>字符关闭 srcdoc 属性 。 出于同样的原因 , 我们避免使用空格 。 然后我们使用 YouTube gadget 注入脚本 , jQuery 会转换并执行该脚本 。 我们再次需要对向量进行 HTML 编码 , 给它正确的类名 , 并使用 data-id 属性来注入我们的向量 。 注意 , 我们使用了一个编码的单引号来避免属性中断 。 我们必须对双引号进行 HTML 编码 , 因为 srcdoc 将解码 HTML , 而 data-id 属性将在 iframe 中呈现时进行解码 , 因此双编码可确保引号在注入 YouTube gadget 时存在 。 最后 , 我们使用单行注释进行清理 , 以确保脚本在注入后忽略任何内容 , 即用双引号和单引号完成 CSS 选择器 。
可以在此处找到最终的概念证明 。
概念证明
这是 PoC 的截图:
在PayPal中查找DOMPolyglotXSS的简单方法

文章插图
可以看到对所有 PayPal 的完整 CSP 绕过 , 但它是必要的吗 ? 正如我们所见 , jQuery 是 CSP 的克星 。 它使用 “unsafe-eval” 指令转换脚本 , 并且很乐意使用策略执行它们 。 看看原始的 XSS 漏洞 , 它似乎是一个 jQuery 选择器 。 因此 , 我们可以注入一个脚本 , 它将被 jQuery 转换 。 所以不需要单独的 CSP 绕过 。 因此 , 我们可以将注入简化为以下内容:
完整的概念证明请点此 。
总结
允许列表策略绝对是不安全的 , 尤其是当你有大量可能被滥用的脚本 / 库时 。 即使用户输入通常不需要 , 也要修复 XSS , 这有助于防止意外的脚本 gadget 。
你永远不应该仅仅依靠 CSP 来保护 XSS 。 虽然这是你防御的一部分 , 但它不是唯一可用的障碍 。


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。