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=“library://ns.adobe.com/flex/mx” 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("&");
name = name.split("'").join("'");
name = name.split("/"").join(""");
name = name.split("<").join("<");
name = name.split(">").join(">");
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