我刚刚代表 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 攻击很容易触发攻击。