Авторские статьи Некоторые уязвимости Php.

Discussion in 'Статьи' started by NOmeR1, 15 Sep 2007.

  1. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Решил написать, с какими проблемами и уязвимостями я столкнулся и как я их решал, писав свои скрипты. Думаю, будет полезно почитать всем.

    Авторизация, кукисы.
    {


    Подмена cookies

    Пример уязвимого кода:
    PHP:
    <?
    ...
    $mysql mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE `id` = '".mysql_escape_string($_COOKIE['id'])."'"));
    if(
    $_COOKIE['user'] == $mysql['user'])
    {
     include(
    'edituser.php'); // или просто изменение юзера
    }
    ...
    ?>
    Обнаружение уязвимости:
    Если вы заметили, что в кукисах есть только ваш логин и возможно ID, то вероятно, что здесь есть уязвимость.

    Использование уязвимости:
    Конечно, кукисы можно подменять, и, использовав это, можно воспользоваться правами любого юзера.
    Ну а так же часто в таких случаях возможно провернуть SQL-инъекцию.

    Устранение уязвимости:
    Лучше в кукисы (если уж работа в кукисах) сохранять не только логин, но и хеш пароля, и сверять всё. Например:
    PHP:
    <?
    ...
    $mysql mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE `id` = '".mysql_escape_string($_COOKIE['id'])."'"));
    if(
    $_COOKIE['user'] == $mysql['user'] && $_COOKIE['hash'] = $mysql['pass'])
    {
     include(
    'edituser.php'); // или просто изменение юзера
    }
    ...
    ?>
    Но если же вы не хотите, чтобы была возможность угнать кукисы, то лучше работать в сессиях.


    Обход капчи

    Пример уязвимого кода картинки:
    PHP:
    <?
    ...
    $imageCode rand(10000,99999);
    setcookie('imageCode'md5($imageCode));
    ...
    ?>
    Обнаружение уязвимости:
    Просмотрите все кукисы с данного сайта, если вы найдёте кукис вроди imageCode, то вероятно, что здесь есть уязвимость.

    Использование уязвимости:
    Пользуясь тем, что можно подменить кукисы, мы просто меняем этот кукис на хеш любого слова и в запросе уже используем это слово.

    Устранение уязвимости:
    В защищающих картинках лучше использовать сиссии, а после проверки сразу уничтожать её с помощью session_destroy();
    PHP:
    <?
    ...
    $imageCode rand(10000,99999);
    $_SESSION['imageCode'] = md5($imageCode);
    ...
    ?>

    Уязвимость благодаря недочёту в операторе if или elseif

    Пример уязвимого кода:
    PHP:
    <?
    ...
    $mysql mysql_fetch_array(mysql_query("SELECT * FROM `admins` WHERE `name` = '".mysql_escape_string($_POST['name'])."'")); //Даже если нет SQL-инъекции

    if($_POST['password'] != $mysql['password'] && $_POST['login'] != $mysql['name'])
     exit(
    'Вы ввели неверный пароль');

    ...
    ?>
    Обнаружение уязвимости:
    С виду кажется, что здесь нет уязвимости, но это не так. Попробуйте ввести правильный логин, а пароль любой.

    Использование уязвимости:
    Если вы знаете правильный логин, то введя его и любой пароль, вы сможете, например войти в админку.

    Устранение уязвимости:
    Достаточно просто "&&" заменить на "||", так как "&&" - означает "И", а "||" - "ИЛИ".
    PHP:
    <?
    ...
    $mysql mysql_fetch_array(mysql_query("SELECT * FROM `admins` WHERE `name` = '".mysql_escape_string($_POST['name'])."'"));

    if(
    $_POST['password'] != $mysql['password'] || $_POST['login'] != $mysql['name'])
     exit(
    'Вы ввели неверный пароль');

    ...
    ?>

    }
    Чтение файлов и т.п..
    {


    file_get_contents()

    /* Многие считают её инклудом, но это далеко не так
    * У readfile() такая же проблема, но читать файлы ей нельзя */


    Пример уязвимого кода:
    PHP:
    <?
    ...
    echo 
    file_get_contents($_GET['get']);
    ...
    ?>
    Обнаружение уязвимости:
    Если вы хотя бы новичёк, то вас должен привлечь запрос вида index.php?get=news.html, и подставив любое значение, можно увидеть ошибку, это значит, что вероятно, уязвимость здесь есть.

    Использование уязвимости:
    Есть возможность прочитать любой файл на сервере а так же получить cookies жертвы.

    Устранение уязвимости:
    Этот код должен выглядеть примерно так:
    PHP:
    <?
    ...
    $_GET['get'] = preg_replace('|([^A-Za-z0-9_-]+)|','',$_GET['get']);
    echo 
    file_get_contents('http://'.$_SERVER["HTTP_HOST"].'/'.$_GET['get'].'.php');
    ...
    ?>

    }

    Вот вроди бы и всё, если найду ещё, то обязательно напишу о них.

    (c) NOmeR1
     
    #1 NOmeR1, 15 Sep 2007
    Last edited: 15 Sep 2007
    10 people like this.
  2. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    1.
    с трудом представляю, что можно перепутать && и || . если конечно не быть совсем новичком (а новички скрипты такого типа не пишут)

    2.
    аналогично 1.

    3.
    не полностью безопасно, т.к. юзер может прочитать некоторые файлы, которые без использования данной функции ему будут forbidden.
     
  3. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Не понял как и второе, так и третье.

    А на счёт первого, бывает и такое, и у меня бывает, тем более там !=, а с ним геморойней чем с ==.
     
  4. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    еще раз

    2. это может и типичная ошибка, но только у новичков. может и не так, но это мое мнение

    3. допустим, у нас на сервере есть файл admin.php, который становится доступен только после предварительной авторизации, а так его может выполнить любой желающий. хоть и редкий случай, но все же.

    ЗЫ я сам новичек в пхп. если я говорю неправильно, поправьте=)
     
    1 person likes this.
  5. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    >> Уязвимость благодаря недочёту в операторе if или elseif

    я так и не понял какие это недочеты в операторах if и elsif.. )
    недочеты тока в моске прогера, который писал приведенный пример..
     
  6. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Я специально написал уязвимый код и не уязвимый, чтобы если не понятно что-то кому-то, то могли сравнить код и понять ;)
     
  7. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90
    Номер, непонятно зачем это, повторение-мать ученье?? помнишь статейка от задохлика на ха? ... а так молодец
     
  8. n1†R0x

    n1†R0x Elder - Старейшина

    Joined:
    20 Jan 2007
    Messages:
    728
    Likes Received:
    376
    Reputations:
    235
    угу

    по поводу file_get_contents - твой "фикс" - дыра) локальный инклуд.
    если magic_quotes_gpc 1, то можно прочитать любой php-файл (при наличии полного пути), при выключенных - %00 и вперед.

    вообще я бы не сказал, что все это - уязвимости пхп-функций, т.к. такое прокатит не всегда. уязвимости скорее возникают из-за кривых программистов :)
     
  9. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Мой "фикс" - не инклуд. Инклуд - это include(...);

    P.S. Поправил малец.
     
  10. n1†R0x

    n1†R0x Elder - Старейшина

    Joined:
    20 Jan 2007
    Messages:
    728
    Likes Received:
    376
    Reputations:
    235
    Спасибо, я знаю, что такое инклуд.
    Это что-то меняет? все равно код бажный, или теперь через file_get_contents нельзя ретривить какие-либо файлы?
    пс: я имел в виду уязвимость local inclusion, в народе локальный инклуд.
     
    1 person likes this.
  11. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    Уважаемый Нитрокс, вы в который раз неправы =) file_get_contents() и include() это две разные вещи. Через инклуд ты никогда не сможешь просмотреть пшп скрипт, а через file_get_contents() не сможешь его выполнить
     
    1 person likes this.
  12. n1†R0x

    n1†R0x Elder - Старейшина

    Joined:
    20 Jan 2007
    Messages:
    728
    Likes Received:
    376
    Reputations:
    235
    Спайдер, я знаю. Вам перевести значение слова "include"? Тем не менее, это уязвимость и через чтение сорцов можно поиметь много чего полезного. Например, конфиг БД, знакомая ситуация?

    ЗЫ: открою секрет, иногда php-файлы выполняются как txt, это зависит от настроек сервера. так что не будь наивным, можно просмотреть при определенных настройках.
    Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval().
     
    #12 n1†R0x, 16 Sep 2007
    Last edited: 16 Sep 2007
  13. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    я посмеялся))) как же ты выполнишь пшп скрипт с уязвимостью в include() если он выполняется как txt, а не php?
    Во вторых, я тебе это уже сотни раз говорил, любой проинклуденный файл выполняется как пшп код, хоть это exe, хоть jpg или iso к примеру. И это не зависит от настроек сервера
    никто не спорит что это уязвимость, но к инклуду она никаким боком, уж извините =\
     
    1 person likes this.
  14. Xex

    Xex Banned

    Joined:
    10 Jul 2005
    Messages:
    108
    Likes Received:
    41
    Reputations:
    7
    "Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval()." - ))
    порадовало высказывание
     
  15. Ponchik

    Ponchik Хлебо-булочное изделие

    Joined:
    30 Aug 2005
    Messages:
    687
    Likes Received:
    807
    Reputations:
    311
    >Кстати, через file_get_contents тоже можно. Запись файла в переменную и eval().
    Низя! eval'у не понравятся символы <? и ?>
     
    1 person likes this.