-
-
[原创]XSS修炼之-内功心法CSP篇
-
发表于: 2021-5-8 11:17 4755
-
前段时间在挖XSS漏洞的时候遇到了CSP,费了些功夫总算是绕过了,于是就想着这个可以出几道XSS挑战来分享给大家。
原来的题目在这里,总共有三道
公布答案之前先了解一下CSP的基础知识
CSP是浏览器内容安全策略(Content-Security-Policy)的简称,主要是用来限制网页资源的加载,包括script、img、iframe等。
- CSP的设置方法
通过iframe的csp属性
<iframe csp="script-src 'self'" src="11.php"></iframe>
但是如果设置的时候域名不同就需要被设置的页面设置
Allow-CSP-From: http://127.0.0.1否则会出现
优先级是 服务端返回CSP属性>继承的CSP属性>iframe csp>meta头 ,但是必须同时满足才能加载成功!不存在覆盖CSP设置一说,实际上他们是叠加关系
report-uri用于触发规则后的报告接收地址,该地址不受CSP限制,但是只有服务端返回的设置才会生效,因此不要想利用report-uri在极端情况下回传数据,不过我只测试了chrome其他浏览器暂未测试。
- 安全问题
CSP这个策略实际上很好,可以很好的控制页面的访问,出现问题大部分是由于CSP的误用导致的。而且由于CSP策略是页面级的策略,很多资源可能默认不会有CSP策略,也可以利用这个策略做一下CSP的绕过。
第一题分析
因此很明显只能加载本地域的的js,其他外域资源都是不允许的,正好jsonn.php?call=call提供了这样的js
尝试连接
可以发现<script被替换为_了,我们可以利用iframe的srcdoc加html实体编码绕过这样的限制
最终POC为
第二题分析
第一个文件CSP限制太多,无法执行js,第二个文件有长度限制,看起来只能直接alert也不满足要求,肯定是要两者结合了
由于刚开始没有考虑到top.name的问题,二哥(gainover)给了一个很巧妙的答案,是超出我预期的,于是后来逼我加了一个window.name=""。
没多久二哥(不愧是二哥啊)又给了一个超出我预期的答案……
大家可能会好奇,name不是被置空了吗?
这里有一个小知识点
在on属性的js的上下文里面 eval(name),之前的浏览器识别为window.name,现在的浏览器识别为document.name,因此现在利用name跨域必须要eval(self.name),但是在js的上下文里面eval(name)还是识别为eval(window.name)
eval(top.name),实际上是top.window.name这里window.name被置空了,所以不行了
而eval(top.x.name),得到的实际上是eval(top.document.getElementById('x').getAttribute('name')),实际上得到的是id=x的元素的name属性,也就是iframe的name属性
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]2022 KCTF-WEB 出题思路 10136
- [原创]XSS修炼之-内功心法CSP篇 4756
- [原创]2021 KCTF-WEB 出题思路 3604
- [原创]第一题 至暗时刻 2020 KCTF-WEB 设计思路 4797