在我工作的地方,他们使用名为checkmarx的应用程序来分析应用程序的安全性。
在其中一个分析中,应用程序检测到以下问题:
反映XSS所有客户:
应用程序的GetBarcosNaoVinculados将不受信任的数据嵌入到Json生成的输出中,位于./Controller/AdminUserController.cs第1243行。这些不受信任的数据直接嵌入到输出中,而不需要适当的清理或编码,从而使攻击者能够将恶意代码注入输出。攻击者只需在用户inputusuarioId中提供修改过的数据即可更改返回的网页,该数据由GetBarcosNaoVinculados方法在./Controller/AdminUserController.cs的第1243行读取。然后,这个输入直接通过代码流到输出网页,而不需要清除。
public JsonResult GetBarcosNaoVinculados(string usuarioId)
.....
.....
return Json(barcosNaoVinculados, JsonRequestBehavior.AllowGet)在系统的其他地方,它给出了同样的问题,但是使用这两种方法。
在.../BR.Rve.UI.Site/Controllers/InfoApontamentoController.cs.的第738行,应用程序的LoadCodeRve将不受信任的数据嵌入到生成的输出中,并使用SerializeObject这种不受信任的数据直接嵌入到输出中,而不进行适当的清理或编码,使攻击者能够将恶意代码注入output.The攻击者将能够提前将恶意数据保存到数据存储中,从而更改返回的网页。然后,通过Buscar方法从数据库读取攻击者修改的数据,其中第78行为./Repository/Repository.cs。然后,这些不受信任的数据通过代码直接流到输出网页,而不需要清理。
public virtual IEnumerable<TEntity> Buscar(Expression<Func<TEntity, bool>>predicate)
return Dbset.Where(predicate);
public string LoadCodeRve()
return JsonConvert.SerializeObject(items);这似乎与对JSON格式的处理有关,有人知道如何处理这类问题吗?
发布于 2020-10-21 04:10:18
如警告消息所示,在将输出呈现到页面之前,您需要执行某种形式的输入验证(或清理),以及作为一种安全的编码最佳实践--输出编码。Checkmarx搜索这些“杀菌剂”的存在,并在其Checkmarx查询中预先定义。例如,一个例子是使用AntiXSS库(即JavascriptEncode函数)。
Checkmarx已经指出了需要注意的两条关键线:
return Json(barcosNaoVinculados, JsonRequestBehavior.AllowGet)和
return JsonConvert.SerializeObject(items);无论这些值(JSON或String)将以哪个页面结束,都需要转义。现在,根据您正在使用的模板引擎,您可能已经得到了即时的XSS保护。例如,“MVC中使用的Razor引擎自动编码来自变量的所有输出,除非您非常努力地阻止它这样做。”,当然,除非您使用Html.Raw助手方法。
作为应用程序安全的促进者,我们相信不信任输入并有层层防御,所以我的建议是明确表示希望通过传递JsonSerializerSettings参数对输出进行编码:
return JsonConvert.SerializeObject(items, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml });这里唯一的困境是Checkmarx可能不承认这是一种消毒剂,因为它可能不在他们预定义的杀菌剂列表中。您可以始终将此解决方案作为参数提供给运行安全扫描的安全小组
对于JsonResult返回的情况,您可能希望javascript对barcosNaoVinculados变量进行编码:
return Json(HttpUtility.JavaScriptStringEncode(barcosNaoVinculados), JsonRequestBehavior.AllowGet)现在,这也可能是Checkmarx无法识别的。您可以尝试使用Checkmarx识别的程序(即Encoder.JavascriptEncode或AntiXss.JavascriptEncode),但我认为这些Nuget包不会在您的项目类型中工作
https://stackoverflow.com/questions/64453228
复制相似问题