Простая атака с фиксацией сессии на localhost для тестирования
Я читал много вопросов по SO о риске фиксации / перехвата сессии, и многие люди предлагают изменить php.ini
директивы как session.use_only_cookies
в ON
и другие директивы php.ini, чтобы сделать сервер более безопасным...
Я хотел увидеть своими глазами, смогу ли я воспроизвести простой сценарий атаки на моем локальном сервере на основе PHP5 + Apache.
На моем местном хосте session.use_only_cookies
является OFF
так что в соответствии с приведенным выше указанием q/a мой локальный хост в основном не защищен, и это то, что мне нужно для тестирования.
Сначала я прочитал эту простую статью о том, как осуществляется атака с фиксацией сеанса:
Чтобы повторить сценарий, описанный в статье, я создал два очень простых сценария PHP (код приведен ниже), но атака не работает, вот что я сделал:
(Притворяется Мэллори) Я говорю Алисе: " Здравствуйте, посетите http://localhost/login.php?PHPSESSID=mysessionid "
Затем (притворяясь Алисой) я зашел на http://localhost/login.php?PHPSESSID=mysessionid
Как администратор моего локального сервера, я видел, как сеанс создавался на диске сервера (он записан в виде файла с именем
sess_ mysessionid
) вот я и подумал: круто, работает!!!Затем (притворяясь Алисой) я вошел, вводя "Джо" как учетные данные
Алиса входит в систему, и она перенаправлена на
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 ответа
Именно таким способом я всегда тестировал атаки с фиксацией сессии. Это требует знания протокола 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()
как только пользователь аутентифицируется в вашем коде. Это делает недействительным любой идентификатор сеанса, который использовался до входа в систему, и означает, что Оскар теперь должен попытаться украсть ваш идентификатор сеанса после входа в систему (но перед выходом из системы), что гораздо труднее сделать.
Помимо того, что session.use_only_cookies отключен, вам также необходимо убедиться, что в настоящее время нет действительного файла cookie с идентификатором сессии, как предпочитает PHP $_COOKIE
над $_GET
, Фактически, причина того, что Алиса имеет другой идентификатор сеанса после входа в систему, вероятно, заключается в том, что Алиса уже имеет действительный файл cookie с идентификатором сеанса, который затем используется вместо идентификатора сеанса, предоставленного посредством URL-адреса. Вы также можете отключить куки и включить session.use_trans_sid, чтобы вообще не использовать куки.
Тогда ваш эксплойт должен работать как положено.