CSP——Content Security Policy

大佬光辉照耀我-学习链接

百度百科:CSP指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略(CSP)的一般概念。这将引入一些相当严格的策略,会使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。

Content Security Policy 最早在firefox 23中实现,当时使用的是 X-Content-Security-Policy,它使用了前置词的内容安全性策略,并以W3C CSP1.0规范作为标准。

按照我的理解,CSP就是高级白名单机制,并且限制了网站的很多访问行为。

CSP编写网站:https://www.cspisawesome.com/

CSP语法以及范例

header("Content-Security-Policy:

default-src 'none';

connect-src 'self';

frame-src 'self';

script-src xxxx/js/

'sha256-KcMxZjpVxhUhzZiwuZ82bc0vAhYbUJsxyCXODP5ulto='

'sha256-u++5+hMvnsKeoBWohJxxO3U9yHQHZU+2damUA6wnikQ=' ;

font-src xxxx/fonts/ fonts.gstatic.com;

style-src xxxx/css/ fonts.googleapis.com;

img-src 'self'

");

有那么一丢丢长....里面包括了各种各样的写法:

1、none和self,none代表什么都不匹配,self代表匹配同源的来源

2、https://xxx/js/匹配目录下所有文件,https://xxx/js/file.js匹配特殊文件

3、第三种是类似于https:,会匹配所有包含这个特殊的格式的来源。

4、也有可能是example.com这样的,会匹配所有这个host的来源,或者会有*.example.com,会匹配这个host的所有子域。

5、第五种是类似于nonce-qwertyu12345会匹配一个特殊的节点。

6、当然还有加密过的类似于sha256-abcd…同样会匹配页面中一个特殊的节点(每次修改这个值都会改变)。

感觉下面这个是一个比较详细的字段说明

serialized-source-list = ( source-expression *( RWS source-expression ) ) / "'none'"

source-expression = scheme-source / host-source / keyword-source

/ nonce-source / hash-source

; Schemes:

scheme-source = scheme ":"

; scheme is defined in section 3.1 of RFC 3986.

; Hosts: "example.com" / "*.example.com" / "https://*.example.com:12/path/to/file.js"

host-source = [ scheme-part "://" ] host-part [ port-part ] [ path-part ]

scheme-part = scheme

host-part = "*" / [ "*." ] 1*host-char *( "." 1*host-char )

host-char = ALPHA / DIGIT / "-"

port-part = ":" ( 1*DIGIT / "*" )

path-part = path

; path is defined in section 3.3 of RFC 3986.

; Keywords:

keyword-source = "'self'" / "'unsafe-inline'" / "'unsafe-eval'"

; Nonces: 'nonce-[nonce goes here]'

nonce-source = "'nonce-" base64-value "'"

base64-value = 1*( ALPHA / DIGIT / "+" / "/" / "-" / "_" )*2( "=" )

; Digests: 'sha256-[digest goes here]'

hash-source = "'" hash-algorithm "-" base64-value "'"

hash-algorithm = "sha256" / "sha384" / "sha512"

CSP属性

大佬的文章讲的很好很好,这里不转载赘述啦,总之就是不同属性的对应不同属性请求作用规则。

图片简单说明

不同的配置参数

Bypass CSP

xxxx-src *

这个规则里的*符号表示,允许除了内联函数以外所有的url式的请求,这基本上就随意开火了。

xxxx-src self

一般来说,self代表只接受符合同源策略的url,这样一来,大部分的xss和crsf都会失效,有个标签比较例外,虽然已经被加入的现在的csp草案中,但是的确还没有施行(这里的现在大概是16年,现在可不好说)。

这种请求在firefox上会被拦截(除非同源),其余的现在不好说

此外,也可以在当前域上传,如果有上传,直接加载就行了,完全么有限制。

攻击范例

不知道有多少人了解过cctf2016,其中有一道web题目IDS-Chicken

题目环境就符合我说的情况,CSP滴水不漏,几乎没办法用任何方式构造xss,但是内网存在上传点,上传文件会被重写为文件,link包含形成xss漏洞。

script-src 'unsafe-inline'

如果加上这个参数,就不会阻止内联脚本,但这被认为是不安全的。

对于这个属性有个特殊的配置叫unsafe-eval,他会允许下面几个函数

eval()

Function()

setTimeout() with an initial argument which is not callable.

setInterval() with an initial argument which is not callable.

我们先尝试构造payload

payload

可以明显的看到被拦了

拦截信息

但是我们尝试构造内联脚本

内联脚本

能看到成功执行

结果

由于同源策略,这个请求不能发往别的域下,但是实战环境中利用方式很多,就比如这个聊天版,可以通过发给别的用户的方式get cookie

var xmlhttp=new XMLHttpRequest();

xmlhttp.open("POST","submit.php",true);

xmlhttp.setRequestHeader(_Ctent-type_,_applicati/x-www-form-urlencoded_);

xmlhttp.send(_to=lorexxar&&message=_+document.cookie);

;

302 Bypass CSP

来源:https://lorexxar.cn/2016/10/31/csp-then2/

首先要意识到如果我们构造一个重定向,就可以bypass CSP的域限制

测试页面(test.php):

header("Content-Security-Policy: script-src http://127.0.0.1/ http://xss.cc/the_only_allow_dir/");

?>

csp header test

整个站都在/test/下,/test/js/下包含正常的js.

条件一:必须有可以重定向的页面

假设第一个域下的某个位置有个可以定义重定向的页面,比如

这里测试的时候写在了根目录下,不过是要是域内允许的任何为之都可以,这样的功能一般多出现在登陆页面

条件二:我们需要一个被允许的域

比如 http://127.0.0.1/ 里一般会有js目录被允许,然后可能存在upload域可以上传一个js。这里我们允许了http://xss.cc/the_only_allow_dir/这个域,然后在http://xss.cc/myjs/a.js里面写入js内容,比如 alert(2333)这种。

然后访问测试页面(test.php),就会重定向过去。

其它Bypass方式

CSP困境以及升级

csp php,CSP学习笔记(持续学习更新)相关推荐

  1. 机器学习学习笔记-持续学习(Continual Learning/ Life-long Learning)

    任务: 将旧任务学习的知识应用到新的任务上,同时在旧任务上的表现不会出现太大的损失. 问题: (1)将旧任务的知识利用,从而更快适应新任务. (2)在学习新任务的同时在旧任务上的表现不会出现太大下降. ...

  2. 大前端学习笔记--持续随缘更新

    前端知识&HTML常用标签 20200210 1.浏览器及内核介绍: chrome谷歌:特点--简洁.快速.安全内核--webkit,Blink费用--收费前缀-- -webkit- Fire ...

  3. 重拾CCNA,学习笔记持续更新ing......(4)

    重拾CCNA,学习笔记持续更新ing......(4) 路由器作用功能的经典解说(笑)(非原创) 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大 ...

  4. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  5. ① ESP8266 开发学习笔记_By_GYC 【更新 ets_printf 函数 使ESP_IDF 能够支持浮点数打印】

    ① ESP8266 开发学习笔记_By_GYC [更新 ets_printf 函数 使ESP_IDF 能够支持浮点数打印] 在我们日常的开发过程中,经常使用到的一个功能就是串口打印功能.在ESP826 ...

  6. SilverLight学习笔记--进一步学习Isolated Storage独立存储一(理论篇)

    在"silverlight如何在客户端读取文件"以及"silverlight如何在客户端写入文件"两篇文章中我们初步接触了Isolated Storage概念. ...

  7. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  8. 强化学习笔记-强化学习概述

    强化学习笔记-强化学习概述 机器学习分类 强化学习与监督学习的异同点 强化学习基本原理 强化学习解决的是什么样的问题 强化学习分类 请分别解释随机性策略和确定性策略 回报.值函数.行为值函数三个指标的 ...

  9. Admin.NET管理系统(vue3等前后端分离)学习笔记--持续更新

    我的学习笔记 - 9iAdmin.NET 欢迎学习交流 (一)前端笔记 1.1 关于.env的设置 1.2 关于路由模式问题 1.3 关于 vue.config.ts 1.4 关于 打包(pnpm r ...

最新文章

  1. 下载r包IlluminaHumanMethylation450kanno.ilmn12.hg19
  2. 老男人面试第四家第五家-初创公司和b轮公司
  3. python 网络相关依赖库 dpkt、scapy、pcap 安装
  4. UVA11464偶数矩阵
  5. Python之sklearn:LabelEncoder函数简介(编码与编码还原)、使用方法、具体案例之详细攻略
  6. 面向对象开发===继承特点
  7. OpenCV | OpenCv常用函数(代码类)
  8. mysql php加速_mysql存储过程加速 - mysql数据库栏目 - 自学php
  9. struts2原理分析之反射技术动态获取属性
  10. 按自己喜欢的方式过一生?
  11. python时间差转换成天数_Python实现计算两个时间之间相差天数的方法
  12. python3-day4(装饰器)
  13. 七、Framework类库
  14. (201)数字6种表示方式
  15. Windows Server 2012 禁止使用Ctrl+Alt+Del 以及禁止开机启动服务器管理器
  16. Mastermind游戏
  17. nacos整合springmvc:解决使用@Value或@NacosValue无法从nacos配置中心动态获取最新配置数据问题
  18. 北斗GPS同步时钟(授时系统)技术原理详解
  19. 开发容器式微服务的第一步
  20. 解决联想ThinkPad 小红点键盘4X30K12182 多功能蓝牙键盘掉线问题

热门文章

  1. Android中minSdkVersion、targetSdkVersion、maxSdkVersion的作用
  2. Java的synchronized关键字:同步机制总结
  3. 【LaTeX】E喵的LaTeX新手入门教程(6)中文
  4. Python-OpenCV 杂项(二)(三): 鼠标事件、 程序性能的检测和优化
  5. 浅谈机器学习的职业发展方向
  6. TCP 的那些事儿(上)
  7. dllinject使用
  8. 数据库分库分表(持续更新中)
  9. VMware安装MikroTik RouterOS chr
  10. DirectX视口变换矩阵详解