Flash/Flex程序的主要安全威胁及如何避免这些威胁-第二部分

Adobe Flash Builder 4 简体中文正式版 Windows版点击下载:http://g.csdn.net/5134151

Adobe Flash Builder 4 简体中文正式版 Mac版点击下载http://g.csdn.net/5134152

Adobe 在线课堂:http://adobev.csdn.net/zx/index.html
Adobe平台技术峰会课程视频:http://adobev.csdn.net/

 

跨站攻击(XSS)漏洞
跨站攻击(XSS)是一种漏洞,攻击者可以加入客户端脚本。XSS代表我们现在在互联网上看到的大部分攻击。攻击者发现了一种有“创意”的方式向网页加入脚本,这样他们就可以让用户面对诸多安全风险。譬如,攻击者可以进行:
盗窃账户-攻击者可以抓取cookie信息,这样就可以进行账户劫持,因为诸多cookie都包含有账户信息;
改变页面的内容-被误导的用户在伪造的网站再次输入个人信息,放置错误的信息或读取用户的cookies;
这个方法涉及两个网站,这也就是为什么叫做跨站,第二个网站加入脚本,就可以在页面上做任何它想做的事情了。
Flex程序漏洞
Flash Player不会轻易受到跨站脚本的直接攻击,因为字节代码是通过虚拟机器(VM)。但是Flash常被用来在包含其它脚本的网页上,这样你的程序就可以与其它网页元素互动,从而打开安全漏洞,因为网页会动态生成内容,而不会首先过滤结果。攻击者可以利用你的程序,创建XSS。
来自FLEX的跨站网页攻击
在这个范例中,用户输入姓名,信息被传输到Javascript函数。看看下面这个范例:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  minWidth="1024" minHeight="768">
     <fx:Script>
          <![CDATA[
              
               protected function clickHandler(name:String):void
               {
                     ExternalInterface.call('submitInfo', name);
                }
          ]]>
     </fx:Script>
    
     <mx:Form x="10" y="10" width="286" height="115">
          <mx:FormItem label="First Name: ">
               <s:TextInput id="firstNameTextInput"/>
          </mx:FormItem>
          <mx:FormItem>
               <s:Button label="Submit" click="clickHandler(firstNameTextInput.text)"/>
          </mx:FormItem>
     </mx:Form>
    
</s:Application>
向标头标记中的index.template.html添加Javascript函数。index.template.html被FlashBuilder使用,生成HTML页面,所以添加这个脚本会“确保”你一直会有这个脚本。
<script type="text/javascript">
     function submitInfo(name) {
           document.write(name);
      }           
</script>
编辑范例,你会看到:


在用户提交了在网页上呈现姓名的格式之后(正如他想要的),看看一旦用户输入以下代码,而不是姓名之后,会发生什么:


  <script>alert('Test')</script>
正如你看到的,我们插入了Javascript代码,它被传输到HTML页面,然后浏览器执行。显示警告框并无害处。但是,有了添加脚本标签的能力,攻击者就会插入脚本,或重新定向:
<script type="text/javascript">window.location = "http://www.google.com/"</script>
恶意脚本可以在网页上做任何它想做的事情,执行javascript代码。
恶意数据注入
如果网页允许向另外的网页读取写入,攻击者可以利用它,重新写入网页,或者将来自该网页的用户重新定向到一个钓鱼网站,这类攻击就叫做恶意数据注入攻击或脚本注入。
攻击者可以注入数据,进行跨站脚本(XSS)攻击。以ActionScript语言编码,使用API如
ExternalInterface, navigateToURL 或getURI。攻击者可以重新定向URL,甚至粘贴JavaScript代码,抓取用户的cookies ,获取个人信息。
我们需要一个脚本,以检索通过URL传送到我的FLEX程序的参数。你知道,你可以使用FlashVar传送各类变量,然后使用下面的Flex 4语法读取参数:
FlexGlobals.topLevelApplication.parameters.name
然而,如果你想通过URL传递参数,你需要直接调用SWF:
MyApp.swf?name=Elad
我的代码可以让我读取来自URL的参数,而无需直接调用SWF。
这就是它如何工作的。我正在注册一个callback Javascript函数,叫做getParams。一旦用户点击按钮,我就会调用Javascript方法 getURLString,检索URL参数,将它传递回callback。
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx=&#8220;library://ns.adobe.com/flex/mx&#8221; minWidth="1024" minHeight="768"
                  initialize="application1_initializeHandler(event)">
     <fx:Script>
          <![CDATA[
               import mx.controls.Alert;
               import mx.events.FlexEvent;

               protected function application1_initializeHandler(event:FlexEvent):void
               {
                     ExternalInterface.addCallback("getParams", getParamCallBack); 
                }
              
               protected function clickHandler():void
               {
                     ExternalInterface.call('getURLString');
                }              
              
               public function getParamCallBack(name:String):void
               {
                     Alert.show(name);
                }

          ]]>
     </fx:Script>
    
     <s:Button label="Get name from URL string" click="clickHandler()"/>
