CVE-2016-4585 Safari XSS漏洞分析

翻译自: Safari's URL redirection XSS - CVE-2016-4585

URL传递错误有时候会导致安全问题。我一年前报告了这样的漏洞: XSS bug of Safari,这篇文章主要谈谈这个漏洞的细节。

漏洞概要

  • 概述: 经过一个精心制作的重定向URL,可能出现:

    1. HOST header 可控
    2. 域混淆XSS

    如果目标网站满足特定的要求,这两种都会导致信息泄露或欺骗。

  • 影响版本: Safari <v9.1.2iOS <v9.3.3tvOS <v9.2.2

  • 报告: 这个漏洞报告在2015年9月报告给 AppleIPA

  • 修复情况: Safari改进了验证机制,现在遇到不可用的重定向URL的时候,会抛出一个错误。

控制Host Header

当一个精心构造的URL被输出在HTTP Reponse中的Location参数中(通常是302或307)时,会出现漏洞。

Paste_Image.png

URL的端口不是数字。Safari会连接到 example.jp:80, 发送一个包含如下header的请求:

Paste_Image.png

不可用的端口被应用到Host Header中。这意味着我们可以控制从某个人的浏览器发送到某些地方的Host Header。但是有两个限制:出现在URL中的字符会被URL编码,只有部分出现在 : 后的字符可以被正常转发。

让我们来研究下如何利用这种浏览器行为。(为了重现漏洞,你需要移除burp之类的浏览器代理,并且使用老版本的Safari)

单引号XSS

有些符号,如'&,是允许出现的,如下图所示。首先我测试了一个简单的XSS,输出在单引号闭合的HTML标签属性中。

Paste_Image.png

令人惊讶的是,Safari的XSS Filter在这种情况下仍然有效。当然,在输出在<script>标签里的情况中,XSS Filter没有起效。

Paste_Image.png

然而这些都太浅显了,让我们深入挖掘下这个漏洞。

由hostname可控引起的XSS

Host header通常会输出在如下所示的点:

<script src="http://(HOST)/js/jquery.js">
<link href="http://(HOST)/css/style.css" rel="stylesheet" type="text/css">

你可以通过 github's code search 找到很多这样的案例,我在自己的安全测试项目里也发现了类似的案例。

我们来思考 <script src= 这样的场景下的利用。举个例子,假设 header 可控,将 hostname 从 example.jp 变成了 example.jp:xyz

<script src="http://example.jp:xyz/js/jquery.js">

Safari把 src 中的 URL 识别为畸形的,并不会加载它(这样的URL只允许出现在Location中)。即使Safari从 example.jp:80 加载了JS,也是毫无意义的,因为Safari只是加载了合法的JS。攻击者的目的是让Safari从他的服务器加载JS。

在几次尝试和错误后,我又有了新的思路。

step-1: 从攻击者的服务器接收的Reponse:

Paste_Image.png

step-2: 向目标服务器发送的Request:

在收到Location后,Safari连接到了 example.jp:80,并且发送了如下所示的Host header:


Paste_Image.png

在初始化的部分,a@(包括基础认证信息)被剥离出去。

step-3: 从目标服务器获取的 Response:

Host header被目标应用输出在了 <script src= 中。

Paste_Image.png

@符号前的字符再次被剥离。因此,用户浏览器从 evil host 获取到了非法JS,XSS攻击成功!

在这次攻击中,XSS Filter并没有生效,网络钓鱼警告也没有发出警告(当URL包含基础认证信息的时候,会发出警告)。所以攻击者顺利的完成了这次攻击。

译者补充: URL Hacking - 前端猥琐流

由hostname可控导致的信息泄露

上面的技巧也可以用于信息窃取攻击。假设一个Web应用程序,通过精心设计,重定向到一个包含敏感信息的URL。

Location: http://(HOST)/foo?token=fj0t9wj958...

在这个案例中,攻击者可以利用@的技巧,控制受害者的Host Header,从而获取到token。

我认为这种情况是比较现实的,因为Location Header是最常见的服务器对Location产生影响的输出点。这不是因为web应用开发人员都这样做,而是因为一些web应用平台,传递Location Header的时候,将请求中的Host Header直接输出在Response中。一个很好的例子是Java的 HttpServletResponse#sendRedirect()

背后的因素之一是在之前的HTTP/1.1标准中,RFC2616 禁止在Location Header中输出相对网址(relative URLs),目前已经允许了。

如果hostname可控,除了Location Header,同样会影响 <form action=<a href=

译者补充: 利用HTTP host头攻击的技术

域混淆 XSS

在测试过程中,一个奇怪的表现吸引了我的注意:

正常状态下网站的截屏:

Paste_Image.png

然而,当重定向到 http://www.mbsd.jp:xyz/ ,变成了这样:

Paste_Image.png

产生原因是相对URL地址的资源文件没有正确加载。让我们来测试下载浏览器中发生了什么。

Paste_Image.png

页面的Origin明显被破坏了。这应该是相对地址的资源没有加载的原因。另外,获取cookie的操作也被拒绝,并抛出了SecurityError,即使cookies在请求中被正确的包含。

Paste_Image.png

因为Origin被破坏造成了局限,不仅影响了cookie的获取,还抑制了攻击者的JS执行。这看起来对攻击者毫无益处,但如果能找到利用方法或许故事会被改写。

在这种情况下,最好的工具就是 iframe。先来看下在iframe中的重定向是否有什么不同。目标网站和攻击者的网站如下:

目标站点: http://test.mbsd.jp/ (X-Frame-Options中添加了攻击者的站点)
攻击者的站点: http://example7.jp/ (iframe中重定向到:http://test.mbsd.jp:xyz/)

结果如下:

Paste_Image.png

注意下JS console中的错误。在iframe中的MBSD页面,相对路径的资源(/js/jquery)抛出了404错误,但是路径是: http://example7.jp/js/jquery.js 。浏览器首先尝试从 http://test.mbsd.jp:xyz/ 加载资源,但是由于Origin被破坏,所以尝试从iframe的parent site加载JS。

坦率的说,这个结果并不是我所期望的。但无论如何,这表明了通过iframe加载目标网站,攻击者可以攻击如下所示的相对地址的资源。

<script src="/js/jquery.js">

带hostname的相对地址(如://example3.jp/a.js)不会被这个漏洞影响。

漏洞影响

前文中提到,在hostname混淆的目标网站中,JavaScript运行异常。所以攻击者的JS,既不能读取cookies,也不能通过XHR获取同源网站内容。

Paste_Image.png

但仍然可以操作当前页面的内容。这意味着,攻击者可以泄露或者改变某些特定URL的内容。Cookie认证页面可以是目标,当Cookies被包含在请求中的时候,即可完成攻击。

附加文档

关于这个漏洞,更多的细节:

  • Safari会去请求默认端口(80,在https中为443),当URL中的端口不可用时。HTTP代理,比如Burp和Squid,会阻止攻击,因为它们不允许不可用的端口。

  • 一个畸形的Host Header(如:Host: hostname:xyz)被发送到服务器时,Apache、Weblogic、Nginx会接收,但Tomcat和IIS不接收。

  • 当页面为302或者307跳转的时候,HTTP method可以是GET或者POST。然而由于重定向的特点,Request body通常为空。

  • 在iframe中,Base URL继承于它的父类。奇怪的是,<base href=完全被忽略。

  • 当JS在blank Origin被执行,甚至会与父iframe独立。除了cookie和localStorage,DOM对象都是可访问的。

  • CSP(or X-Frame-Options)或许会预防XSS攻击。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容