Изисквания: Наскоро прочетох документа на 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 адреси, които може да са предоставени в заявката).
Локално пренасочване
Използвайки метода Controller helper в базовия клас 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, за да замените стандартния клас за имплементация при стартиране на програмата.
Препратка:Входът към хиперлинк е видим.
(Край)
|