本文的目的是深层次的分析Flash的ExternalInterface的XSS漏洞,并提出比较有效的解决方案。
首先,我们看看什么情况下,会出现XSS。
第一种情况:
 
把flashvars传入的参数(或者其他能被别人控制的方式)当ExternalInterface.call的第一个参数
package
{importflash.display.Sprite;importflash.external.ExternalInterface;public class XSSTest extendsSprite{public functionXSSTest(){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 functionXSSTest(){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_\.]+$/;returnreg.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;elsereturn 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 inobj) {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;
}

转载于:https://www.cnblogs.com/kenkofox/p/3405395.html

Flash XSS 漏洞详解 根治的好办法相关推荐

  1. xss-labs通关,xss漏洞详解

    文章目录 前言 一.XSS详解 存储型 反射型 DOM型 二.xss-labs通关 总结 前言 XSS 的原理是 WEB 应用程序混淆了用户提交的数据和 JS 脚本的代码边界,导致浏览器把用户的输入当 ...

  2. 反射型XSS漏洞详解

    反射型XSS漏洞 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文 本返回给用户.对于开发者而言,使用这种机制 ...

  3. xxs漏洞危害_反射型XSS漏洞详解

    反射型XSS漏洞 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文 本返回给用户.对于开发者而言,使用这种机制 ...

  4. xss-labs靶场实战全通关详细过程(xss靶场详解)

    目录 level 1 level 2 level 3 level 4 level 5 level 6 level 7 level 8 level 9 level 10 level 11 level 1 ...

  5. XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决

    XSS(跨站脚本)漏洞详解 XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, ...

  6. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  7. OWASP-TOP10漏洞详解以及防护方案

    OWASP TOP 10 漏洞详解以及防护方案 OWASP介绍 官网:http://www.owasp.org.cn/ OWASP TOP10 指出了 WEB 应用面临最大风险的 10 类问题,是目前 ...

  8. OWASP top 10漏洞详解

    一.写在前边   临近毕业,最近在找实习单位,看到好多招聘要求熟悉owasp top 10 安全漏洞,于是在经过一番查资料,终于有了大致的了解,为了加深印象,特意通过博客记录一下,也希望为有同样需求的 ...

  9. Pikachu靶场之文件上传漏洞详解

    Pikachu靶场之文件上传漏洞详解 前言 文件上传漏洞简述 什么是文件上传漏洞? 文件上传的原理 文件上传漏洞有哪些危害 文件上传漏洞如何查找及判断 文件上传如何防御 文件上传漏洞绕过的方式有哪些 ...

最新文章

  1. 2020腾讯广告算法大赛分享(冠军)
  2. 深度学习之梯度下降法
  3. Raid信息丢失数据恢复及oracle数据库恢复验证方案
  4. 让Windows Server 2008+IIS 7+ASP.NET突破默认限制,支持海量并发连接数
  5. php和mysql的概述_PHP的MySQL扩展:MySQL数据库概述_MySQL
  6. SAP SD 定价过程的16个字段的作用说明
  7. Chrome View Source Code 那些事
  8. 业务处理速度变慢?且看IT如何成为救世主
  9. 最佳字符串对齐的Java实现
  10. 初识好朋友计算机课件,-精选版初识我们的好朋友——计算机.ppt
  11. 大型网站系统架构实践(六)深入探讨web应用集群Session保持
  12. 如何在计算机设置鼠标宏,鼠标宏怎么设置,详细教您鼠标如何设置宏
  13. 三十四、Expandable grid 可扩展的表格
  14. SQL分组排序函数(组内分别排序)
  15. UVM Primer Ch2 A Conventional Testbench for the TinyALU
  16. 玩家在地形上的位置同步给地图
  17. 小猫爬山(DFS+剪枝)
  18. 正则表达式叠字,过滤重复字
  19. python计算派的值_使用 Python 计算 π 值
  20. Tree-Shaking原理

热门文章

  1. Ubuntu侧边任务栏自动隐藏
  2. 使用B::Deparse模块对perl代码反汇编
  3. jquery调用click事件的三种方式
  4. 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过
  5. EasyUI-子页面增加显示tabs的一个问题
  6. Convert .Net Program To Mono
  7. Android开发之GridView的使用(解读谷歌官方API)
  8. 接口转发和重定向区别(一)
  9. Binder相关面试总结(二):Binder到底是什么?
  10. YOU SAY quot;THE RULE IS HEREquot;,BUT I SAY quot;WHY?quot;