flash(swf)安全总结

前言:Adobe Flash 2017年7月25号,在官方博客上宣布到2020年底停止更新Flash,鼓励开发者尽早使用新的标准( HTML5、WebGL 和 WebAssembly)进行开发

然而现在还有许多视频站正在使用flash作为播放器,故本文还是归纳了部分利用flash(swf)的姿势,与大家交流

0、flash(swf)以宿主域出发(而不是使用域)判断 是否为跨域请求。

A站上的flash文件http://www.a.com/vul.swf, 被B站http://www.b.com/exp.htm拿去使用。此时vul.swf请求a站上的资源是不需要提前获取http://www.a.com/crossdomain.xml判断是否有权限,反而vul.swf请求b站上的资源却需要提前判断是否有权限。这一点与js不同。

1、假若A站上有个上传图片的功能,仅仅作了文件扩展名判断,不允许上传除jpg、png以外的文件

B站攻击者可以将exp.swf改名为exp.png,上传exp.png到A站d的cdn存储http://www.acdn.com/exp.png。然后加载http://www.acdn.com/exp.png到http://www.b.com/attack.html

由于http://www.a.com/crossdomain.xml的白名单列表里面有*.acdn.com,所以http://www.acdn.com/exp.png发送请求到www.a.com不存在跨域问题。发送请求到http://www.a.com/personinfo(浏览器自动携带cookie),将会获取到返回的所有内容。甚至可以模拟用户任意操作。(但发出的请求,会携带referer:http://www.b.com/attack.htm

,X-Requested-With: ShockwaveFlash/28.0.0.126等http头,可以用来进行安全防护 )

简单poc (链接失效,内容为actionscript以target为参数发送http请求)

cs.png实际内容为flash,会发送请求到info.victim.com,返回的数据传给default_callback回调函数


简单防护:①判断上传文件的mime类型  ②上传文件保存在非crossdomain.xml白名单的域  ③重要操作,根据referer判断来源

2、若A站存在大量swf文件,其中一个vul.swf文件代码中设置了allowDomain为*星号

如图


攻击者可以构造attack.swf,反射调用vul.swf中的request(public)函数,(该函数会加载网络资源,且url参数可控),如下


调用request(‘http://www.a.com/personInfo’, getData), 可取得返回的私密信息

简单poc如下,更多关于flash反射调用,参见https://www.cnblogs.com/index-html/p/swf-reflect-priv.html


简单防护:①排查存在allowDomain的swf文件,将request函数设置private属性

另外,通过ExternalInterface.call(“(function (){return window.location.host})”);方式判断host是否在白名单方式,不可行,因为前端js可以劫持__flash__toXML函数,返回任意host,如下方式:


3、开源swf组件产生的xss

clipboard.swf,swfupload.swf等,更多

实例:https://github.com/zeroclipboard/zeroclipboard/issues/14

ZeroClipboard.swf从url中获取参数,传给调用ExternalInterface.call函数,实际上浏览器的执行过程为try { __flash__toXML(ZeroClipboard.dispatch(“id”)); } catch (e) { “”; },由于没有过滤参数中的反斜杠\,在flash与js交互中,反斜杠跳过了__flash_toXML函数的限制,导致xss,如下

chrome开发者工具中Ctrl+Shift+F可以调出全局搜索工具,设置search in anonymous and content scripts,可以发现__flash__toXML的调用过程

swfxss挖掘:反编译swf,搜索可疑函数

AS3 获取参数:\.(root|loaderInfo|parameters)[^\w]|[^\w](root|loaderInfo|parameters)\.AS2 获取参数 (remember undefined inputs –follow the sinks):\.(_root|_global|_level0)[^\w]|[^\w](_root|_global|_level0)\.xss: (getURL|ExternalInterface\.call|navigateToURL|\.htmlText)敏感函数:(XMLLoader|AMFService|SWFLoader|loadVariables|loadMovie|loadMovieNum|LoadVars\.load|LoadVars\.send|NetStream\.play|getDefinition|getDefinition|FScrollPane\.loadScrollContent|XML\.load|Sound\.loadSound|NetStream\.play|URLRequest|URLLoader|URLStream|LocalConnection|SharedObject)可疑字符串:(allowInsecureDomain|allowDomain|ExternalInterface|load|xml|sql|url|flashvar|pass|TextField|encr)

练手swf文件:https://github.com/irsdl/Flash-Files-Vulnerability-Database/tree/master/Samples


4、Flash 307跳转 绕过http自定义头限制

Ajax发送跨域请求时:

1、增加xmlhttp.withCredentials = true,可以发送带cookie的请求到服务器(且服务器会处理,有CSRF问题)。若服务器没有设置Access-Control-Allow-Origin,ajax无法获取到响应数据

2、设置xmlhttp.setRequestHeader(‘Content-Type’, ‘application/json’)(需要在xmlhttp.open执行之后执行此语句)。浏览器会先发送option请求到服务器,获取服务器设置的Access-Control-Allow-Headers,若没有设置content-type,则请求无法发送出去

(注:设置Content-Type: text/plain不受限制,但’Content-Type’, ‘application/json’受限)

而Flash刚好可以设置http头,且Flash在处理服务器的307跳转时,会将全部信息(包括自定义http头)转发到目标服务器

(flash不能设置referer, origin等http标准头)

攻击者构造swf文件,如下

先发送请求到www.b.com/test.php,而test.php会返回一个307跳转到目标A站


此时Flash会携带着content-type头发送请求到www.a.com,以此可以绕过根据content-type等http头来防护CSRF的网站。


that‘s all, 欢迎大牛来留言补充

猜你喜欢

转载自blog.csdn.net/haoren_xhf/article/details/80050901