2011-05-10 3 views
6

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

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

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

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

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

  1. (Прикидываясь Mallory) Я говорю Алиса: «привет навестить http://localhost/login.php?PHPSESSID=mysessionid»

  2. Тогда (делая вид, что Алиса) я пошел в http://localhost/login.php?PHPSESSID=mysessionid

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

  4. Тогда (делая вид, что Алиса) Я вошел в выходе «Джо» в качестве верительных

  5. журналы Алиса в и она перенаправляется insession_ok.php, и в этот момент (в соответствии со статьей википедии выше) Мэллори должна быть в состоянии видеть insession_ok.php слишком, потому что он фиксировал сеанс до mysessionid, , но это не так, потому что когда Alice регистрируется в новом сеансе, создается на сервере 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); 
} 
?> 

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

ответ

6

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

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

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

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

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

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

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

  • В Chrome, войдите как Алиса. Это приведет к регистрации жертвы.

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

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

1

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

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

Смежные вопросы