同源策略是一种约定, 他是浏览器最核心也是最基本的安全功能。如果缺少了同源策略, 浏览器的正常功能可能会受到影响, 比如XSS、CSRF攻击等。
浏览器的同源策略, 限制了来自不同源的"document" 或者脚本, 对当前的"document"读取或设置某些属性。.
这一策略极其重要, 设想一下, 如果没有同源策略, 可能 example1.com 的一段JavaScript脚本, 在example2.com未曾加载此脚本时, 也可以随意涂改example2.com的页面, 为了不让浏览器的页面行为发生混乱, 浏览器增加了"Origin"(源)这一概念, 来自不同Origin的对象无法相互干扰。
在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技术, 是一种无需脚本即可窃取页面内容的技术,它使用图像等资源(结合CSP运行的策略)将数据发送到攻击者控制的远程位置。当反射型XSS不工作或被内容安全策略(CSP)阻止时,它非常有用。其思想是插入一些未完成状态的部分HTML,例如图像标记的src属性,页面上的其余标记关闭该属性,但同时将两者之间的数据(包含窃取页面的内容)发送到远程服务器。
例如,我们在反射型XSS注入点上注入这样一个img标签:

发现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
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 页面:
最后将此页面发送给受害者即可自动完成修改邮箱的攻击: