我刚刚代表SFDC对Deloitte的安全审计工作进行了抨击.基本上我们使用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的更多信息.我向他们提出了问题,网,网,他们承认这种类型的攻击非常复杂.最初他们将此归类为高严重性安全问题,但我认为他们的调整现在正在发生变化.我以为我会发布他们回复的内容,因为我觉得这个观点很有意思.
---来自PortSwigger的问题---
谢谢你的留言.我认为答案是这可能是一个漏洞,但开发并非易事.
你是对的,当AMF客户端使用响应时(除非它做了一些愚蠢的事情),问题不会出现,而是攻击者可以设计出浏览器使用响应的情况.大多数浏览器都会忽略HTTP Content-Type标头,并会查看实际的响应内容,如果它看起来像HTML一样会很乐意处理它.从历史上看,人们已经存在大量攻击,其中人们将HTML/JS内容嵌入到其他响应格式(XML,图像,其他应用程序内容)中,这是由浏览器执行的.
所以问题不在于响应的格式,而在于生成它所需的请求格式.攻击者设计包含有效AMF消息的跨域请求并非易事.XML请求/响应也会出现类似的问题,其中包含类似XSS的行为.当然可以创建一个有效的XML响应,它被浏览器视为HTML,但挑战在于如何在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]...
Run Code Online (Sandbox Code Playgroud)
注意那里的"alert"脚本......他们所做的是将一些脚本附加JS附加到传递的参数之一,其中包含要调用的方法即'com.Analytics.ca.Services.XXX'.通过这样做,JS返回了一条错误消息,但是有很多事情要发生在JS上以便接近执行.似乎是间接威胁.
- 安全审计员的最新观点 -
我和更大的团队讨论过,我们都认为这是一次有效的攻击.正如PortSwigger在他的第一段中提到的那样,理论上,因为你将内容类型设置为x-amf,并希望它不会在浏览器中呈现,大多数浏览器都会忽略此请求并无论如何呈现它.我认为供应商在很大程度上依赖于内容类型设置的事实; 然而,像IE和某些版本的Safari这样的流行浏览器会忽略这一点.
通过利用CSRF或任何其他形式的发起XSS攻击可以轻松触发攻击.
我正在构建一个WP7应用程序来拍照并使用RTMP将图像上传到第三方服务器.不幸的是,我找不到任何合理的Windows Phone 7 RTMP客户端实现.
我已经下载了WebOrb,但似乎WPO库的WebOrb不支持RTMP.此外,我无法将Silverlight DLL集成到我的WP7应用程序中.
我也查看了FluorineFX,但它也没有WP7的版本.
您能否建议另一个在WP7上提供RTMP的库,或者让上述库与WP7一起工作的方法?
我无法弄清楚如何在客户端上使用FluorineFx将音频流从客户端发布到服务器.我们希望通过已建立的NetConnection将记录的音频数据从客户端传输到流.FluorineFx中有一个NetStream类,但它没有发布方法.FluorineFx中的NetStream类只有play方法.但据我所知,这会在客户端上播放来自服务器的流.
发布是不是在FluorineFx中实现还是我错过了什么?
我刚刚从经典模式切换到集成模式,现在我的ASP.NET应用程序中似乎不存在HttpContext.我甚至无法向HttpContext添加Watch,也不能添加HttpContext.Current.
我正在使用FluorineFX,在Web.config中定义了一个HttpModule.显然,在IIS7集成模式下,需要将这些HttpModule添加到System.WebServer中的Modules部分.我已经这样做了,但现在我遇到了这个HttpContext问题......
任何想法为什么会发生这种情况?
代码在Flex(amf)调用的简单服务类中.
if (HttpContext.Current.User.Identity != null)
{
...
Run Code Online (Sandbox Code Playgroud)
Web.Config(我不知道如何在Stack中正确显示这个...):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<sectionGroup name="fluorinefx">
<section name="settings" type="FluorineFx.Configuration.XmlConfigurator, FluorineFx" requirePermission="false"/>
</sectionGroup>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
</sectionGroup>
</configSections>
<cachingConfiguration configSource="WebCachingConfiguration.config"/>
<dataConfiguration defaultDatabase="ConnectionString"/>
<spring>
<context>
<resource uri="~/spring/Commands.xml"/>
<resource uri="~/spring/Management.xml"/>
<resource uri="~/spring/DomainModel.xml"/>
<resource uri="~/spring/Repositories.xml"/>
<resource uri="~/spring/Services.xml"/>
<resource uri="~/spring/MsmqQueues.xml"/>
<resource uri="~/spring/MsmqMessageQueueTemplates.xml"/>
<resource uri="~/spring/Jobs.xml"/>
</context> …
Run Code Online (Sandbox Code Playgroud)