本文为2018年十大网络黑客技术题名文章,欢迎读者来读
ASP.NET应用程序中的资源文件通常用于本地操作。 它们可用于存储用户界面对象或字符串,并可以轻松地进行语言转换工作。这些资源文件使用.resx
扩展名。 这些.resx文件
可以进行编译以供应用程序使用。编译后的文件修改扩展名为.resources
。
这些资源文件是XML格式,但它们可以包含序列化对象。 二进制对象可以序列化并以.64文件格式存储在base64编码格式中。 资源支持BinaryFormatter
,SoapFormatter
和TypeConverters
,它们都可以被利用进行反序列化以便加载外部文件。有关资源文件的Microsoft的更多信息可以在线阅读。
由于过去已经提到过.resx文件中的反序列化问题, 因此这篇博文旨在更详细地讨论这种攻击方法,以提高对它的认识。
本研究中使用的分析灵感来自于AlvaroMuñoz
和Oleksandr Mirosh
撰写的白皮书,截止到周五已经有13次JSON攻击发生。
补丁与现存问题
我最初在2018年1月向Microsoft报告了资源文件(.resx和.resources)中的一些反序列化问题。在2018年7月,由于不安全地处理资源文件,微软向许多产品发布了补丁(CVE-2018-8172,CVE-2018-8172和 CVE-2018-8300)
,例如SharePoint
和Visual Studio
。
这里是详细的动态图片。
自2018年7月份补丁以来,我们就无法在Visual Studio
中直接打开具有Web标记(MOTW的.resx
和.resources
文件。 当MOTW
存在时,resgen.exe
工具也会显示错误,而winres.exe
工具始终显示警告消息。 值得我们注意的是,从压缩文件中提取或由IE或Edge之外的浏览器下载的资源文件可能没有MOTW,应该小心处理。
Microsoft Developer Network(MSDN)
中的System.Resources
命名空间文档也已更新,包括ResourceManager
,ResourceReader
和ResourceSet
方法的安全说明:
“使用不受信任的数据调用此方法存在安全风险。请使用受信任的数据调用类中的方法。 有关更多信息,请参阅“不受信任的数据安全风险”。
应该注意,System.Resources
方法尚未更改。 因此,所有使用ASP.NET
库来读取,编译或反编译资源文件的应用程序若接受用户提供的资源,则可能受到攻击。
System.Resources命名空间是如何受到影响的?
由于无法事先确定资源文件中的序列化对象类型,因此我们无法通过不安全的反序列化来防止代码执行。 虽然使用BinaryFormatter
可以进行适当的防护。由于SoapFormatter
或TypeConverters
可以用作替代方法,所以我们无法防御所有的攻击。
资源文件还可使用UNC路径指向本地文件或共享资源。 处理这些文件时可能会导致文件枚举
或SMB哈希劫持
的情况。 当客户端工具成为目标时,SMB哈希劫持
的风险可能会更高。
由于.resx
文件是基于XML
的,因此在使用普通XML库读取资源文件时,自定义解析器可能容易受到XML外部实体(XXE)攻击
。 但是,默认情况下,ResXResourceReader
类使用不处理文档类型定义(DTD)部分的XmlTextReader
。
技术细节
我们可以使用数据和元数据标记的mimetype
属性在资源内反序列化对象。 此外,type属性可用于使用TypeConverters
反序列化对象。
BinaryFormatter和SoapFormatter反序列化
BinaryFormatter
和SoapFormatter
反序列化在以下情况下,使用BinaryFormatter
(System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
)对资源文件中的对象进行反序列化:
mimetype
属性为数据标记提供空值 。mimetype
属性是以下数据或元数据标记的属性之一:application/x-microsoft.net.object.binary.base64
text/microsoft-urt/psuedoml-serialized/base64
text/microsoft-urt/binary-serialized/base64
在以下情况下,使用SoapFormatter(System.Runtime.Serialization.Formatters.Soap.SoapFormatter)
对资源文件中的对象进行反序列化:
mimetype
属性是数据或元数据标记的以下属性之一:
- application/x-microsoft.net.object.soap.base64