Какво представлява отвличането на сесии и как можете да го спрете

Тази история е за начинаещи и за всички, които имат основни познания за бисквитките (бисквитките на сесиите), но които не са сигурни как да ги защитят правилно. Не е нужно да сте експерт по сигурността, за да го направите. Просто трябва да разберете процеса и тогава ще разберете.

Ако нямате никаква представа за бисквитките или как работят, моля, прочетете тази статия за HTTP бисквитките.

Нека стигнем до него! Имате невероятно уеб приложение, предлагащо страхотна услуга за клиентите. Това означава, че ще имате механизъм за удостоверяване , за да отведете потребителя до вашето приложение. Знаете колко важна е сигурността. Приложихте всякакви мерки за сигурност по време на удостоверяване. Страхотен!

След успешно удостоверяване трябва да създадете сесия за този потребител. Това означава, че всъщност създавате бисквитка и я изпращате обратно в браузъра. Например в уеб приложение на Java по подразбиране се нарича JSESSIONID. Изглежда по следния начин:

Използвайки тази бисквитка, само вашият уеб сървър е в състояние да идентифицира кой е потребителят и той ще предостави съдържание съответно. И тази бисквитка изглежда страхотно. В бисквитката няма чувствителна информация, а само произволен идентификатор (неотгатваем). Така че потребителят е в безопасност! ... нали?

Ами не точно, нека разгледаме отблизо.

В тази бисквитка има две свойства: HttpOnly (HTTP) и Secure. Стойностите им са празни, което означава, че не са активирани за тази бисквитка . Там се стига дотам, че вече не е безопасно.

Това е мястото, където се отвлича сесия.

Отвличането на сесия , понякога известно още като отвличане на бисквитки, е експлоатация на валидна компютърна сесия - понякога наричана още сесиен ключ - за получаване на неоторизиран достъп до информация или услуги в компютърна система. - Уикипедия

Така че това е актът на кражба на идентификатор на сесия на клиента, чрез който те могат да имат достъп до вашето уеб приложение, сякаш те са този клиент.

Възможно ли е това? Как получават идентификатора на сесията, който е в браузъра на потребителя?

Да, възможно е. Причината за това са двете свойства на бисквитките (или флагове), които видяхме по-рано ( HttpOnly и Secure ).

HttpOnly Flag

HttpOnlyбисквитките са недостъпни за Document.cookieAPI на JavaScript ; те се изпращат само до сървъра. Например, бисквитките, които продължават сесиите от страна на сървъра, не трябва да са достъпни за JavaScript и HttpOnlyтрябва да бъде зададен флагът.

Така че с прости думи, ако не зададете флага httpOnly, тогава вашата бисквитка може да се чете от JavaScript кода на предния край.

Отворете всяка уеб страница, чиято бисквитка няма зададен флаг httpOnly. След това отворете конзолата за разработчици на Chrome и след това докоснете раздела конзола (Cmd + Shift + J или Ctrl + Shift + J). Въведете document.cookieи въведете и ще видите нещо подобно:

Както можете да видите, получавате цялата информация за бисквитките. JavaScript атакуващият може просто да публикува това на собствения си сървър за по-късна употреба.

Може да се чудите как могат да напишат този код във вашето приложение. Възможно е по няколко начина.

Един от начините е да инжектирате някои ненадеждни JS библиотеки на трети страни, като регистрация, помощни програми и т.н. Прочетете тази статия Събирам номера и пароли на кредитни карти от вашия сайт. Ето как .

Друг начин е чрез използване на Cross Site Scripting Attack . Няма да навлизаме в детайлите, но не забравяйте, че може да се направи.

И така, как да го оправим?

Сесийната бисквитка дори не трябва да е достъпна от клиента на JavaScript. Това е необходимо само за сървъра. Трябва да го направим достъпно само за сървъра. Това може да се направи чрез добавяне на една дума ( httpOnly ) в заглавката на вашия отговор set_cookie http. Като този:

Set-Cookie: JSESSIONID=T8zK7hcII6iNgA; Expires=Wed, 21 May 2018 07:28:00 GMT; HttpOnly

Чрез добавяне на HttpOnly флаг, вие инструктирате браузъра, че тази бисквитка не трябва да се прочете от кода JavaScript. Браузърът ще се погрижи за останалото. Ето как изглежда след добавяне на флага httpOnly:

Забележете отметката в свойството HTTP. Това показва, че httpOnly е активиран.

Тук можете да видите, че document.cookie не връща нашата бисквитка на сесията. Това означава, че никой JS не може да го чете, включително външни скриптове.

Това е - един надолу, един да отиде!

Сигурен флаг

Най- сигурна флаг указва на браузъра, който бисквитката трябва да се върне на прилагането през криптирани връзки, сиреч, HTTPS връзка.

Така че, когато бисквитката се изпраща до браузъра със защитеното знаме и когато отправяте заявка към приложението, използвайки HTTP, браузърът няма да прикачи тази бисквитка в заявката. Той ще го прикачи само в HTTPS заявка. Заявката за HTTPS ще бъде криптирана, така че бисквитките ще бъдат безопасно изпратени през мрежата до вашето приложение.

Как може някой да прочете бисквитката в HTTP заявката?

Това може да се постигне, когато някой (наречен атака „Човек в средата“ ) наблюдава целия трафик в мрежата от клиенти. Те са в състояние да видят чистите текстови данни, ако заявката е в HTTP.

Когато се изпрати по HTTPS , всички данни ще бъдат криптирани от браузъра и изпратени в мрежата. Атакуващият няма да може да получи суровите данни, които изпращате. Нито нападателят няма да може да дешифрира съдържанието. Ето защо изпращането на данни през SSL е сигурно.

И така, как да го оправим?

Подобно на знамето httpOnly, просто трябва да добавите защитения флаг в заглавката на HTTP отговора на set_cookie Като този:

Set-Cookie: JSESSIONID=T8zK7hcII6iNgA; Expires=Wed, 21 May 2018 07:28:00 GMT; HttpOnly; Secure

В Java това може да се направи по няколко начина. Ако използвате Servlet 3.0 или по-нова версия, можете да конфигурирате тези настройки в web.xml по следния начин:

  true true  

Ако вашата среда не го поддържа, можете да го добавите ръчно. Например с помощта на Servlets можете да направите това:

И накрая, така изглежда, когато са зададени и двата флага,

Заключение

Така че, когато имате работа със сесийни бисквитки или други важни бисквитки, не забравяйте да добавите тези два флага.

Благодаря за четенето, Честито осигуряване!