13

我刚刚代表 SFDC 接受了德勤的安全审计。基本上我们使用 flex 并通过 AMF 进行通信。我们为此使用 FluorineFX(与 LCDS 和 Blaze 不同)。我们被告知,因为 AMF 响应没有编码,并且有人可以操纵 AMF 参数并插入 Javascript,这是一个 XSS 漏洞。我正在努力理解 AMF 响应如何返回,它可以在错误消息中回显传入的 JS,可以由浏览器或其他任何东西执行。我对带有 HTML 和 JS 的 XSS 非常有经验,但是看到它被标记为 AMF 有点令人惊讶。我与 FluorineFx 团队保持联系,他们也很困惑。

看到 AMF 库对响应数据进行编码,我会感到惊讶,而 Fluorine 肯定不会。尽管像 PortSwigger 和 IBM AppScan 这样的安全应用程序似乎在他们的工具箱中包含了这种类型的测试。您是否在 AMF 中遇到过这个漏洞,您能解释一下 XSS 问题是如何表现出来的吗?只是好奇。如果存在争论,我需要争论我的出路,或者修补漏洞。鉴于 Flex 的 AMF 用法,我认为您可能会有一些见解。

附加信息 ...

因此,请从实际供应商 PortSwigger 那里获得更多信息。我向他们提出了这个问题,net,net,他们承认这种类型的攻击非常复杂。最初他们将此归类为高严重性安全问题,但我认为他们现在正在改变。我想我会为大家发布他们的回复内容,因为我认为这个观点仍然很有趣。

--- 来自 PortSwigger 的问题 ---

感谢您的留言。我认为答案是这可能是一个漏洞,但利用起来并非易事。

你是对的,当 AMF 客户端使用响应时不会出现问题(除非它做了一些愚蠢的事情),而是如果攻击者可以设计一个浏览器使用响应的情况。大多数浏览器会忽略 HTTP Content-Type 标头,并会查看实际的响应内容,如果它看起来完全像 HTML 一样会很高兴地处理它。从历史上看,存在许多攻击,人们将 HTML/JS 内容嵌入其他响应格式(XML、图像、其他应用程序内容)中,并由浏览器执行。

所以问题不在于响应的格式,而在于生成它所需的请求格式。攻击者设计包含有效 AMF 消息的跨域请求并非易事。包含类似 XSS 行为的 XML 请求/响应也会出现类似的情况。创建一个被浏览器视为 HTML 的有效 XML 响应当然是可能的,但挑战在于如何在 HTTP 正文跨域中发送原始 XML。这不能使用标准的 HTML 表单来完成,因此攻击者需要找到另一种客户端技术或浏览器怪癖来执行此操作。从历史上看,这样的事情在不同的时间都是可能的,直到它们被浏览器/插件供应商修复。我目前不知道有什么可以允许的。

简而言之,这是一种理论上的攻击,根据您的风险状况,您可以完全忽略或阻止使用服务器端输入验证,或者通过在服务器上编码输出并在客户端再次解码。

我确实认为 Burp 应该将 AMF 请求格式标记为缓解此问题,并将影响降级为低 - 我会解决这个问题。

希望有帮助。

干杯 PortSwigger

--- 更多关于审计的信息 ---

portSwigger 所做的不一定是二进制有效负载,它们所做的是与发布到处理程序以引导请求的实际 AMF 参数混淆。例如,这里是审计的一个片段,它显示了 AMF 对请求的响应的一部分......

HTTP/1.1 200 OK
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
P3P: CP="CAO PSA OUR"
Content-Type: application/x-amf
Vary: Accept-Encoding
Expires: Tue, 06 Apr 2010 18:02:10 GMT
Date: Tue, 06 Apr 2010 18:02:10 GMT
Connection: keep-alive
Content-Length: 2595

......../7/onStatus.......
.SIflex.messaging.messages.ErrorMessage.faultCode.faultString
.faultDetail.rootCause.extendedData.correlationId.clientId.destination
.messageId.timestamp.timeToLive    body.headers.#Server.Processing..kFailed 
to locate the requested type 
com.Analytics.ca.Services.XXX5c2ce<script>alert(1)</script>9ccff0bda62..
....I506E8A27-8CD0-598D-FF6E-D4490E3DA69F.Id95ab281-d83b-4beb-abff-c668b9fd42d5
..fluorine.I04165c8e-f878-447f-a19a-a08cbb7def2a.A.q..@............
.        DSId.Aeb5eeabcbc1d4d3284cbcc7924451711.../8/onRes
...[SNIP]...

注意那里的“警报”脚本......他们所做的是将一些包含JS的脚本附加到传递的包含调用方法的参数之一,即“com.Analytics.ca.Services.XXX”。通过这样做,JS 会返回一条错误消息,但是要让 JS 接近执行,必须发生很多事情。充其量似乎是间接威胁。

-- 安全审计师的最新观点 --

我已经与更大的团队进行了讨论,我们都认为这是一次有效的攻击。正如 PortSwigger 在他的第一段中提到的那样,虽然理论上由于您将内容类型设置为 x-amf,并且希望它不会在浏览器中呈现,但大多数浏览器都会忽略此请求并无论如何都会呈现它。我认为供应商在很大程度上依赖于设置内容类型这一事实。然而,像 IE 和某些版本的 Safari 等流行浏览器会忽略这一点。

利用 CSRF 或任何其他形式的 XSS 攻击很容易触发攻击。

4

