导语:在这篇文章中,我将通过详细的步骤来截取、检查、修改和重演基于Flash的web应用程序。出于演示目的,我选择了一个21点 (Blackjack)的纸牌游戏。我将努力控制哪些牌应该处理,以及如何计算游戏得分。
在这篇文章中,我将通过详细的步骤来截取、检查、修改和重演基于Flash的web应用程序。出于演示目的,我选择了一个21点 (Blackjack)的纸牌游戏。我将努力控制哪些牌应该处理,以及如何计算游戏得分。
本文的目的是展示一个渗透测试员如何处理一个Flash应用程序,寻找可以修改的客户端代码,以实现意想不到的结果。
渗透测试步骤如下:
1.截取.SWF文件并在本地使用代理保存它;
2.解压使用了反编译器的.SWF文件;
3.修改代码以改变应用程序的运行结果;
4.重演通过有效的HTTP进行会话的.SWF。
重要提示:在本文中,我使用的是一个免费的在线21点游戏。我选择的网站是不带有赌博的正规性质的网站,不会试图访问或修改受限制的资源。
设置
虽然我使用的是Mac,但我提到的每个工具在Linux和Windows上都同样适用。但在实践中,我需要使用到:
1.Burp套件:你应该熟悉这个,安装它,并将你的web浏览器配置为通过它来代理请求。点此下载它。
2.ffdec:它是一个免费开源的.SWF反编译软件,在Windows、Linux、Mac上都能用。点此下载它,提前准备好。
3.本文用到的特殊文件,点此下载,把它保存到你的电脑上,后面需要它。
截取.SWF文件
配置你的web浏览器并通过Burp发送请求。这样,你就不需要将“截取”设置为on。允许请求自由地通过。
清除浏览器中的缓存之后,我需要从头开始加载 .swf 文件,如果你最近已经加载了它,可以先缓存。
现在浏览包含Flash应用程序的站点,并等待它完全加载。在Burp的“代理”选项卡下查看“HTTP历史”。你应该在“扩展”列下面有一个带有“swf”的项。
如上所示,选择该行,并查看下面的“Response”>“header”选项卡。你应该看到一堆随机的垃圾——这是.SWF文件的编译内容。右键单击出现的内容,并从出现的上下文菜单中选择“Copy to file”。
我把blackhack.swf保存在我的桌面。
不过要注意的是,你也可以访问文件系统中的.swf 文件的缓存版本。鉴于一致性和可靠性我更喜欢代理方法。
使用反编译器解压.swf 文件
假设你应该已经安装了ffdec并把以上提到的那个特殊文件保存到你的电脑上了。启动ffdec并选择“设置”>“高级设置”>“路径”。
查看显示PlayerGlobal(. swc)路径的项,单击文件夹图标,导航到你下载的文件。它应该是这样的(我混淆了我的homedir名称):
保存此设置后,可能需要重新启动应用程序以继续下一步。
这样,你就可以简单地选择“打开”并到“blackhack.swf” 文件浏览。如果你正确地保存了标头(完整的,不仅仅是一个选项),那你应该会看到如下的视图:
修改代码以改变应用程序的运行结果
这取决于你正在测试的应用程序,因为你需要花一些时间来浏览所有的文件夹,特别是那些含有“脚本”的文件夹。
我发现了一个名为“Play”的脚本,它似乎有维持这个纸牌游戏运行的主要函数。
于是,我想看看在客户端是否处理得分和出牌选择等问题。如果是这样,我应该能够修改游戏的结果。
如下所示,我已经找到了一个可以修改的简单代码片段。这个Array对象看起来是在描述一副扑克牌里的方块,红心和黑桃。
点击代码下面的“编辑ActionScript”选项,我可以把Array对象“this.arrSuit”修改为只能处理一种牌。这样我就知道了游戏是由客户端控制而不是服务器处理的。
修改后,点击代码下面的“保存”和菜单栏中的“保存”是很重要的。第一个保存了单个脚本,第二个保存是把该脚本又写回到了.swf包。
现在可以安全的关闭应用程序了,没有必要重新打包或重新编译,这个ffdec的内联编辑相当的灵活。
重演通过有效的HTTP进行会话的.SWF
我现在需要web站点,利用一个有效的会话执行我上面修改过的游戏。如果有服务器交互,比如发布高分数或收集得分奖励,这可能很重要。
完全清除浏览器缓存,关闭并重新启动浏览器。这样你的.SWF此时肯定是缓存的,这将阻止你完成接下来的步骤。
进入Burp,打开“截取”选项。此时,你把修改过的Flash应用重新放回网站,并重新加载,但这一过程,你需要手动“Forward”每个请求。能够进行Flash游戏的网站通常有大量的广告,所以你可能需要清除一些随机的请求。
我正在寻找的包含.swf 文件的GET请求,看起来像这样:
当你看到上图时,你需要右键单击原始文本框,并选择“截取”>“响应此请求”,这样我就能在应用程序到达浏览器之前修改它。
完成之后,可以点击“Forward”。
根据你浏览器中正在进行的其他进程,你可能需要点击转发才能超越排队的其他随机流量(浏览器插件等)。留心观察,你会发现对 http:///……..<your swf file>的反应。
此时,我基本上要对第一步中所做的进行逆转。还记得header中所有的垃圾文本吗?选择并全部删除。现在应该是这样的:
现在在空白区域右击并选择“从文件中粘贴”。
选择我之前修改过的blackhack.swf文件,它应该填充着空白区域备份与垃圾,现在可以选择“Forward””,并将“截取”关闭。
纸牌游戏现在应该已经载入你的浏览器,你可以看到代码修改是否影响到游戏。正如你从下图所看到的,我正在从面板上发牌。
游戏积分作弊
显然,当帮助开发人员了解了为什么应该在服务器上控制这种类型的信息时,我希望展示一些更有影响力的东西。
我发现了另一段代码为每张牌分配一个游戏积分。 这是一个非常快速的作弊方法,可以确保每张牌的值为10。
这个特定的纸牌游戏每次都需要花费一些时间来处理一个blackjack进程,因为该进程内置了一个逻辑,如果一张牌已经被处理了,那紧接着就会按照逻辑进行下一步。但是,当我完全控制游戏进程和积分逻辑时,游戏就会完全被控制。