使用磁盘缓存的一次性使用数(Nonce)内容安全策略(CSP)绕过 | 约里安·沃尔特杰

本文详细介绍了在非随机数(nonce)基于的内容安全策略中绕过的方法,通过一个小型 XSS 挑战来展示其可能出现的问题及解决步骤。

  • 挑战内容:包含简单登录表单,设置namecookie,登录后跳转到仪表盘页面,仪表盘页面有通过<meta http-equiv>标签定义的Content-Security-Policy,包含随机生成的nonce值,用于限制脚本执行,防止 XSS 攻击,但存在 XSS 漏洞可被利用。
  • CSP 非随机数与缓存:探讨了 CSP 非随机数与缓存机制的交互问题,非随机数在可缓存页面中可能多次返回给用户,若恶意 HTML 包含在缓存响应中,攻击者无法更改而使页面重新渲染获取新的非随机数,若非随机数和 XSS 有效负载分别交付且可缓存,攻击者可读取非随机数并将其包含在有效负载中使其成功执行。
  • CSS 注入泄露非随机数:通过 CSS 注入来泄露nonce值,由于 CSP 不阻止<style>标签和外部样式表,可利用CSS 注入来潜在地泄露页面部分内容,通过匹配nonce属性或meta标签的content属性来实现,还提到了在特定浏览器(如 Chrome)中可使用 CSS attr()函数来一次性泄露整个非随机数值。
  • 登录 CSRF:在反射型 XSS 中,有效负载与非随机数相关,而此挑战中有效负载来自获取/profile,可通过登录 CSRF 利用/login处理程序的漏洞来更改有效负载,如使用<form>进行 CSRF 攻击,并解决<script>标签插入时不执行的问题。
  • 磁盘缓存与 bfcache:介绍了浏览器的 Back/forward 缓存(bfcache)和磁盘缓存,通过history.back()history.go(n)函数可调用缓存,当 bfcache 检查失败时会回退到磁盘缓存,利用此特性可使页面加载快速且包含旧的非随机数,同时更新/profile的有效负载,但要注意 Chrome 的缓存分区机制,不同实体的请求缓存不同,可通过添加查询参数来解决。
  • 结论:发现磁盘缓存是一个很有趣的概念,可通过触发 bfcache 强制从磁盘缓存加载任何页面,同时提到了一些在实际场景中可能遇到的问题,如nonce的不同反射位置、更复杂的缓存和未缓存更新组合以及利用登录/CSRF 技术更改有效负载等。

总之,本文详细阐述了在特定场景下利用各种技术绕过 CSP 非随机数限制实现 XSS 攻击的过程及相关细节。

阅读 16
0 条评论