Вимоги: Нещодавно я прочитав документ Microsoft ASP.NET Core «Запобігання відкритим редиректним атакам у ASP.NET Core», що приблизно означаєРозробникам слід звертати увагу на маршрут локального сайту при переході до адреси зворотного виклику, щоб деякі люди могли зловмисно підробляти цю адресу для фішингових атак。 Вивчіть код і підготуйтеся до портування його на проєкт ASP.NET MVC.
Пам'ятаю, що один великий виробник раніше мав таку вразливість, і деякі люди використовували її для відведення трафіку з QQ та WeChat, наступним чином:
Використовуючи цю вразливість, деякі чат-інструменти не змогли заборонити користувачам переходити на посилання для доступу до шкідливого контенту через довіру до доменів великих компаній.
Що таке відкрита перенаправлення атаки?
Веб-додатки часто перенаправляють користувачів на сторінки входу, коли вони отримують доступ до ресурсів, що потребують автентифікації. Перенаправлення зазвичай містять параметр returnUrl querystring, щоб користувачі могли повернутися до початково запитаної URL після успішного входу. Після автентифікації користувач перенаправляється на URL, який він спочатку запитував.
Приклад атаки
Зловмисний користувач може розробити атаку, спрямовану на надання зловмисному користувачу доступ до облікових даних або конфіденційної інформації користувача. Щоб розпочати атаку, зловмисний користувач обманом змусить його натиснути на посилання на цільову сторінку вашого сайту та додати значення returnUrl querystring до цієї URL. для того, щобcontoso.comнаприклад, додаток знаходиться уhttp://contoso.com/Account/LogOn?returnUrl=/Home/AboutМістить цільову сторінку. Атака виконується наступними кроками:
- Користувач натискає на шкідливе посилання наhttp://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(Друга URL — "contoso1.com", замість "contoso.com”) 。
- Користувач успішно увійшов у систему.
- Користувач перенаправляється на сайтhttp://contoso1.com/Account/LogOn(Шкідливий сайт, який виглядає точно як справжній).
- Користувач знову входить у систему (надаючи облікові дані шкідливому сайту) і перенаправляється назад на реальний сайт.
- Користувачі можуть думати, що їхня перша спроба входу не вдалася, а друга — успішною.Ймовірно, користувачі досі не знають, що їхні облікові дані були скомпрометовані。
Окрім цільових сторінок, деякі сайти пропонують сторінки перенаправлення або кінцеві точки. Припустимо, у вашому додатку є сторінка з відкритим перенаправленням /Home/Redirect. Наприклад, зловмисник може створити пункт у листі[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/LoginПосилання. Звичайні користувачі побачать, що URL починається з назви вашого сайту. З довіри вони натискають на посилання. Відкривають перенаправлення, потім перенаправляють користувачів на фішингові сайти, які виглядають так само, як ваші, і користувачі можуть увійти на сайти, які вважають своїми.
Запобігайте відкритим перенаправленням атак
Під час розробки веб-додатків усі дані, надані користувачами, вважаються ненадійними. Якщо ваш додаток має можливість перенаправляти користувачів на основі вмісту URL, переконайтеся, що такі перенаправлення виконуються лише локально у вашому додатку (або перенаправляйте на відомі URL, а не на URL, які можуть бути вказані у рядку запиту).
LocalRedirect
Використання методу допоміжного контролера у базовому класі LocalRedirect:
Якщо вказано нелокальну URL, LocalRedirect викидає виняток. В іншому випадку він поводиться так само, як метод перенаправлення. Інформація про винятки наступна:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. Вихідний код виглядає так:
Процес виконання: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, і врешті-решт буде викликано IsLocalUrl для оцінки (UrlHelperFactory за замовчуванням реалізує інтерфейс IUrlHelperFactory. )。
Адреса вихідного коду:Вхід за гіперпосиланням видно.
IsLocalUrl
IsLocalUrl перед перенаправленням перевірте URL таким методом:
Код виглядає так:
Тестовий код виглядає так:
Якщо вам дозволено переходити на інші сайти доменних імен, ви можете реалізувати інтерфейс IUrlHelperFactory і змінити IServiceCollection, щоб замінити стандартний клас реалізації при запуску програми.
Посилання:Вхід за гіперпосиланням видно.
(Кінець)
|