欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Flash Xss的前世与今生

来源:本站整理 作者:JoyChou 时间:2016-09-23 TAG: 我要投稿

 我是一条分隔线 >..<

1. swf文件的编译与反编译

1.1 编译

我们知道,.swf文件可直接由.as文件编译生成。

编译方案如下:

  • 官网下载Flex sdk
  • cd到bin目录,执行mxmlc xx.as命令

如果有任何的报错,google能帮助你。

1.2 反编译

反编译相对编译来说,对环境配置需求较低,只需反编译软件或者在线反编译网站。

比如

2. ExternalInterface.call导致的Flash Xss

ActionScript(以下简称AS)

AS2和AS3都有这个对象,是专门为Flash与JavaScript通信准备的接口。

2.1 Flash的参数传递

Flash中的参数传递如下:

  • AS2的_root.argv形式,argv直接就是参数名;
  • AS3的loaderInfo.parameters形式,返回key和value的字典结构。

2.2 ExternalInterface.call的第一个参数导致的Flash Xss

官网定义:public static function call(functionName:String, ... arguments)

  • 第一个参数是函数名
  • 后面参数都是第一个函数的参数。

构造一个存在FlashXss的文件,文件名为FlashXss.as,内容如下。

代码做以下解释:

  1. 类名和文件名必须保持一致才能成功编译
  2. 构造函数名和类名一致。

比如下面的代码,先执行FlashXss函数

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class FlashXss extends Sprite
    {
        public function FlashXss()
        {
            // 定义字符串变量名jsFunction,值从url的movieName获取
            var jsFunction:String = loaderInfo.parameters.movieName;
            // 定义字符串变量名param
            var param:String = "JoyChou";
            ExternalInterface.call(jsFunction, param);
        }
    }
}

编译,访问http://localhost/pentest/xss/FlashXss.swf?movieName=alert,效果如下图

2

2.3 利用ie进行flash xss调试

利用上面的代码和ie进行flash xss的调试,F12打开ie的开发人员工具 => 脚本 => 启动调试 => 全部中断,再访问url即可中断下来。

1

代码:

try { __flash__toXML(alert("JoyChou")) ; } catch (e) { "<undefined/>"; }

上面这段代码是ExternalInterface.call底层代码。

这段代码会先执行alert("JoyChou"),然后将alert("JoyChou")的返回值传入__flash__toXML函数。

继续F11步入__flash__toXML函数,我们可以看到__flash__toXML内部代码,不过这都不重要了,重要是已经执行了alert函数。

function __flash__toXML(value) {
   var type = typeof(value);
    if (type == "string") {
        return "<string>" + __flash__escapeXML(value) + "</string>";
    } else if (type == "undefined") {
        return "<undefined/>";
    } else if (type == "number") {
        return "<number>" + value + "</number>";
    } else if (value == null) {
        return "<null/>";
    } else if (type == "boolean") {
        return value ? "<true/>" : "<false/>";
    } else if (value instanceof Date) {
        return "<date>" + value.getTime() + "</date>";
   } else if (value instanceof Array) {
       return __flash__arrayToXML(value);
   } else if (type == "object") {
       return __flash__objectToXML(value);
   } else {
        return "<null/>"; //???
    }
}

2.4 ExternalInterface.call的第二个参数导致的Flash Xss

代码如下:

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class FlashXss extends Sprite
    {
        public function FlashXss()
        {
            // 定义字符串变量名jsFunction,值从url的movieName获取
            var param:String = loaderInfo.parameters.movieName;
            ExternalInterface.call("console.log", param);
        }
    }
}

当访问,http://localhost/pentest/xss/FlashXss.swf?movieName=test"

对应的底层代码是

try { __flash__toXML(console.log("test\"")) ; } catch (e) { "<undefined/>"; }

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载