本文详细介绍了在非随机数(nonce)基于的内容安全策略中绕过的方法,通过一个小型 XSS 挑战来展示其可能出现的问题及解决步骤。
- 挑战内容:包含简单登录表单,设置
name
cookie,登录后跳转到仪表盘页面,仪表盘页面有通过<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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。