Эксплуатация CSRF уязвимостей

Эксплуатация CSRF уязвимостей

Moody

Привет.

В этой статье я расскажу о 3-х интересных случаях в моей жизни, когда я повстречался с CSRF-уязвимостями.

Небольшое предисловие

CSRF (Сross Site Request Forgery — «межсайтовая подделка запроса») - атака, которая приводит к тому, что хакер может выполнить на незащищенном сайте массу различных действий от имени других, зарегистрированных посетителей.

Как это работает? После авторизации на сайте, у пользователя в браузере сохраняются токен сессии, который позволит ему в следующий раз не вводить заново данные для входа (если сессия не истечет), а также изменять какую - либо информацию в своем профиле, активничать на сайте и прочее. При последующих веб-запросах к сайту, токен сессии автоматически передается на сервер и позволяет приложению получить информацию о текущем пользователе для авторизации запроса. Если на сервере нет никаких проверок, например то, откуда отправлен запрос, злоумышленник сможет разместить на своем сайте hackeeeeer.com такую HTML-страничку, которая будет сабмитить HTML-форму на уязвимый сайт, при её открытии. Так как браузер автоматически вставляет куки пользователя в HTTP-запрос, то бэкенд просто не поймет, является ли данный запрос легитимным — результат ли это заполнения формы пользователем, или это CSRF-атака — и поменяет адрес доставки для пользователя на значение, которое выгодно для атакующего.

Критичность этой уязвимости сильно зависит от того, в каком месте на сайте она находится и какую операцию выполняет. Иногда она бывает почти безобидной и приводит к несущественным проблемам, например, таким, как несанкционированное изменение настроек профиля или опустошение корзины пользователя. А иногда злоумышленник может, буквально по щелчку пальцев, завладеть аккаунтом жертвы.

Приведу пару примеров.

Пример 1. Утечка информации о пользователях

Приложения часто отправляют или раскрывают информацию в соответствии с предпочтениями пользователя. Например, один из сервисов, который я тестировал, позволял детально настроить отправку уведомлений на Email. Меня заинтересовал пункт, который носил название "Ежемесячная отчетность о состоянии счета" (или что - то в этом духе). Он позволял получать письма, в которых, помимо информации об остатке на счете и транзакциях, также содержалась полная информация о профиле жертвы. В профиле пользователь мог указать своё ФИО, дату рождения, адрес проживания, номера телефонов, данные о кредитных картах и многое-многое другое. Запрос на включение таких уведомлений выглядел так:

POST /change_billing_email

REQUEST BODY:

email=NEW_EMAIL&csrftoken=12345

Уязвимость заключалась в том, что CSRF-токен здесь никак не валидировался (как и во всех примерах ниже) и в качестве его значения я мог указать любые данные. Запрос всё - равно бы выполнился успешно. И мне бы каждый месяц приходила бы информация о жертве (если бы она, конечно, предварительно перешла по "злой" ссылке).

Пример 2. Stored Self-XSS + CSRF

На одном финансовом сайте, который я находил, была возможность создавать ник для каждого из своих привязанных банковских счетов. Значение параметра, передававшего никнейм, было уязвимо для Self-XSS: не было никакой очистки "вредных" символов, проверки или экранирование вводимых пользовательских данных. Запрос на изменение никнейма выглядел так:

POST /change_account_nickname

REQUEST BODY:

nickname=<XSS ПЭЙЛОАД>&csrftoken=WRONG_TOKEN

Можно было прописать, помимо ника, JS код, который обязательно бы выполнился, когда жертва зашла бы в свой профиль.

Пример 3. Захват учеток при помощи CSRF

Это уже стало классикой, по крайней мере у меня. Не знаю, совпадение или нет, но на большинстве сайтов, которые я исследовал, присутствовала именно эта разновидность CSRF. Чаще всего её можно найти в функциях создания, изменения, сброса пароля от учетной записи.

POST /password_change

REQUEST BODY: 

newpassword=XXX&newpassword=XXX

Это функция смены пароля. Думаю, комментарии излишни.

Узнали?

https://t.me/cybred

Report Page