#技术分享#Flash与XSS

Posted 京东安全应急响应中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#技术分享#Flash与XSS相关的知识,希望对你有一定的参考价值。

点击上方“蓝字”关注本宝宝公众号

本文介绍利用Flash特性的XSS(跨站脚本)攻击。根据利用特性的不同,可造成存储型或反射型XSS。下面介绍4种类型的Flash XSS利用方式。


类型1——navigateToURL/ getURL

类型1利用flash的navigateToURL(ActionScript 3.0)方法和getURL方法(ActionScript1.0,ActionScript2.0),这两个方法接受一个url作为输入并打开一个新窗口。

函数原型:
#技术分享#Flash与XSS

其中url参数支持javascript伪协议,形如javascript:code。当不受信任的输入作为url参数传入时,可导致执行攻击者定义的脚本造成XSS。这种类型的XSS通常为反射型XSS。


类型2——allowScriptAccess

当flash嵌入到html页面中时,allowScriptAccess值定义flash与其包含环境如何交互。

当 AllowScriptAccess 为 "always" 时,SWF 文件可以与其嵌入到的HTML 页进行通信,即使该SWF 文件来自不同于HTML 页的域也可以。

当 AllowScriptAccess 为 "sameDomain" 时,仅当SWF 文件与其嵌入到的HTML 页来自相同的域时,该SWF 文件才能与该HTML 页进行通信。此值是 AllowScriptAccess 的默认值。

当 AllowScriptAccess 为 "never" 时,SWF 文件将无法与任何HTML 页进行通信。

allowScriptAccess控制flash是否可以调用外部Javascript。

当容器中allowScriptAccess设置为always时,嵌入的外部flash文件允许调用Javascript函数。攻击者可通过相应方法嵌入自己的flash文件并在其中包含恶意Javascript代码造成XSS。这种类型的XSS可以为存储型或反射型XSS。


类型3——ExternalInterface.call

Flash的ExternalInterface.call() 方法执行容器应用程序中的代码(容器可为HTML页面或ActiveX容器)。它至少需要一个参数,即包含容器应用程序中要调用函数的名称的字符串。传递给 ExternalInterface.call() 方法的其它任何参数均作为函数调用的参数传递给容器。
函数原型:
#技术分享#Flash与XSS
当不受信任的输入作为参数传入此方法时,攻击者可使自己定义的Javascript代码执行造成XSS,通常为反射型XSS。
当使用ExternalInterface.call调用Javascript时,浏览器上下文将生成如下代码:
#技术分享#Flash与XSS
根据ExternalInterface.call可控参数的位置,该类型XSS的利用方法略有不同,下面分别进行介绍。
#技术分享#Flash与XSS
1.  ExternalInterface.call第一个参数可控
当调用ExternalInterface.call的第一个参数可控时,
(1)可直接写入JS代码造成XSS。
#技术分享#Flash与XSS
(2) 可闭合调用ExternalInterface.call浏览器生成的上下文代码造成XSS。
#技术分享#Flash与XSS
#技术分享#Flash与XSS
2.  ExternalInterface.call第二个(+)参数可控
当ExternalInterface.call第2-N个参数可控时,可闭合其生成的上下文代码造成XSS。
#技术分享#Flash与XSS
类型4:ExternalInterface.addCallback
ExternalInterface.addCallback使容器可以调用ActionScript中的函数。
若要从容器应用程序调用ActionScript函数,必须执行两项操作:向ExternalInterface类注册该函数,然后从容器的代码调用该函数。
ExternalInterface.addCallback方法注册被外部容器调用的函数。
函数原型:
#技术分享#Flash与XSS
Language Version:ActionScript 3.0
Runtime Versions:AIR 1.0, Flash Player 9, Flash Lite 4
从容器中调用被注册的方法:
#技术分享#Flash与XSS
利用该特性的XSS有两种类型,下面分别进行介绍。
#技术分享#Flash与XSS
1.    利用object id属性
当调用flash的<object>标签id属性可控时,可利用ActionScript的addCallback造成XSS。
当ActionScript中调用addCallback方法时,容器上下文中生成如下js代码:
#技术分享#Flash与XSS
其中umFlash为包含该flash的object标签的id。
当<object>标签的id可控时,可通过”)(等符号闭合上述函数造成XSS。
利用步骤:
(1)将包含swf的<object>标签设置为可以闭合__flash__addCallback函数调用语法的输入。
#技术分享#Flash与XSS
(2)站点加载swf文件即会发生XSS。
注:
A.触发此种XSS只需:
a)  Flash中使用ExternalInterface.addCallback加入callback;
b) 将object id指定为可造成XSS的输入,触发此XSS不需要JS代码中调用AS注册的callback。
B.该代码只在IE的特定版本有效,IE11无效,其他浏览器无效。
此类型的XSS通常为存储型XSS。
#技术分享#Flash与XSS
2.    利用返回值
当ActionScript中调用addCallback方法时,容器上下文中生成如下js代码:
#技术分享#Flash与XSS
其中__flash__addCallback函数定义如下:
在IE中:
#技术分享#Flash与XSS

在其他浏览器中:

#技术分享#Flash与XSS
可见函数调用的返回值被放入eval中,因此当返回值可控时,可通过eval函数造成XSS。

可利用LSO控制返回值,如果目标站点通过js调用了flash添加的回调函数get(xxx)读取保存信息的LSO数据,则可通过篡改此LSO造成XSS。可通过在恶意站点上加载目标flash调用callback的set(xxx)方法篡改LSO。利用该方法可以实现跨站点的水坑攻击。
利用步骤:
A.在恶意站点上调用callback的set(xxx)方法将LSO设置为可在调用get(xxx)时造成XSS的值;
#技术分享#Flash与XSS
#技术分享#Flash与XSS
B.站点代码调用callback的get(xxx)方法时将引起XSS。
注:

A.控制返回值不一定通过LSO,可使用其他方法如下URL所描述。

B.A站点调用B站点flash的回调函数需要B站点ActionScript代码中设置。

#技术分享#Flash与XSS
C.触发此漏洞需要:

a)    Flash中使用ExternalInterface.addCallback加入callback;
b)    JS中调用注册的callback。
D.此漏洞利用跨浏览器。
E.在IE、chrome中,触发此漏洞需要第一个<object>标签含有type="application/x-shockwave-flash"。
#技术分享#Flash与XSS
在firefox中,触发此漏洞需要第一个<object>含有data="… "和type="application/x-shockwave-flash"
第一个<object>标签加入classid=”…”后chrome和firefox利用不成功,IE可以利用成功。
IE、chrome、firefox中都可利用成功的写法:
#技术分享#Flash与XSS
  #技术分享#Flash与XSS
  #技术分享#Flash与XSS
  #技术分享#Flash与XSS

#技术分享#Flash与XSS #技术分享#Flash与XSS
  #技术分享#Flash与XSS
#技术分享#Flash与XSS
#技术分享#Flash与XSS
微信公众号: jsrc_team
官方微博:
京东安全应急响应中心
#技术分享#Flash与XSS
固定栏目
技术分享|安全意识|安全小课堂

以上是关于#技术分享#Flash与XSS的主要内容,如果未能解决你的问题,请参考以下文章

HTML5技术分享 浅谈前端安全以及如何防范

07V8第25篇技术分享|简单代码审计带你基础入门XSS

07V8第27篇技术分享|简单代码审计带你基础入门XSS(完结)

07V8第26篇技术分享|简单代码审计带你基础入门XSS

07V8第24篇技术分享|简单代码审计带你基础入门XSS

技术分享 || 通过强网杯一道题了解RPO+XSS+CSRF