概念
内容安全策略(Content Security Policy 简称 CSP)是一种额外的安全层,用于检测和减轻某些类型的攻击,如跨站脚本攻击( XSS )和数据注入攻击等。
CSP通过限制外部资源的来源达到增强网页安全性的问题,实质上就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载,有助于防止恶意脚本执行以及非授权内容的加载,如果网站不提供CSP标头,浏览器也使用标准的同源策略。
通过使用Content-Security-Policy ,网站可以控制用户代理如何执行页面的特定部分,这可以显著减少XSS攻击的风险
CSP指令
default-src : 设置默认加载资源的策略(例如,自身的源、任何地方的源、或者不加载任何外部资源)
script-src : 定义哪些脚本可以执行, 例如script标签, a标签的javascript:location.href="" 等
style-src : 定义哪些样式表可以加载。
img-src : 定义哪些图片资源可以加载。
connect-src : 限制可以通过脚本接口进行连接的URL(例如,AJAX请求、WebSocket)
font-src : 定义哪些字体资源可以加载。
object-src : 限制可以加载哪些插件(例如,Flash、based、XSS)
media-src : 定义哪些媒体资源(音频和视频)可以加载
frame-src : 定义哪些iframe可以加载
base-uri : 用于控制base标签能加载的资源范围
child-src : 用于控制子页面加载
connect-src : 定义请求连接文件的过滤策略
form-action:限制form的action
report-uri : 拦截并报告CSP违规
report-sample : 指外界尝试XSS攻击时或有脚本触发了违例,浏览器会异步将payload的前40个字节POST给 report-uri 对应的链接
CSP取值
* : 星号表示允许任何URL资源,没有限制
'self' 同源策略,即允许同域名同端口下,同协议下的请求
'unsafe-inline' 允许行内代码执行
'unsafe-eval' 允许不安全的动态代码执行,比如JavaScript的eval()方法
https: 只允许通过https协议加载资源
data:base64 允许通过data来请求咨询 (比如用Base64 编码过的图片)
nonce: 每次HTTP回应给出一个授权token,页面内嵌脚本必须有这个token,才会执行,设置值为:'nonce-12345678'
<script nonce="nonce">alert(123)</script>
hash: 列出允许执行的脚本代码的Hash值,页面内嵌脚本的哈希值只有吻合的情况下,才能执行
'sha265-a40fdfd7e1641939698cc595e2568033970a0750a98e85fa7996ea4859ee28be'
<script>alert(123)</script>
CSP开启
后端开启
header("Content-Security-Policy: script-src 'self'");
header("Content-Security-Policy: script-src 'self' http://192.168.88.128");
header("Content-Security-Policy: script-src 'self' http://192.168.88.128 'unsafe-inline'");
header("Content-Security-Policy: script-src 'self' 'unsafe-inline';img-src 'self';");
前端开启 HTML中配置\
<meta http-equiv="Content-Security-Policy" content="default-src 'self' http://www.dlrb.com 'unsafe-inline'" >
<meta http-equiv="Content-Security-Policy" content="img-src 'self' http://www.wowo.com">
<meta http-equiv="Content-Security-Policy" content="style-src 'self' 'unsafe-inline'">
<meta http-equiv="Content-Security-Policy" content="child-src 'none';">
注意,使用\标签设置CSP的方法存在一些限制
1. 无法使用某些指令,如frame-ancestors和report-uri
2. 对于由多个页面组成的网站,每个页面都需要包含一个<meta>标签,这可能会导致维护上的困难
3. 与HTTP头设置相比,这种方法可能会更容易遭受某些攻击方式,因为恶意用户可能会尝试注入标签来覆盖你的CSP规则
总的来说,虽然在HTML中设置CSP是可能的,但出于维护和安全性的考虑,通常建议通过HTTP头来设置CSP
CSP全局开启
apache应用服务器的配置文件,路径 /opt/lampp/etc/httpd.conf
配置如下内容
Header set Content-Security-Policy "default-src 'self';"
配置修改需要重启服务器
局部配置可以覆盖全局配置,但是远程的JS文件局部配置无法覆盖,它只能覆盖本地JS的配置
CSP实战
所有内容均来自站点的同源 (不包括其子域名)
header("Content-Security-Policy: default-src 'self'");
只允许加载当前域的JS
header("Content-Security-Policy: script-src 'self' 'unsafe-inline'");
这表示只能从当前源和 https://192.168.88.166 加载和应用样式
header("Content-Security-Policy: style-src 'self' http://192.168.88.166 'unsafe-inline'");
浏览器只允许加载来自当前源,data: URLs,以及 https://192.168.88.166 的图像
header("Content-Security-Policy: img-src 'self' data: http://192.168.88.166");
CSP报告
拦截并报告CSP违规(常用)
添加 report-uri 指令
<?php
header("Content-Security-Policy: default-src 'self'; report-uri /csp-violation-report-endpoint.php");
?>
CSP绕过
低级绕过
查看低级的CSP配置
没有配置 unsafe-inline ,不允许行内代码执行,只能通过远程网址下手,这几个网址访问不了,我们用 hosts 文件伪造,在攻击服务器创建JS文件,开始进行 XSS 注入
查看注入点
绕过
只要在地址栏输入 https://pastebin.com/woniu/js/hook.js 即可
中级绕过
查看中级的CSP配置
配置了 unsafe-inline ,允许行内代码执行,但是有 nonce 指定的值,我们只需要内嵌该值即可绕过
查看注入点
绕过
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(123)</script>
高级绕过
查看高级的CSP配置
查看注入点
点击按钮后有一个jsonp的请求继续查找
绕过
Burp抓包,抓jsonp.php这个包,并修改callback
其他安全响应头
session的cookie安全配置
局部设置
<?php ini_set("session.cookie_httponly",1)?>
全局设置
修改 /opt/lampp/etc/php.ini 中 session.cookie_httponly 的值为 On
个性化cookie
setcookie("mycookie", "123", time() + 36000, "/", "www.dlrb.com", false, false);