Эта статья показывает, что PHP представляет собой определенную уязвимость в защите сервера. Я подключен к Интернету по выделенному каналу, т.е. плачу не за время, проведенное в Инете, а за трафик - количество скачанной и выкаченной оттуда информации. Среди прочих сервисов провайдер (назовем его www.prov.ru) предоставляет юзерам домашние странички с адресом вида www.prov.ru/user/; при этом пользователям разрешено выполнять скрипты на PHP, но с определенными предосторожностями - запрещен unlink() и, как следует отсюда, fwrite() (так называемый safe mode). Доступ к MySQL тоже не предоставляется. Одним словом - все как-то тухло. Убедившись, что при таких условиях невозможно заставить функционировать даже простейший счетчик, я решил воспользоваться хостингом от WallST и забыл про сервисы провайдера. Было это с полгода назад, когда я только начинал знакомиться с PHP.
Но вот недавно мне в очередной раз отключили Инет за неуплату. Теперь я мог зайти только на www.prov.ru (в том числе и на домашние странички пользователей) и его поддомены - до них трафик не считается. И вот, после того, как я проглядел страницы всех юзеров и все поддомены, мне захотелось большего. И тут я вспомнил про одну интересную особенность функции fopen() - если в качестве параметра имени файла указать не локальный адрес (типа /home/user/file.ext), а удаленный (http://www.site.ru/page.html), то будет установлено HTTP соединение с www.site.ru, послан запрос на page.html и этот самый page.html будет скачан во временный каталог PHP! При этом юзеру, запустившему сей хитрый PHP скрипт, не засчитается ни байта трафика. Каково? Итак, если админы при конифгурировании сервака проглядели эту дыру... Ну-ка проверим!
-test.php-
<?
$testpointer=@fopen("http://www.ya.ru/",r);
if($testpointer)
echo("works!!!");
else
echo("suxx :(");
?>
-test.php end-
Естественно, скрипт вернул слово works Я немедленно начал с дикими криками прыгать до потолка. Напрыгавшись, я стал думать, что можно извлечь из данной байды. И вот что придумал:
-surf.php-
<form action=surf.php>
<input type=text size=90 value="<? echo($url); ?>" name=url>
<input type=submit value=" go! ">
</form>
<hr width=100%>
<br><br>
<?
$url="http://".$url;
$filepointer=@fopen($url,r);
$infa=fread($filepointer,10000000);
echo($infa);
?>
-surf.php end-
Этот скрипт позволяет бесплатно читать html страницы (естественно, без картинок, фреймов, флеша и прочей фигни). Минусы - неудобная навигация. Плюсы - бесплатно и быстро (напоминаю, что файлы грузятся не с африканского сервера, а с машины моего провайдера, до которого у меня 2mbit канал). Вволю начитавшись мануалов по PHP, разных статей и анекдотов, я решил послушать музыку. Здесь и возник очередной облом - когда я попробовал вместо .htm файла указать .mp3, Internet Explorer выдал мне набор бессмысленных символов. Я сохранил полученный файл на винт и в Блокноте отрезал от него кусок html кода (форма и т.д.). Полученный файл, естественно, и не думал играться в Winamp`е. Помозговав еще чуть-чуть, я набросал новый скрипт:
-mp3.php-
<?
$url=getenv('QUERY_STRING');
$pointer=fopen($url,r);
$mp3=fread($pointer,15000000);
echo($mp3);
fclose($pointer);
?>
-mp3.php end-
Вызвал полученный скрипт вот так: www.prov.ru/user/mp3.php?http://www.mp3-warez.com/mp3database/song.mp3. Через полминуты 5-меговый файл скачался. Дальше - дело техники: в папке кэша IE (temporary internet files) находится по размеру, дате или имени наш файл (mp3.php) и переименовывается в pesna.mp3. Вперед к прослушиванию
Итак, как видите, без PHP сейчас никуда P.S. Статья была написана с целью показать наиболее распространенные ошибки админов. Эта может привести к огромному трафику, за который придется платить тому, у кого они арендуют канал. Будьте осторожны