朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

初探CSP——SOP同源策略

in XSS,安全研究 read (509) 1347汉字 站长Lucifaer 文章转载请注明来源!

开个新坑,来着重关注一下xss漏洞——这个现在让我有着很大兴趣的东西。

在总结CSP之前,首先不得不来总结一下浏览器的同源策略,为后面的跨域来打一个基础。

0x00 什么是SOP

SOP就是浏览器中最重要的安全措施——同源策略的缩写。同源策略用于限制不同来源的资源之间的交互。

同源策略的含义就是对于不同的页面,如果他们的

  • 主机名
  • 协议
  • 端口

都相同,那它们就是同一来源。

如果上述三个属性中有任何一个不一样,那就不能算是同源了。而同一来源的资源,即主机名、协议和端口都相同的资源之间的交互,是不受限制的。

0x01 一个源的定义

如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源。

相对http://store.company.com/dir/page.html的同源检测

URL结果原因
http://store.company.com/dir2/other.html成功dir2/other.html
http://store.company.com/dir/inner/another.html成功dir/inner/another.html
https://store.company.com/secure.html失败不同的协议 ( https )
http://store.company.com:81/dir/etc.html失败不同的端口 ( 81 )
http://news.company.com/dir/other.html失败不同的主机 ( news )

1.1 源的继承

  • 来自about:blankjavascript:URL的内容从加载URL的文档继承原始文档,因为URL本身不提供任何有关原点的信息。
  • data:URLs获得一个新的,空的安全上下文。

0x02 源的更改

页面可能会更改自己的来源,但是有一些限制。脚本可以将document.domain的值设置为其当前域或其当前域的超级域。

举个例子:

假设文档中的一个脚本在 http://store.company.com/dir/other.html 执行以下语句:

document.domain = "company.com";

这条语句执行后,页面将会成功地通过对http://company.com/dir/page.html的同源检测。而同理,company.com不能设置document.domainothercompany.com

浏览器单独保存端口号。任何的复制操作,包括document.domain=document.domain都会以null值覆盖掉原来的端口号。因此company.com:8080页面的脚本不能仅通过设置document.domain="company.com"就能与company.com通信。赋值时必须带上端口号,以确保端口号不会为null。

**注意:
使用document.domain允许子域安全访问其父域时,需要设置document.domain在父域和子域中具有相同的值。这是必要的,即使这样做只是将父域设置返回其原始值。否则可能会导致权限错误。**

0x03 跨源网络访问

同源策略控制了不同源之间的交互,例如在使用XMLHttpRequest<img>标签时,会受到同源策略的约束。

跨源的网络交互通常分为三类:

  • 通常允许进行跨域写操作。例如链接,重定向以及表单提交。特定少数的HTTP请求需要添加preflight
  • 通常允许跨域资源嵌入
  • 通常不允许跨域读操作。但常可以通过内嵌资源来巧妙的进行读取访问。例如可以读取嵌入图片的高度和宽度,调用内嵌脚本的方法。

下面是一些可能嵌入跨源的资源的实例:

  • <script src=""></script>标签嵌入css。语法错误信息只能在同源脚本中捕捉到。
  • <link rel="stylesheet" href="#">嵌入css。由于css的松散的语法规则,css的跨域需要设置一个正确的Content-Type消息头。不同的浏览器有不同的限制。
  • <img>嵌入图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG
  • <video><audio>嵌入多媒体资源。
  • <object>,<embed><applet>的插件。
  • @font-face引入的字体。一些浏览器允许跨域字体,一些需要同源字体。
  • <frame><iframe>载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。

3.1 如何允许跨源访问(SOP和CORS——同源策略与跨源资源共享)

使用CORS允许跨源访问。

这就不得不说同源策略与跨源资源共享了。

跨源资源共享(CORS)是一种允许多种资源(图片,css,字体,javascript等)在一个web页面请求域之外的另一个域的资源的机制。

使用XMLHttpRequest对象发起HTTP请求就必须遵守同源策略。

具体的来说,就是web应用程序能且只能使用XMLHttpRequest对象向其加载的源域名发起HTTP请求,而不能向其它域名发起请求。跨源资源共享这种机制让web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输称为可能。

如果httpsecure.org源返回下面的响应头,所有httpsecure.org的子域与根域就打开了一个双向的通信通道:

Access-Control-Allow-Origin: *.Httpsecure.org
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD, PUT
Access-Control-Allow-Headers: X-custom
Access-Control-Allow-Credentials: true

在上面的响应头中,第一行定义了双向通信通道,第二行定义了请求可以使用OPTIONS, GET, POST, PUT, HEAD中的任何方式,第三行则是定义的响应头,最后一行允许经过身份验证的资源进行通信。

3.2 如何阻止跨源访问(没错,csrf)

  • 阻止跨域写操作,只要检测请求中的一个不可预测的标记(CSRF token)即可。必须使用这个标记来组织页面的跨站读操作。
  • 阻止资源的跨站读取,需要保证该资源是不可嵌入的。阻止嵌入行为是必须的,因为嵌入资源通常向其暴露信息。

0x04 跨源脚本API访问

javascript的API中,如iframe.contentWindow,window.parent,window.openwindow.opener允许文档间相互引用。当两个文档的源不同时,这些引用方式将对WindowLocation对象的访问添加限制。

  • Window允许以下对窗口属性的跨源访问:

    • 方法:

      • window.blur
      • window.close
      • window.focus
      • window.postMessage
    • 属性:

      • window.closed
      • window.frames
      • window.length
      • window.location
      • window.opener
      • window.parent
      • window.self
      • window.top
      • windwo.window
  • Location允许以下对位置属性的跨源访问:

    • 方法:

      • location.replace
    • 属性:

      • URLUtils.href
csp
最后由Lucifaer修改于2017-06-01 01:36

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