@Pinvest

Можно ли обойти ISSET или $_SESSION?

Я хочу узнать можно ли обойти сессию, если да то как?
код
<?  if( !isset( $_SESSION['admin'] ) )
{ 
	    echo "<meta http-equiv='Refresh' content='0; URL=admin.php?page=index'>";
    }


или этот

if( isset( $_POST['go'] ) )
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
copist
@copist
Empower people to give
Чтобы понять, как это взломать, надо понимать, как это работает и как такие проверки защищают от взлома.

if (isset($_POST['go']))
Для прохождения такой проверки нужно отправить запрос методом POST с параметром go в теле запроса
curl -d "go=1" -X POST somedomain/someurl

if (!isset($_SESSION['admin']))
Сессия - это ресурс на стороне сервера, например файл с определённым именем. К нему нет прямого доступа.

Для открытия сессии (то есть конкретного файла) используется идентификатор, сохраняемый в cookies. Обычно это PHPSESSID. Например, в куке PHPSESSID записано "2n24161uqm7ctl2tmp8b10sng3" - значит на сервер есть файл например /var/tmp/session_2n24161uqm7ctl2tmp8b10sng3.php (имя файла условное), а внутри записаны все значения массива $_SESSION, закодированные с помощью функции serialize.

Тут два варианта взлома:
1. В своём браузере записать в ту же куку то же значение, что и у админа. Для этого конечно, это значение надо у админа украсть.
2. На сервере открыть файл сессии, декодировать, подставить там параметр "admin" = 1, закодировать и записать обратно в тот же файл.

Оба вариант трудно реализуемы. Возможно, украсть куку админа будет чуть проще :) Например, украсть его ноутбук :) Или пошариться в его браузере, пока он душ принимает. Шпионство.
Для таких как мы - шпионов-лузеров - в $_SESSION на стороне сервера при авторизации также записывают UserAgent браузера и IP адрес компьютера админа, чтобы подмена куки не сработала. То есть там не только !isset($_SESSION['admin']) но и несколько других проверок например. Если проверка на user-agent - нужно будет ещё подменить UserAgent своего браузера или в curl передать в заголовках. Если проверка на IP - тупик, IP подменить будет нереально, это на уровне протокола TCP

Для подмены значений на сервере нужно взломать сервер. То есть либо подсунуть туда хитрый скрипт, который может быть выполнен путём запроса HTTP, он должен сделать описанное выше. Либо авторизоваться через FTP или SSH, затем либо искать файл сессии, чтобы поправить вручную, либо искать этот скрипт с проверкой !isset($_SESSION['admin']), чтобы закомментировать условие. Чтобы войти на сервер, понадобится стырить логин пароль у админа, либо украсть его ноут.

Иногда сессии хранятся не в файлах, а в других сервисах. Например, в memcached или redis или ещё где угодно.

В общем, юный хакер, изучай. Взломай для начала свой сервер с такими же проверками :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Короткий ответ: нельзя
Более длинный ответ: можно при некоторых обстоятельствах, нарушающих безопасность системы, например неправильная настройка хранения временных файлов на хостинге, возможность запуска вредоносных JS скриптов, XSS и т.п.
Ответ написан
Комментировать
flapflapjack
@flapflapjack
на треть я прав
или этот

if( isset( $_POST['go'] ) )


Этот легко - хоть на рабочем столе хтмл файл с пост-формой создать и всё. Но вряд ли это что-то даст. Защиту пост запросами не делают.

Сессия хранится на сервере - не обойдешь без взлома.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы