视图状态反序列化漏洞

时间:2019-06-08 16:30:49

标签: asp.net deserialization viewstate system.web

最近,当我们在应用程序上运行安全扫描时,当用户注入易受攻击的有效负载时,我们发现了一些与反序列化有关的严重缺陷。我们的应用程序是在标准ASP.NET和.Net框架4.5中开发的-我们没有使用由我们构建的任何类型转换器来进行序列化或反序列化,并且我们也没有通过自己的应用程序逻辑在viewstate中存储任何自定义/复杂的对象。仅涉及losformatter支持的viewstate类型的对象类型。应用程序托管在单个服务器上,而不是Web场托管。

下面列出的安全工具报告的反序列化问题。

HTTP响应指示应用程序可能正在使用 ObjectStateFormatter 库/ API反序列化数据。攻击者可能能够向应用程序提供任意序列化的对象,如果未经适当的事先验证对序列化的对象进行反序列化,则可能导致任意代码执行。考虑使用Freddy有效负载生成器对给定请求中的序列化数据执行主动扫描或Intruder攻击,以验证应用程序是否容易受到RCE攻击。请注意,LosFormatter在后台使用ObjectStateFormatter,并且此模块支持对两个反序列化API的利用。

对注入的有效负载请求的响应最终以500个内部服务器,无效的视图状态异常和低于堆栈跟踪的状态从错误异常响应中突出显示(完整的响应仅突出显示了主要点)。

invalid view state exception
System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +118
System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) +525
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Deserialize(String serializedState, Purpose purpose) +13
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) +40
System.Web.UI.HiddenFieldPageStatePersister.Load() +222
System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +224

我们已经采用了以下逻辑来验证不良数据或篡改的视图状态。

  1. 仅接受受信任的数据-(白名单和长度的组合 检查每个字段)。
  2. 已生成机器密钥验证,并且对于单个站点是静态的。视图状态始终被加密,并且web.config的system.web下的页面config标记如下所示。
  

页面enableViewState =“ true” enableViewStateMac =“ true”   validateRequest =“ true” viewStateEncryptionMode =“始终”

以上2点是否对缓解这种风险有好处?请告知。

当LOSformatter使用MAC验证来验证签名并且ObjectStateformatter执行签名,加密和验证任务时,我们能否缓解此问题?假设黑客没有完成MAC的详细信息(验证密钥,解密密钥,机器密钥标签中使用的验证和解密算法),他就无法准备成功的有效负载来注入易受攻击的命令以在应用程序主机操作系统上执行。

请让我知道,是否有任何方法可以在.net框架反序列化视图状态之前以某种方式验证视图状态,并通过某种模式消除任何易受攻击的数据?请告知。

0 个答案:

没有答案