Checkmarx сообщает об уязвимости ASP.Net MVC App Stored XSS

Код был проанализирован Checkmarx и сообщил о следующей проблеме:

Метод Load_Bank в строке ** получает данные из базы данных для элемента Where. Затем значение этого элемента проходит через код без должной фильтрации или кодирования и в конечном итоге отображается пользователю в методе Bank_Read в строке * из SomeController.cs. Это может привести к атаке Stored Cross-SiteScripting.

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);

}

Источник галочки:

where r.IsDeleted != true 

Назначения:

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

Интересно, действительно ли существует проблема с сохраненным XSS или Checkmarx сообщил о ней как о ложной?

Как решить проблему с Checkmarx?


person decoder    schedule 17.05.2020    source источник


Ответы (1)


Это нельзя использовать, потому что тип ответа — application/json. Даже если была действительная атака xss с тегом script, ни один современный браузер не выполнит ее в ответе с типом содержимого application/json.

Кроме того, Id, я думаю, является числом или uuid, а Name закодирован в html, что, как вы могли бы утверждать, предназначено для глубокой защиты, но на самом деле его нужно кодировать только для json, что по своей сути.

Вы можете пометить это как непригодное для эксплуатации в Checkmarx.

Также обратите внимание, что возврат массива json в запросе GET по-прежнему не считается хорошей практикой из-за старой атаки под названием перехват json. Однако в современных браузерах это больше нельзя использовать, поэтому я бы не сказал, что он больше уязвим, кроме в IE9, который, к сожалению, все еще может использоваться.

person Gabor Lengyel    schedule 18.05.2020