首页 > 解决方案 > ASP.NET - 一些代码的安全反射 XSS 问题

问题描述

在我工作的地方,他们使用名为 checkmarx 的应用程序来分析应用程序的安全性

在其中一项分析中,应用程序检测到以下问题:

反射型 XSS 所有客户端:

应用程序的 GetBarcosNaoVinculados 在 .../Controllers/AdminUserController.cs 的第 1243 行使用 Json 将不受信任的数据嵌入到生成的输出中。这种不受信任的数据直接嵌入到输出中,没有经过适当的清理或编码,使攻击者能够将恶意代码注入到输出中。攻击者只需在用户 inputusuarioId 中提供修改后的数据即可更改返回的网页,该数据由 .../Controllers/AdminUserController.cs 的第 1243 行的 GetBarcosNaoVinculados 方法读取。然后,此输入通过代码直接流向输出网页,无需进行清理。

public JsonResult GetBarcosNaoVinculados(string usuarioId)              
.....
.....
 return Json(barcosNaoVinculados, JsonRequestBehavior.AllowGet)

在系统的其他地方,它给出了同样的问题,但使用这两种方法

应用程序的 LoadCodeRve 在 .../BR.Rve.UI.Site/Controllers/InfoApontamentoController.cs 的第 738 行使用 SerializeObject 将不受信任的数据嵌入到生成的输出中。这种不受信任的数据直接嵌入到输出中,没有经过适当的清理或编码,使攻击者能够将恶意代码注入到输出中。攻击者可以通过提前将恶意数据保存在数据存储中来更改返回的网页。然后在 .../Repository/Repository.cs 的第 78 行使用 Buscar 方法从数据库中读取攻击者修改后的数据。然后,这些不受信任的数据通过代码直接流向输出网页,无需进行清理。

public virtual IEnumerable<TEntity> Buscar(Expression<Func<TEntity, bool>>predicate)
   return Dbset.Where(predicate);

public string LoadCodeRve()
  return JsonConvert.SerializeObject(items);

似乎与对 JSON 格式的处理有关,有人知道如何处理此类问题吗?

标签: c#asp.net-mvcsecuritycheckmarxsecure-coding

解决方案


正如警告消息所示,您需要执行某种形式的输入验证(或清理),并且还需要作为安全编码最佳实践 - 在将输出呈现到页面之前进行输出编码。Checkmarx 搜索这些“消毒剂”的存在,这些是在他们的 Checkmarx 查询中预定义的。一个例子是使用 AntiXSS 库(即JavascriptEncode函数)

Checkmarx 已经指出了需要注意的两条关键线:

return Json(barcosNaoVinculados, JsonRequestBehavior.AllowGet)

return JsonConvert.SerializeObject(items);

无论这些值(JSON 还是字符串)最终会出现在哪个页面上,都需要对其进行转义。现在,根据您使用的模板引擎,您可能已经获得即时 XSS 保护。例如,“MVC 中使用的 Razor 引擎会自动编码来自变量的所有输出,除非你非常努力地阻止它这样做。” 当然,除非您使用 Html.Raw 辅助方法。

作为应用程序安全的推动者,我们相信不信任输入并拥有多层防御,因此我的建议是明确表明您希望通过传入 JsonSerializerSettings 参数来对输出进行编码:

return JsonConvert.SerializeObject(items, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml });

这里唯一的困境是 Checkmarx 可能无法识别这是一种消毒剂,因为它可能不在他们预定义的消毒剂列表中。您始终可以将此解决方案作为参数提供给运行安全扫描的安全团队

对于 JsonResult 返回的情况,您可能需要对 barcosNaoVinculados 变量进行 javascript 编码:

return Json(HttpUtility.JavaScriptStringEncode(barcosNaoVinculados), JsonRequestBehavior.AllowGet)

现在,这太 Checkmarx 可能无法识别。您可以尝试使用 Checkmarx 识别的那些(即 Encoder.JavascriptEncode 或 AntiXss.JavascriptEncode),但我认为这些 Nuget 包不适用于您的项目类型


推荐阅读