概述
CPS即内容安全策略,实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。
开启方法
抄录于这里
两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。
1
2Content-Security-Policy: script-src 'self'; object-src 'none';
style-src cdn.example.org third-party.org; child-src https:另一种是通过网页的
<meta>
标签
1 | <meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"> |
上面代码中,CSP 做了如下配置。
- 脚本:只信任当前域名
<object>
标签:不信任任何URL,即不加载任何资源- 样式表:只信任
http://cdn.example.org
和http://third-party.org
- 框架(frame):必须使用HTTPS协议加载
- 其他资源:没有限制
启用后,不符合 CSP 的外部资源就会被阻止加载。
安全等级为Low
结论:攻击失败,原因分析在下面有说明
源代码分析
从源码查看设置了headerCSP,可以知道以下语句可以被执行:
1 | https://pastebin.com |
f12查看当前页面请求,也能发现CSP的设置
开始攻击
首先在https://pastebin.com/
里边创建一个JavaScript代码alert("hahaha")
保存记住链接
点击右上角的raw
得到了分享链接:https://pastebin.com/raw/PgTLeSd2
把得到的链接输入输入框中
发现无论是否挂梯子,都不会弹出提示框,经过抓包分析,单独在浏览器中请求:https://pastebin.com/raw/PgTLeSd2成功,输入到文本框中后**发现有跨域问题,暂时不知如何解决**
下图就是执行pastebin的请求,虽然请求响应为200,但是无任何响应数据
打开Console发现出现类似于跨域报错问题
安全等级为Medium
源码分析
- unsafe-inline:当csp有Unsafe-inline时, 并且受限于csp无法直接引入外部js, 不过当frame-src
为self, 或者能引入当前域的资源的时候, 即有一定可能能够引入外部js。 - nonce-source,仅允许特定的内联脚本块。如源码中:
nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='
开始攻击
直接输入:<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
安全等级为High
源码分析
后台代码
这里可以看到除了自身,其余的外部资源全部过滤了
前端js
前端直接调用了一个回调函数solveSum,没有对此传参进行任何处理
开始攻击
谷歌浏览器按f12,打开source页签,找到high.js文件,加个断点,修改callback参数为alert(document.cookie)
,记得按ctrl+s
保存修改
点击页面上的按钮
点击继续运行按钮
出现弹框
安全等级为
源码分析
前端没有回调函数了
本文主要操作步骤来源这里