本文的目的是深层次的分析Flash的ExternalInterface的XSS漏洞,并提出比较有效的解决方案。
 
首先,我们看看什么情况下,会出现XSS。
 
第一种情况:
 
     把flashvars传入的参数(或者其他能被别人控制的方式)当ExternalInterface.call的第一个参数
 
package
{
import flash.display.Sprite;
import flash.external.ExternalInterface; public class XSSTest extends Sprite
{
public function XSSTest()
{
var jsFunction:String = loaderInfo.parameters.jsFunction;
var param:String = "abc";
ExternalInterface.call(jsFunction, param);
}
}
}
     注意,这里通过flashvars传递了一个参数,是js的函数。这种方式比较常见,swf可以做成通用,放到不同的业务中使用,每次只需要传入对应的js函数即可。但是,这里就存在漏洞了。
     在浏览器中,构造url: XSSTest.swf?jsFunction=alert(/XSS/),访问swf,并以get参数的形式传入flashvars,结果,造成了
 

 
甚至更狠一点,jsFunction=function(){alert(1);alert(2);}。。。
 
当然,这么恶作剧alert一下,貌似对小白用户没什么损失,但如果在function内调用这个域名的CGI,就能带来很大的惊喜了~~~因为这里能获取到对应的cookie,时间有限,具体攻击的方式,这里不多说。
 
 

第二种情况:
 
     把flashvars传入的参数(或者其他能被别人控制的方式)当ExternalInterface.call的第二和第三个参数
 
    这次,我们使用这段代码: 
   public function XSSTest()
{
var param:String = loaderInfo.parameters.param;
ExternalInterface.call("console.log", param);
}
     这个方式也许没有这么简单进行XSS,但对于黑客来说,还是有办法的。
 
 
在IE8下调试模式下,我们可以看到ExternalInterface的代码:
 
正常情况下,Flash player会生成这样的代码:
 
try { __flash__toXML(console.log("good" )) ; } catch (e) { "<undefined/>"; }
 
对比自己写的as代码和生成的这段js代码,可以猜测,Flash player是以一种简单的拼接字符串的方式实现的。
 
稍稍做个小把戏,结果就可以注入代码执行了。
 
 
是不是很神奇?怎么做到的呢?为什么url稍稍变化可以达到这样呢。我们看看现在的js代码:
 
try { __flash__toXML(console.log("\\" ));alert(/XSS/);}catch(e){} //")) ; } catch (e) { "<undefined/>"; }
 
正好跟原来的双引号对上了,结果,最后的catch也被替换了。。。也就是说,黑客可以写自己的函数了,想怎么执行都可以了。。。
至于为什么这里双引号对上了,可以简单猜测flash遇到字符串中有双引号的时候,只是简单的以  \"  方式打印成js代码,但如果用户再恶意拼一个\,就负负得正了。。。
 
(这里__flash__toXML的代码并不是关键点了,所以将在文章最后再列出)
 
 
第三种情况:
 
     没有对swf Object的id没有过滤
 
     页面加载Flash,我们需要设定Object或者embed的id,否则ExternalInterface会失效。而这个地方,也会被黑客利用。
 
     我们看看实际执行的代码:
 
try { document.getElementById("XSSTest" ).SetReturnValue(__flash__toXML(alert( null)) ); } catch (e) { document.getElementById("XSSTest" ).SetReturnValue("<undefined/>"); }     
 
     看到这里,应该发现跟上边说的第二种情况很类似,黑客可以通过修改了Object id,恶意闭合双引号,达到目的。
 
 
 
 
接下来,简洁的总结一下怎么防XSS。
 
对于第一和第三种情况,我们应该对字符进行过滤,例如用以下的两个函数:
              
               public static function checkJsFunctionValid(functionName:String):Boolean
{
var reg:RegExp = /^[a-zA-Z0-9_\.]+$/;
return reg.test(functionName);
} public static function checkObjectIdValid():Boolean
{
if (ExternalInterface.available)
{
var objectId:String = ExternalInterface.objectID;
if (!objectId || (objectId == objectId.replace(/[^0-9a-zA-Z_]/g , "")))
return true;
else
return false;
}
return true;
}
对于第二种情况,我们应该尽量避免这样跟js传递数据,但如果实在无法避免。可以用这样的方式转义字符串:
 
