mr.Penguin
25.04.2012, 00:33
CSRF атаки или подделка межсайтовых запросов
Intro
CSRF (полное название Сross Site Request Forgery) - вид атак на посетителей веб-сайтов, использующий недостатки HTTP протокола.
Схема этой уязвимости довольно-таки проста: Жертва заходит на сайт, созданный хакером, и от ее лица тайно отправляется запрос на веб-сайт, использующий недостатки HTTP протокола.
Атаки можно совершить практически везде (конечно, если веб-сайт уязвим): Сайт платёжной системы (перевод средств на счет хакера), хостинг (смена пароля от панели), социальная сеть (смена пароля от панели / смена контрольного вопроса), но есть одно но - для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.
Статья предназначена для начинающих пользователей..
Атакуем сайт
Для примера давайте возьмем несуществующий хостинг - hosting.qqq, наша задача сменить пароль аккаунта Administrator, нам известен только список параметров и логин жертвы.
Итак, приступим! Вот список значений и параметров уязвимого сайта:
reason=password_change
password=newpassword // Новый пароль
password2=newpassword // Подтверждаем новый пароль
Задача злоумышленника - создать страницу и тайно отправить запрос от лица жертвы на уязвимый сайт.
Нашу страницу назовем newpassword.html, теперь нужно сконструировать код, который тайно пошлет запрос от лица жертвы на уязвимый сайт. Я предоставлю Вам несколько вариантов.
Вариант №1
Вариант №2
document.getElementsByTagName('form')[0].submit();
Но в этих двух случаях, нашу жертву перекинет на хостинг hosting.qqq, а это не есть "тайно". Но выход есть, создаем вторую страницу new.html, и записываем туда следующий код:
Как Вы увидели, на странице new.html будет находится скрытый iFrame, который будет ссылаться на страницу newpassword.html, а уже newpassword.html и будет посылать запрос на уязвимый сайт. Да-да, вот такая цепочка. Конечно же, можно сделать все намного проще, например как здесь (скрытый iframe + отправка запроса на уязвимый сайт):
functioncsrf() {
varhtml;
html='';
window.frames["frame"].document.body.innerHTML=html;
}
Но в третьем варианте мы пошлем GET запрос на уязвимый сайт, а для смены пароля в нашем случае необходимо отправить данные методом POST, так что будем использовать первые два любых варианта.
Теперь осталось написать в Тех. поддержку хостинга (есть вероятность, что наше сообщение прочтет администратор хостинга) и заманить его на сайт злоумышленника (http://сайт_злоумышленника.ру/new.html), но как заманить - думайте уже сами
Защита от CSRF
Наиболее простой способ защиты: сервер жертвы должен просить подтверждения действий пользователя и проверять поле HTTP_REFERER, если оно указано в запросе. Или-же использовать дополнительный секретный ключ, предназначенный для выполнения POST-запросов.
Спасибо за внимание!
Intro
CSRF (полное название Сross Site Request Forgery) - вид атак на посетителей веб-сайтов, использующий недостатки HTTP протокола.
Схема этой уязвимости довольно-таки проста: Жертва заходит на сайт, созданный хакером, и от ее лица тайно отправляется запрос на веб-сайт, использующий недостатки HTTP протокола.
Атаки можно совершить практически везде (конечно, если веб-сайт уязвим): Сайт платёжной системы (перевод средств на счет хакера), хостинг (смена пароля от панели), социальная сеть (смена пароля от панели / смена контрольного вопроса), но есть одно но - для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.
Статья предназначена для начинающих пользователей..
Атакуем сайт
Для примера давайте возьмем несуществующий хостинг - hosting.qqq, наша задача сменить пароль аккаунта Administrator, нам известен только список параметров и логин жертвы.
Итак, приступим! Вот список значений и параметров уязвимого сайта:
reason=password_change
password=newpassword // Новый пароль
password2=newpassword // Подтверждаем новый пароль
Задача злоумышленника - создать страницу и тайно отправить запрос от лица жертвы на уязвимый сайт.
Нашу страницу назовем newpassword.html, теперь нужно сконструировать код, который тайно пошлет запрос от лица жертвы на уязвимый сайт. Я предоставлю Вам несколько вариантов.
Вариант №1
Вариант №2
document.getElementsByTagName('form')[0].submit();
Но в этих двух случаях, нашу жертву перекинет на хостинг hosting.qqq, а это не есть "тайно". Но выход есть, создаем вторую страницу new.html, и записываем туда следующий код:
Как Вы увидели, на странице new.html будет находится скрытый iFrame, который будет ссылаться на страницу newpassword.html, а уже newpassword.html и будет посылать запрос на уязвимый сайт. Да-да, вот такая цепочка. Конечно же, можно сделать все намного проще, например как здесь (скрытый iframe + отправка запроса на уязвимый сайт):
functioncsrf() {
varhtml;
html='';
window.frames["frame"].document.body.innerHTML=html;
}
Но в третьем варианте мы пошлем GET запрос на уязвимый сайт, а для смены пароля в нашем случае необходимо отправить данные методом POST, так что будем использовать первые два любых варианта.
Теперь осталось написать в Тех. поддержку хостинга (есть вероятность, что наше сообщение прочтет администратор хостинга) и заманить его на сайт злоумышленника (http://сайт_злоумышленника.ру/new.html), но как заманить - думайте уже сами
Защита от CSRF
Наиболее простой способ защиты: сервер жертвы должен просить подтверждения действий пользователя и проверять поле HTTP_REFERER, если оно указано в запросе. Или-же использовать дополнительный секретный ключ, предназначенный для выполнения POST-запросов.
Спасибо за внимание!