ASP.Net Checkmarx 报告的 MVC App Stored XSS 漏洞

ASP.Net MVC App Stored XSS vulnerability reported by Checkmarx

Checkmarx 分析了代码并报告了以下问题:

Method Load_Bank at line ** gets data from the database, for the Where element. This element’s value then flows through the code without being properly filtered or encoded and is eventually displayed to the user in method Bank_Read at line * of SomeController.cs. This may enable a Stored Cross-SiteScripting attack.

internal IEnumerable<BankDTO> Load_Bank()
{
    using (var Container = new EBookletEntities())
    {
        var query = from r in Container.Gen_Bank.AsNoTracking()
                    where r.IsDeleted != true
                    select new Gen_BankDTO
                    {
                        Id = r.Id,
                        Name = r.Name
                    };
        return query.ToList<BankDTO>();
    }
}

控制器代码如下

using (var bll = new BankBLL())
{
    var item = bll.Load_Bank();
    var model = item.Select(r => new BVM()
        {
            Id = r.Id,
            Name = HttpUtility.HtmlEncode(r.Name)
        }).ToList();

    return Json(model.ToDataSourceResult(request), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);

}

Checkmarx 来源:

where r.IsDeleted != true 

目的地:

return Json(model.ToDataSourceResult(request), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);

我想知道是否真的存在存储型 XSS 问题或 Checkmarx 报告错误?

如何解决 Checkmarx 问题?

这是不可利用的,因为响应类型是 application/json。即使存在带有脚本标记的有效 xss 攻击,现代浏览器也不会在具有 application/json 内容类型的响应中执行该攻击。

另外 Id 我猜是一个数字或 uuid 而 Name 是 html 编码的,你可以说这是为了纵深防御,但实际上只需要编码对于 json,这是天生的。

您可以在 Checkmarx 中将其标记为不可利用。

另请注意,由于名为 json hijacking 的旧攻击,在 GET 请求中返回 json 数组仍不被视为良好做法。然而,这在现代浏览器中不再是可利用的,所以我不会再说它是易受攻击的, 除了 在 IE9 中,不幸的是它可能仍在使用。