跨域漏洞小记

缘起是看到@乌云-漏洞报告平台的这条微博

Android浏览器的跨域漏洞嘛! url with a leading NULL byte can bypass cross origin protection

已经暴露了很久的漏洞,因为 Android 版本的原因,这个漏洞可能依旧存在于很多的 Android 手机上,我的 MX2 系统还是 4.1 版本的,默认浏览器肯定也有漏洞。尽管默认浏览器使用率不高,可是各种 APP 内的 WebView 应该也会相应中招,还是有一些影响力的。让我们我来玩一下!

先来了解一下跨域是什么?

跨域会涉及到浏览器的同源策略,由于安全性的考虑,同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式。比如你的网页向不同域名网站发送XHR请求是会被浏览器屏蔽的,这就是浏览器的跨域限制。判断请求和响应是否属于同源以及哪些资源可以跨域哪些资源不可以,这些策略有些复杂就不展开了。参考这里:https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

而跨域显然就是不再受到浏览器的这种限制,比如我在 a.com 的页面 js 中发送 XHR 请求到 b.com 是不允许的,而跨域后就可以。有网站允许跨域,这个是良性的,还有就是利用漏洞跨域,这个是安全问题。跨域的方式很多,怎么跨域我就不说了,本文并不讨论。

而这个漏洞就是让本有的跨域限制失效,然后我们就可以做我们想做的事情了。

我还找到了一片文章是讲在 Safari 中访问本地资源时是不受跨域限制的Bypassing SOP in safari(ios/mac)

跨域可以做什么

比如,我在 a 页面上植入恶意代码,如果可以跨域的话,当你访问 a 页面的时候就可以发送 a 页面上的信息到我所控制的 b站上,比如你的 cookie ,你的信息就被我盗取了。总之,是个信息流向的问题,我的信息只能流向我所信任的地方,如果引入的信息来源不明或者发送信息的地址不可控,都会带来安全问题。但是为了方便信息的流通,又不可能把这些渠道完全的卡死。这就带来了可乘之机,安全还是方便这就是个平衡博弈的过程

利用此漏洞

此漏洞就是 URL 的开头如果是无效的字节,是\u0000\x00开头的则不受跨域的限制,我也不清楚别人是怎么找到这个bug的,我只是想试一试。

简单点说,就是将我们的js脚本注入到我们想攻击的页面中,然后利用没有跨域的限制盗取用户信息或者执行某些操作。

这个js注入的过程有些意思,我们知道可以在浏览器的地址栏中输入javascript:alert('xss')来执行js代码,当然就可以做一些我们想要的操作了,比如发个微博什么的。

我们先构造一个我们想要攻击的网址的 iframe

<ifame src="http://weibo.cn/" name="xss"></ifame>
# 如果你用的是这个网址会遇到自动转跳的问题,应该也是网站的防御手段吧,参看后面的“遇到的困难部分”

然后,我们想办法把js注入到这个页面中执行,我们使用window.open()这个函数,这个函数本是用来打开窗口的函数,就是让人讨厌的弹窗广告会用的函数,在这里我们用他来注入js代码,这个函数我们带入两个参数

  1. 第一个参数是打开窗口的URL地址,在这里我们不用URL地址而是用"javascript:"+"我们需要执行的js代码",在窗口中执行这些js代码。
  2. 第二个参数是 strWindowName ,我不知道该怎么才能正确的说清楚这个参数的功能,就把MDN文档中的内容之间写在下面。

A string name for the new window. The name can be used as the target of links and forms using the target attribute of an or <form> element. The name should not contain any whitespace characters. Note that strWindowName does not specify the title of the new window.

反正我是没搞清楚如何使用 a 和 form 标签的 target 属性。

总之,我所知道的就是这个 strWindowName 如果是页面中某个 iframe 的 name ,那么第一个参数,也就是我们的js代码就会在那个页面上运行,当然正常情况下是无效的,因为有跨域限制。

我做了个页面来利用这个漏洞,http://blog.xavierskip.com/project/debug.html可以玩一玩

我只是点击后再执行代码,完全可以在载入中就执行,这样就无声无息了

说到底就是个反射型的XSS

注意chrome早已修复此漏洞, 主要影响的也是移动端,未能升级的Android系统浏览器会有此漏洞,好像是4.3以下,同时也会影响APP中内置的 WebView

遇到的困难

iframe的转跳

例如我想以 iframe 的形式载入http://weibo.cn页面,可是这个 iframe 会自动转跳到他自身的页面中就是http://weibo.cn,因为在他的页面中有以下代码

if (top != self){top.location = self.location;}

我在网上找了相关资料,防止转跳可以在 iframe 标签中加入 security="restricted" sandbox=""这两个属性,其实就是在这个 iframe 中禁用 js 来防止这段代码起效,那么我的攻击 js 同时也无法起效了,不可用。还有一种方法,就是首先声明funciton location(){}让 location 这个函数失效,测试在chrome中无效(显示TypeError: Identifier 'location' has already been declared),而在 Safari 中有效,看来还是chrome安全性方面考虑的更周到呀!

字符串

javascript代码是以URL字符串的形式作为参数导入到 window.open()函数中,所以得把 js 代码进行编码,特别要注意引号的使用,因为代码是嵌套在几层引号之内,而我们一般写js都是用的单引号',而encodeURI()encodeURIComponent()函数都不对单引号'进行编码,编码完成后再手动编码替换掉str.replace('%20')

最后不推荐使用escape()进行编码,如果你想使用中文的话。

之前接触或者尝试的安全方面的技术

csrf

由于煎蛋网的点oo就是一个get请求没有验证什么的,你就可以找一个可以自定义图片路径发帖的论坛,将点oo的那个get请求URL作为图片路径放到你要发的帖子中,最好再display:none隐藏一下,只要有人访问那个帖子,就会触发这个请求,就相当于点oo了,因为img资源是可以跨域的!

哈哈,就是刷票!!

heart bleed

之前很火爆的openssl漏洞,很多大网站都是用了这个加密组件,这个漏洞爆出来后,也有相应的脚本出来,我使用这个脚本跑了跑,当天晚上真的在12306上抓到的了一个账户,账户用户名是qq邮箱,恰好密码也是qq密码,然后我什么都知道了。

前往不要在不同网站使用相同密码呀!

参考:

Tag:hack安全漏洞 Published under (CC) BY-NC-SA