Простая атака с фиксацией сессии на localhost для тестирования - PullRequest
6 голосов
/ 10 мая 2011

Я много читал в SO по поводу риска фиксации / перехвата сеанса, и многие люди предлагают изменить директивы php.ini, например session.use_only_cookies, на ON и другие директивы php.ini, чтобы сделать сервер более безопасным...

Я хотел увидеть своими глазами, смогу ли я воспроизвести простой сценарий атаки на моем локальном сервере на основе PHP5 + Apache.

На моем локальном хосте session.use_only_cookies равен OFF, поэтому в соответствии с приведенным выше вопросоммой локальный хост в основном незащищен, и это то, что мне нужно для теста.

Я впервые прочитал эту простую статью о том, как осуществляется атака с фиксацией сеанса:

Чтобы повторить сценарий, описанный в статье, я создал два очень простых сценария PHP (код приведен ниже), но атака не работает, вот что я сделал:

  1. (Притворяется Мэллори) Я говорю Алисе:Здравствуйте, посетите http://localhost/login.php?PHPSESSID=mysessionid

  2. Затем (притворяясь Алисой) я пошел на http://localhost/login.php?PHPSESSID=mysessionid

  3. Как администратор моего локального сервера, я увидел, что сеанс создается насерверный диск (он записан как файл с именем sess_ mysessionid), поэтому я подумал: круто, он работает !!!

  4. Затем (притворяясь Алисой) я вошел в систему, введя«Джо» как учетные данные

  5. Алиса входит в систему, и она перенаправляется на insession_ok.php, и в этот момент (согласно статье в Википедии выше) Мэллори должна видеть insession_ok.phpтоже, потому что он зафиксировал сеанс на mysessionid, , но это не так, потому что, когда Алиса регистрируется в новом сеансе, создается на сервере sess_vdshg238cnfb4vt7ahpnp1p522, поэтому я не понимаю, как сейчас Мэллори должнаисправить / захватить сессию, как описано в статье ???


login.php

<?php
session_start();

//if user credentials are ok, let's put him in session
if( @$_POST['usr'] === 'joe' )
   $_SESSION['in_session'] = TRUE;

//if user is already logged in, let's redirect him to the account page "insession_ok.php"
if( isset($_SESSION['in_session']) )
{
   $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/insession_ok.php';      
   header("Location: " . $webpage, TRUE, 302);
}    
?>
<form method="POST" action="login.php">
   <input name="usr" type="text">
   <input type="submit" value="Submit">   
</form>    
<script type="text/javascript">
   alert(document.cookie); //to view cookies
</script>

insession_ok.php

<?php
session_start();
if(@$_SESSION['in_session'] === TRUE)
   echo "in session ok";
else //user is not in session cause he did not login, let's redirect him to login page
{
   $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/login.php';      
   header("Location: " . $webpage, TRUE, 302);
}
?>

Любая подсказка / идея всегда ценится!

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

Это способ, которым я всегда пользовался для тестирования атак фиксации сеанса.Это требует знания протокола HTTP, но если вы достаточно хороши, чтобы взглянуть на фиксацию сеанса, немного HTTP не должен вас пугать:)

Версия фиксации сеанса, которую я представляюздесь мы видим идею общедоступного компьютера, когда вы идете в библиотеку, переходите на сайт, такой как www.myawesomesite.com, и, не входя в систему, записываете назначенный вам идентификатор сеанса.

Затем вы уходите и ждете, пока кто-нибудь зайдет на сайт www.myawesomesite.com.Как только они войдут в систему, вручную измените сеанс на вашем компьютере на файл cookie, который использовался на общедоступном компьютере.Затем сервер считает, что вы являетесь аутентифицированным пользователем.

Чтобы проверить это на локальном хосте, мы можем использовать два разных браузера для просмотра эффекта, так как браузеры обычно не делятся файлами cookie.

Вот шаги, чтобы сделать это:

  • Откройте Chrome и перейдите к localhost.Это будет представлять общедоступный компьютер.Проверьте идентификатор сеанса и запишите его.Вы можете сделать это либо с помощью программы, подобной Fiddler, для просмотра запроса, либо с помощью плагина, такого как веб-разработчик, для просмотра файлов cookie.Значение cookie должно выглядеть примерно так: PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

  • Откройте Firefox и перейдите к localhost.Это будет представлять компьютер злоумышленника.Используя плагин Web Developer, измените файл cookie PHPSESSID на значение, которое вы записали в Chrome.

  • В Chrome войдите в систему как Алиса.Это будет означать, что жертва вошла в систему.

  • Вернувшись в Firefox, нажмите «Обновить» или перейдите на страницу только для аутентификации.Если вы подвержены фиксации сеанса, то вы должны войти в систему как Алиса в Firefox, минуя логин.

Исправить это просто (так как я уверен, что вывидел).Просто позвоните session_regenerate_id(), как только пользователь авторизуется в вашем коде.Это делает недействительным любой идентификатор сеанса, который использовался до входа в систему, и означает, что теперь Оскар должен попытаться украсть ваш идентификатор сеанса после входа в систему (но до выхода из системы), что гораздо труднее сделать.

1 голос
/ 11 мая 2011

Помимо отключения session.use_only_cookies , вам также необходимо убедиться, что в настоящее время нет действительного файла cookie идентификатора сеанса, поскольку PHP предпочитает $_COOKIE вместо $_GET. Фактически, причина того, что Алиса имеет другой идентификатор сеанса после входа в систему, вероятно, заключается в том, что Алиса уже имеет действительный файл cookie с идентификатором сеанса, который затем используется вместо идентификатора сеанса, предоставленного посредством URL-адреса. Вы также можете отключить куки и включить session.use_trans_sid , чтобы вообще не использовать куки.

Тогда ваш эксплойт должен работать как положено.

...