Учебный скрипт авторизации

rotoZOOM

ACM maniac
Фaнат насчет SSL - это я загнул. Для учебного примера действительно таких проверок не надо.
 

Фанат

oncle terrible
Команда форума
Ну че - переписываем по-старинке,
PHP:
  if ($row = mysql_fetch_assoc($res)) {
    session_start();
    $_SESSION['user_id'] = $row['id'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit;
  } else {
    echo "Неверный логин или пароль";
  }
?
 

DYPA

Настоящая dypa (c)
2 *****:
чемуж вы детей учите ;)

PHP:
<?php
//http://localhost/auth.php?\n\rSet-Cookie:%20stop=1;
if ($_COOKIE['stop'] = '1') var_dump($_COOKIE);die('XSS');
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
мораль простая массив $_SERVER является часть пользовательского ввода, а значит нужна валидация данных. В данном случае надо проверять наличие \n и \r символов.
PHP:
if (strpbrk($_SERVER['REQUEST_URI'], "\r\n"))
{
throw new Exception('Header не должен содержать \r и \n');
}
 

ys

отодвинутый новичок
Пример нормальный.
Только не хватает одного момента, который проверяет ситуацию, когда пользователя "прибили" в базе, а сессия у него уже активна.
Т.е. реально он (пользователь) "прибьется" только тогда, когда или браузер закроет или сессия заекспариться.
 

fixxxer

К.О.
Партнер клуба
DYPA
ну ка запихни мне в request_uri \r\n, мне очень интересно посмотреть как у тебя это получится
 

fixxxer

К.О.
Партнер клуба
а, ну вообще да. ступил. =) ну я такое еще на уровне nginx режу
 

berkut

Новичок
да тут все потихоньку...
header()
Note: Since PHP 4.4.2 and PHP 5.1.2 this function prevents more than one header to be sent at once as a protection against header injection attacks
 

berkut

Новичок
5,2,0 win xp - Warning: Header may not contain more than a single header, new line detected. in .........
и ничего не шлёт
 

AmdY

Пью пиво
Команда форума
ну, захочет чел поставить се куку, пускай ставит хоть через блокнот, мне интересны варианты атак не на свой компьютер.
 

berkut

Новичок
AmdY
а при чём тут на свой? я кину такой линк кому-нибудь и он сам себе чего нибудь поставит.

-~{}~ 24.02.08 22:16:

мля, исходя из этого скрипта, я вот чё подумал. Я кидаю челу линк http://site.com/auth.php?SID={валидный сид} - и грю, типа зайди позырь мои фотки. он кликает - у него автоматом стартует сессия, причём именно с этим сидом. он вбивает логин-пароль - и я получается знаю его СИД и могу войти под его аккаунтом. единственное препятствие - проверка в скрипте IP. Вывод - цеплять сиды из GET, POST - опасно. Только куки - с ними такой финт не получится. Но т.к. тут есть уязвимость в header - я могу дать ссылку и проставить жертве куку с сидом

-~{}~ 24.02.08 22:21:

хотя нет, если из пост гет не цеплять, то я могу подсунуть куку. но после авторизации его опять выкинет на логин - и вот тогда, если он ещё раз введёт логин/пароль - я поимею его сессию
 

Sluggard

Новичок
berkut
Ты сам себя так взламывал и у тебя все получилось? Или что-то где-то как-то слышал одним ухом?
 

berkut

Новичок
Sluggard
да, взломал себя сам и получилось. а ты осмыслил или так, языком потрепаться?

-~{}~ 26.02.08 01:15:

Sluggard
да, взломал себя сам и получилось. а ты осмыслил или так, языком потрепаться?
 

AmdY

Пью пиво
Команда форума
согласен с Sluggard, это на уровне предположений.
но после авторизации его опять выкинет на логин - и вот тогда, если он ещё раз введёт логин/пароль - я поимею его сессию
что-то я совсем не понимаю как такое может быть. мне кажется что первее поимеют хацкера, который сам подарит СВОЙ сид
модераторы если можно, вынесите сей флейм в отдельную ветку
 

berkut

Новичок
да что это такое!Ж) смотрим в код. допустим, я ждаже не зареген на сайте site.ru Я делаю запрос: http://site.ru/auth.php?PHPSESSID смотрим в код:
if (isset($_REQUEST[session_name()])) session_start();
у меня стартует сессия и в ней ничего нет. из куки, которую мне проставили или из хидден формы я узнаю идентьификатор своей пустой сессии. я кидаю жертве ссылку site.ru/auth.php?PHPSESSID={СЮДА ВПИСЫВАЮ ТОЛЬКО ЧТО ПОЛУЧИВШИЙ, СВОЙ ИД СЕССИИ} - смотрим в код(исключение, если у юзера уже есть активная сессия с кукой) - отрабатывает опять та-же строка
if (isset($_REQUEST[session_name()])) session_start();
а что делает session_start() - она смотрит в куки, и если trans_sid = on, то ещё и POST, GET и ищет там ИД сессии. Если находит ид и соответствующий файл сессии - то стартует сессию с этим ИД! далее, т.к. сессия пустая, показывается форма логина. юзверь вводит данные и всё та-же сессия уже не пустая, а в данном случае с его ip и user_id. Всё! теперь я знаю ИД его сессии(вернее, которая была моя изначально).

И даже если отрубить use transe sid, то из-за уязвимости в header можно подсунуть ему, по тому-же принципу, свой сид
 

Фанат

oncle terrible
Команда форума
Ну, пожалуй, проверка на наличие сида и принудительная регенерация не помешала бы, да.

вообще, некоторые особо паранормальные личности перегенерируют сид при каждом обращении.
я только не очень понимаю как это действует. файл переименовывается, что ли?
 

berkut

Новичок
никакие проверки не помогут - вернее сильно завязаны на конкретном коде и в некоторых случаях вообще ничего не сделаешь. поэтому выход только 1: отрубать trans_sid в конфигурации и не писать ламо код
header("Location: http://".$_SERVER['HTTP_HOST']."/" . $_SERVER['REQUEST_URI']);
вообще удивительно, сколько развелось желающих чему-нибудь научить, которым бы самим за пхп для чайников сесть. тут в юморе помниться была такая тема
 
Сверху