目录
X-Content-Type-Options header 介绍
修改 Content-Type 绕过 X-Content-Type-Options
漏洞原理
CSP全称是: Content-Security-Policy, 内容安全策略。
是指HTTP返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。主要是为了缓解潜在的跨站脚本问题(XSS),浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对XSS攻时,主要采用函数过滤转义输入中的特殊字符、标签、文本来规避攻击。CSP的实质就是白名单制度,开发人员明确告诉客户端,哪些外部资源可以加载和执行。开发者只需要提供配置,实现和执行全部由浏览器完成。
Low
渗透思路
CSP 对我来说是个新知识点,需要详细分析下,假设需要远程包含恶意 JS 文件实现 XSS 攻击,以下是恶意 JS 地址
https://www.segmentfault.com.haozi.me/j.js
控制台给出错误提示,CSP 策略阻止读取
仔细分析 http://www.dvwa.com/vulnerabilities/csp/ 页面发现 CSR 策略白名单
script-src 'self' Pastebin.com - #1 paste tool since 2002! hastebin.com example.com code.jquery.com https://ssl.google-analytics.com
其中 pastebin 是个快速分享文本内容的网站,假如文本的内容是一段 JavaScript 代码,网页就会把该代码包含进来。
点击创建后来到如下页面,可以根据实际需要获得各种格式的内容链接,这里我只需要 raw,纯文本格式的
raw 格式链接和内容如下
https://pastebin.com/raw/1rPXdfjz
但在实际测试中还是没有成功,出现了新问题
X-Content-Type-Options header 介绍
互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
例如,我们即使给一个html文档指定Content-Type为"text/plain",在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。
这个header主要用来防止在IE9、chrome和safari中的MIME类型混淆攻击。firefox目前对此还存在争议。通常浏览器可以通过嗅探内容本身的方法来决定它是什么类型,而不是看响应中的content-type值。通过设置 X-Content-Type-Options:如果content-type和期望的类型匹配,则不需要嗅探,只能从外部加载确定类型的资源。举个例子,如果加载了一个样式表,那么资源的MIME类型只能是text/css。
所以,如果浏览器在响应中接收到 "nosniff" 指令,则 Internet Explorer 不会猜测或解析那些未定义,错误的 MIME 文件,除非 MIME 类型匹配以下值之一:
- "application/ecmascript"
- "application/javascript"
- "application/x-javascript"
- "text/ecmascript"
- "text/javascript"
- "text/jscript"
- "text/x-javascript"
- "text/vbs"
- "text/vbscript"
参考文章
https://www.cnblogs.com/goloving/p/14891370.html
web安全:x-content-type-options头设置_juruiyuan111的博客-CSDN博客
修改 Content-Type 绕过 X-Content-Type-Options
burp 拦截 JS 内容响应报文
修改响应报文中的 Content-Type: text/plain; charset=utf-8 为 Content-Type: text/javascript; charset=utf-8
成功弹框
Medium
渗透思路
攻击失败后控制台给了提示
本次响应头返回的 CSP 策略
CSP 内联资源
http头信息中的script-src的合法来源发生了变化,他没有使用信任网站而是两个内联:
unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。
nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA”
意思是只能使用script元素且脚本块值nonce值为TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA
参考文章
DVWA-CSP Bypass详解_Mr H的博客-CSDN博客
构造内联属性绕过
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('1')</script>
源码对比
Low & Medium 源码
对比小结
Medium 和 Low 相比,http头信息中的script-src的合法来源发生了变化,没有在使用白名单列表,而是采用了具有 nonce 属性的内联 JS 限制
High
渗透思路
这次是通过 JSONP 实现资源请求,CSP 策略为 Content-Security-Policy script-src 'self';
JSONP 接口为 http://www.dvwa.com/vulnerabilities/csp/source/jsonp.php?callback=solveSum
源码分析可知 jsonp.php 在接收到 callback 参数后会直接返回响应内容,其中也包含了 callback 参数
high.php 源码分析发现 POST 请求接受 include 参数,并将其作为页面内容
JSONP 参数绕过
所以我们可以尝试利用 include 参数修改请求 JSONP 的 callback 参数内容,然后写入到页面里
<script src=source/jsonp.php?callback=alert(document.cookie)></script>
成功触发 XSS
源码对比
Medium & High 源码
对比小结
与 Medium 相比,High 在页面上限制了用户输入,只留一个按钮,但是仍可以通过 burp 修改 JSONP 请求参数实现 XSS 漏洞攻击
Impossible
源码对比
High & Impossible
对比小结
High 和 Impossible 在页面源码上没有太大区别,防护措施主要在 jsonp 接口,Impossible 直接将 callback 参数写死为 solveSum,所以也就无法像之前那样修改利用了
绕过
- location.href绕过
- link标签预加载导致的绕过
- meta网页跳转绕过
- iframe绕过
- CDN绕过
- 站点可控静态资源绕过
- 不完整script标签绕过
- 不完整的资源标签获取资源
- 302(重定向)绕过
防御
CSP 对前端攻击的防御主要有两个
- 限制 js 的执行。
- 限制对不可信域的请求。