当前位置: 首页 > 科技观察

一种Flash中XSS检测的自动化方法探讨

时间:2023-03-13 00:11:42 科技观察

0x00前面的话,对于如何检测Flash中的XSS,无论是使用成型的自动化工具(如swfscan)还是开发自动化工具,每个人都有自己的方法自己(先反编译,然后审核actionscript代码)或直接手动审核代码。两者都能够检测Flash中的XSS漏洞。但是,这些方法都存在一些问题,例如:自动化工具属于静态分析,误报率比较高,需要大量的人工分析。完全人工的结果是最好的,但也会消耗更多的能量。这里我们将讨论Flash的动态检测。XSS中XSS的方法有其自身的优势,但也有明显的劣势,因此本文标题定位为“讨论”。所谓0x01原理的动态检测就是通过程序加载Flash插件,然后加载Flash文件,抓取事件和错误信息,然后分析信息判断是否存在XSS漏洞闪光。先看下面两张图,以Firefox浏览器为例:Firefox访问http://test.com/xss.swf?alert=1,Flash执行JS代码成功,弹出对话框。Firefox访问http://test.com/xss.swf?alert=1\",Flash执行JS错误,并显示错误详情。Firefox在Flash执行JS错误时,可以显示详细的错误信息。这里可以了解检测原理是:◆程序调用Firefox◆Firefox加载Flash插件◆Firefox访问参数构造的Flash链接,如http://test.com/xss.swf?alert=1\"◆程序捕获错误信息或alerts事件◆根据报错信息或alert事件信息判断Flash是否存在XSS漏洞。具体实现如何实现?我们不会真正调用Firefox,而是直接使用一套可以解析JS的开源工具包:CasperJS。我们来看看CasperJS官网上的介绍:CasperJS是一个用Javascript编写的开源导航脚本和测试工具,用于PhantomJSWebKit无头浏览器和SlimerJS(Gecko)。CasperJS目前支持两种引擎:PhantomJS(WebKit内核)和SlimerJS(Gecko内核)。Gecko内核是Firefox使用的内核,我从CasperJS文档中了解到,在使用SlimerJS引擎时,可以通过loadPlugins加载Flash插件。所以我们可以使用CasperJS来满足我们的功能需求。下面是代码实现:flash_detect.jsvarcasper=require('casper').create({pageSettings:{loadImages:true,loadPlugins:true//loadflashplugin},logLevel:"info",verbose:false});casper.start('about:blank',function(){});//catchalertcasper.on('remote.alert',function(message){this.echo('{"type":"alert","msg":"'+message+'"}');});//catchpageerrorinfocasper.on('page.error',function(message,trace){this.echo('{"type":"error","msg":"'+message+'"}');});varurl=casper.cli.get(0);casper.thenOpen(url,function(){this.wait(2000,function(){})//delay2的});casper.run();代码很简单,就是通过CasperJS访问Flash文件,然后捕获页面中的错误信息和告警事件。这里需要注意的是有些Flash不会立即执行JS代码,所以我们打开一个Flash文件后会在当前页面停留2秒。0x03执行效果下面用这个检测代码查看Flash文件看看效果,如下:piacaatpiacain~/source$casperjs--engine=slimerjsflash_detect.js"http://test.com/xss.swf?alert=1"{"type":"alert","msg":"1"}piacaatpiacain~/source$casperjs--engine=slimerjsflash_detect.js"http://test.com/xss.swf?alert=1\\\""{"type":"error","msg":"SyntaxError:missing)afterargumentlist"}0x04写在后面,其实我访问了网上的一些业务,抓取里面的Flash,然后使用程序来检测,效果还是不错的,当然这也包括我们自己业务中的FlashXSS漏洞,但是目前的检测程序只能是一个Demo,如果要在生产环境中使用,下面需要解决的问题:效率:目前是单进程,单线程检测会影响检测效率,同时由于SlimerJS会开一个GUI窗口,所以也会在一定程度上影响效率n程度;Falsepositives:在demo中,我们没有处理过多的错误信息,所以在实际测试中会有对比。许多误报;parameters:这里的参数只是Flash文件接收到的参数。我们可以通过日志分析等方式快速获取业务中的Flash文件,但是如何获取Flash接收到的所有参数名呢?以上问题不是致命的我们可以通过多种方式解决问题,但是如前所述,这个检测程序有一个致命的缺点,就是:这个检测脚本只能检测明显的XSS漏洞,如果对其中的参数进行一定的处理Flash所以本文只讨论Flash中XSS漏洞的自动检测。