本文详细介绍了在非随机数(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)中可使用 CSSattr()函数来一次性泄露整个非随机数值。 - 登录 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 攻击的过程及相关细节。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。