5 回答 5

10
  1. 它不可能是 JavaScript 注入,因为 Flash Player 中的什么会解释 JS?如果我们在播放器中有原生 JS 甚至 json 支持,flash 社区会欣喜若狂。actionscript 没有 eval 函数,更不用说 javascript

  2. 让我们假设他们的意思是你可以用 actionscript 注入它。AMF 协议不发送代码,它以原始类型或通用或类型化对象的形式发送数据模型。可能发生的最糟糕的事情是他们分析您的模型并添加其他数据。这将非常困难,因为您将无法注入数据,但必须解析所有数据,添加新数据,将其解析回来并保留 AMF 标头。因为 AMF 在其数据序列化中使用引用,这意味着当重复对象类型时,您将不得不看到第一个对象。然后引用是一个偏移量,这意味着添加代码的机会很小,而只会将值更改为现有参数。

  3. 远程对象有一个响应处理程序,它正在检查数据类型并期望将这些数据类型绑定到 ui 组件或您的代码所做的任何事情。如果这些数据类型错误,您将收到错误消息。如果 AMF 响应序列号错误,您将收到错误消息。如果在 amf 数据报中没有完美地形成任何内容,您将收到错误消息。

  4. 远程对象自动重试。如果“注入”代码需要很长时间,Flex 将重新发送一条消息并使需要很长时间的消息无效。

只是我的两分钱。作为一名 AMF 开发人员,我经常希望很容易使用 amf 数据报进行调试和测试。不幸的是,你会得到一个错误。

韦德·阿诺德

于 2010-06-21T22:34:34.120 回答
2

您似乎在这里回答了您自己的疑问。

因此,您有一个服务器端实现,它将参数传递给 amf 函数调用,并将输入数据包含在返回的输出中的某处。

我很欣赏这在很大程度上是一种理论上的攻击,因为它涉及让有效负载由浏览器呈现,而不是进入 amf 客户端。甚至可能需要浏览器/插件中的其他漏洞才能启用此方案。只要浏览器将输出处理为 html/js,也许通过 gateway.php 之类的 CSRF 帖子或类似的帖子很容易被滥用。

但是,除非您需要调用者能够将尖括号传递到响应中,否则只需 html 编码或剥离它们,这种攻击场景就会消失。

不过这很有趣。通常,人们会仅为预期的数据使用者执行输出编码,但有趣的是,考虑到浏览器通常可能是一种特殊情况。这确实是一种极端情况,但我完全赞成人们养成对他们不受信任的输入进行清理和编码的习惯。

这在很多方面让我想起了跨协议注入可以用来滥用 smtp 等协议的反射能力在浏览器中实现 XSS 的方式。见http://i8jesus.com/?p=75

于 2010-06-23T09:30:12.370 回答
1

我认为这是一个有效的攻击场景。一个相关的攻击是GIFAR,其中 JVM 被愚弄将 gif 文件视​​为 jar。另外,我不认为输出编码是解决问题的正确方法。

攻击的前提是欺骗浏览器认为 AMF 响应是 HTML 或 Javascript。这是可能的,因为一个名为MIME 类型检测的功能,本质上是浏览器说“开发人员可能不知道内容类型,我会扮演上帝并(可能不正确地)找出 MIME 类型”。

为了使其工作,以下需要成立 -

  1. 攻击者应该能够使用 HTML 技术(如<script>or<frame><a>标记)向您的 AMF 服务器发出 GET 或 POST 请求。XmlHttpRequest 或 Flash 或 Silverlight 等技术不算在内。
  2. 攻击者应该能够在响应的前 256 个字节左右插入恶意内容。此外,这种恶意内容应该能够欺骗浏览器,使其认为响应的其余部分实际上是 javascript 或 html。

那么,如何预防呢?

最好首先确保攻击者无法发出请求。一个非常简单有效的方法是在发出 AMF 请求时添加一个 http 请求头,在服务器上检查它是否存在,如果不存在则拒绝该请求。该值可以是硬编码值,不需要保密。这是可行的,因为没有通过标准 html 技术添加自定义请求标头的已知方法。您可以通过 XmlHttpRequest 或 flash 或 silverlight 执行此操作,但浏览器不会为您解释内容类型,所以没关系。

现在,我对 AMF 了解不多,但如果它已经添加了请求标头 - 那么这种攻击场景是不可能的。如果不是,添加一个是微不足道的。

HTML 转义内容不是一个好的解决方案。据称,有多种方法可以诱使浏览器认为响应实际上是 HTML。换句话说,恶意输入不需要是格式良好的 HTML。尝试谷歌搜索 mime 嗅探,您应该能够找到各种欺骗浏览器的方法。

于 2010-06-24T08:58:16.663 回答
1

我无法解释有人会如何利用这种“漏洞”。

但是,通过 HTTPS 连接而不是直接的 HTTP 传递数据,您能否让他们满意地解决这个问题?假设您在服务器上安装了 SSL 证书并启用了 HTTPS,这应该是您编译到 Flex 应用程序中的 services-config.xml 文件中的微小更改。

我联系了我的一位 Adob​​e 同事,希望他能提供更多见解。

于 2010-06-21T21:56:52.593 回答
0

我不知道在 AMF 响应流中更改数据的可能性有多大,但您可能希望确保无法通过与浏览器和/或 JavaScript 的通信来操纵您的端点。查看恶意数据注入部分下的这篇文章。

于 2010-06-22T03:39:03.267 回答