str.replace( /[\"\\]/g , function(d:String, b:*, c:*){ return '\\' + d.charCodeAt(0).toString(8); });
 
简单解释一下,这里把双引号和反斜杠这样比较敏感的字符,替换为转义表示。再输出成js代码时,正好又还原回去了。
 
例如:
\\\"\\\"})));}catch(e){alert(/xss/);}//    变成了     \134\42\134\42})));}catch(e){alert(/xss/);}//
 
 
 
 
 
附带额外的在IE8 开发工具中抓获到的代码:
 
function __flash__arrayToXML(obj) {
var s = "<array>" ;
for (var i=0; i<obj.length; i++) {
s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
}
return s+"</array>" ;
}
function __flash__argumentsToXML(obj,index) {
var s = "<arguments>" ;
for (var i=index; i<obj.length; i++) {
s += __flash__toXML(obj[i]);
}
return s+"</arguments>" ;
}
function __flash__objectToXML(obj) {
var s = "<object>" ;
for (var prop in obj) {
s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>" ;
}
return s+"</object>" ;
}
function __flash__escapeXML(s) {
return s.replace(/&/g, "&amp;" ).replace(/</g, "&lt;").replace(/>/g, "&gt;" ).replace(/"/g, "&quot; ").replace(/'/g, "&apos;");
}
function __flash__toXML(value) {
var type = typeof(value);
if (type == "string" ) {
return "<string>" + __flash__escapeXML(value) + "</string>";
} else if (type == "undefined") {
return "<undefined/>" ;
} else if (type == "number") {
return "<number>" + value + "</number>";
} else if (value == null) {
return "<null/>" ;
} else if (type == "boolean") {
return value ? "<true/>" : "<false/>";
} else if (value instanceof Date) {
return "<date>" + value.getTime() + "</date>";
} else if (value instanceof Array) {
return __flash__arrayToXML(value);
} else if (type == "object") {
return __flash__objectToXML(value);
} else {
return "<null/>" ; //???
}
}
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=\"" +name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>" ));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}

Flash XSS 漏洞详解 根治的好办法的更多相关文章

  1. Uboot mmc命令解析&NAND flash uboot命令详解

    转载:http://blog.csdn.net/simonjay2007/article/details/43198353 一:mmc的命令如下: 1:对mmc读操作 mmc read addr bl ...

  2. FLASH动作脚本详解

    FLASH动作脚本详解 一.FLASH脚本基础入门讲解 二.按钮AS的编写 三.影片剪辑的AS编写 四.动态文本框 五.影片剪辑的拖拽 六.流程控制与循环语句 七.绘图及颜色的AS的编写 八.声音 A ...

  3. 渗透测试学习 十七、 XSS跨站脚本漏洞详解

      一般用途:拿cookie进后台,将后台地址一起发送过来 特点:挖掘困难,绕过困难  大纲: XSS漏洞基础讲解 XSS漏洞发掘与绕过 XSS漏洞的综合利用 XSS漏洞基础讲解 XSS介绍: 跨站脚 ...

  4. android WebView详解,常见漏洞详解和安全源码

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  转载请注明出处:http://blog.csdn.net/se ...

  5. Java反序列化漏洞详解

      Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...

  6. Flash XSS漏洞快速上手

      0x01 Flash XSS xss一是指执行恶意js,那么为什么说flash xss呢?是因为flash有可以调用js的函数,也就是可以和js通信,因此这些函数如果使用不当就会造成xss.常见的 ...

  7. 【转】SPI FLASH与NOR FLASH的区别 详解SPI FLASH与NOR FLASH的不一样

    转自:http://m.elecfans.com/article/778203.html 本文主要是关于SPI FLASH与NOR FLASH的相关介绍,并着重对SPI FLASH与NOR FLASH ...

  8. web漏洞详解及修复建议

    1.漏洞描述 跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.偷取密码.传播恶意代码等攻击行为. 恶意的攻击者将对客户端有危害的 ...

  9. xss靶场详解

    一个XSS靶场练习记录 https://blog.csdn.net/qq_41500251/article/details/101116697 001.level 1 反射型 1.观察源码 <s ...

随机推荐

  1. ack-grep 代码全文搜索

    安装 ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了. sudo apt-get install ack-grep 特点 大家都说自己的东西好,因此ac ...

  2. 根据ImageView的大小来压缩Bitmap,避免OOM

    Bitmap是引起OOM的罪魁祸首之一,当我们从网络上下载图片的时候无法知道网络图片的准确大小,所以为了节约内存,一般会在服务器上缓存一个缩略图,提升下载速度.除此之外,我们还可以在本地显示图片前将图 ...

  3. Material Designer的低版本兼容实现(八)—— Flat Button

       除了中规中矩的矩形按钮外,5.0中将按钮扁平化,产生了一个扁平按钮——Flat Button.这个按钮降低了很多存在感,主要用于在对话框,提示栏中.让整个界面减少层级.今天说的就是它的用法. 这 ...

  4. docker 删除无用的镜像文件的命令小计

    df -h  查看当前服务器的内存情况 docker system prune  删除无用镜像文件命令 执行ok之后,再次查看内存情况.

  5. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  6. jQuery中attr()和prop()的区别,修改checked属性 jquery attr('checked' 不起作用 attr('checked' 不对

    在做复选框全选按钮的时候,出现了一个问题,使用语句$.attr('checked',true),将复选框的属性改为被选中,在chrome浏览器中第一次点击有效后面就不行了,IE8倒是没有问题. 百度了 ...

  7. ASP.NET MVC:无法向会话状态服务器发出会话状态请求

    ylbtech-Error-ASP.NET MVC: 无法向会话状态服务器发出会话状态请求 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Service (ASP.NET ...

  8. VS2010整合NUnit进行单元测试

    1.下载安装NUnit(最新win版本为NUnit-2.6.0.12051.msi) http://www.nunit.org/index.php?p=download 2.下载并安装VS的Visua ...

  9. iOS开发-UIButton浅谈

    UIButton算是最基本的一个控件了,不过有的时候用法挺多关于UIButton文字的位置,字体大小,字体的颜色 1.设置UIButton字体大小,尤其注意不要使用直接调用setFont: [self ...

  10. Path Sum leetcode java

    题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...