</s:Application>
然后看看JavaScript代码,包括两种方法getURLString和sendInfoToFlexApp。一旦我们的Flex程序调用getURLString ,URL参数被检索,sendInfoToFlexApp方法会核查浏览器的类call型(Explorer或其它),以读取Flex程序元素,然后发送信息到Flex的call back方法,调用页面的元素。
注:我正使用${程序},而不是程序名称,因为代码放置在html-template/index.template.html里,这样一旦我们编辑,就会代替带有程序名的表征。
<script language="JavaScript" type="text/javascript">   
    function getURLString() {
         var name = decodeURIComponent(window.location.search.substring(6)) || "";
         sendInfoToFlexApp('${application}').getParams(name);
        
         document.write(name);
     }
   
    function sendInfoToFlexApp(appName) {
       if (navigator.appName.indexOf ("Microsoft") !=-1) {
          return window[appName];
        } else {
          return document[appName];
        }
}
               
</script>
编辑并运行程序。不要忘记在URL App.html?name=Elad中传递参数。

一旦你点击按钮,URL参数被检索,Flex会打开一个警示弹出窗口,显示名称。


尽管看上去是无害的,也是常见的,你看看如果输入以下参数?name=%3Cscript%3Ealert('Elad')%3C/script%3E而不是?name=Elad I时,会发生什么:

Flex 3中的管理漏洞
我们刚才给出的跨站脚本,你会在Flex 3中的historyFrame.html处理的历史管理(History Management)中发现同类型的脚本。漏洞就在于历史管理(History Management)使用的代码。如果你使用Flex 3,及历史管理功能,你需要更新到至少Flex 3.0.2 SDK Update或替换来自ex 3.02的HTML文件。
如何避免跨站攻击
避免跨站攻击的方法就是:对用户提供数据充分消毒,这就意味着和老式的网络程序一样最佳的操作才是最好的,过滤用户输入的数据,以确保用户输入了恰当的格式,仅包含有所期待的数据。
为了避免此类漏洞,你可以向Flex/Flash程序添加代码,去除HTML标签,标签属性,值,Javascript, CSS, HTML 和URL。
有两种方法。如果要验证数据,你可以采用whitelist或blacklist方法。最好是whitelist,不过whitelist不是总是可能的,所以可以使用blacklisting。
找到HTML标签。在我们的第一个例子里,你可以调整clickHandler方法,避免使用HTML和脚本标签。你可以使用更多特定元素:
protected function clickHandler(name:String):void
{
     if (ExternalInterface.available)
     {
          name = name.split("&").join("&amp;");
          name = name.split("'").join("&#039;");
          name = name.split("/"").join("&quot;");
          name = name.split("<").join("&lt;");
          name = name.split(">").join("&gt;");
          ExternalInterface.call("submitInfo", name);
      }
}

使用RegExp避免攻击:
前面的范例很好,不过有时候攻击者会试图使用Hex等值伪装字符串。我们来看看下面的例子:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="1024" minHeight="768">
    <fx:Script>
        <![CDATA[
            import mx.validators.Validator;
           
            protected function clickHandler(name:String):void
            {
                 if ( validate().length )
                 {
                      ExternalInterface.call('submitInfo', name);
                  }
             }
           
            public function validate():Array
            {
                 validator.expression = "((/%3C)|<)";
                 var invalidResults:Array = Validator.validateAll([validator]);
                
                 return invalidResults;
             }
        ]]>
    </fx:Script>
   
    <mx:Form x="10" y="10" width="286" height="115">
        <mx:FormItem label="First Name: ">
            <s:TextInput id="firstNameTextInput"/>
        </mx:FormItem>
        <mx:FormItem>
            <s:Button label="Submit" click="clickHandler(firstNameTextInput.text)"/>
        </mx:FormItem>
    </mx:Form>
   
    <fx:Declarations>
        <mx:RegExpValidator id="validator" source="{firstNameTextInput}"
                            property="text" />
    </fx:Declarations> 
   
</s:Application>

我正在使用RegExpValidator组件,传递RegExp "((/%3C)|<)。如果没有匹配,你就会看到“field is invalid”。
你可以注入所有的RegExp,看看如果你是否会获得零结果,这就是意味着expression被显示了。
如需了解更多有关Symantec的文章,请登录http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks
Update Flash Player 和SDK

更新Symantec和SDK Adobe通常能抵抗攻击者。譬如在升级到Flex SDK 3.4时,Adobe解决了有关ticket CVE-2009-1879的一些问题,以处理SDK3.3中index.template.html的跨站脚本漏洞。当安装的Flash版本比特定的requiredMajorVersion值还要老时,让远程攻击者就可通过查询字符串注入任意网络脚本或HTML。

本文译自: http://insideria.com/2010/06/top-security-threats-to-flashf-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值