PHPenetration Zadoxlik (antichat.ru) Хакер, номер #090, стр. 090-072-3 mortal upload Вспомни разговор про загрузку аватар. Там мы загружали файл на форум или какой-то другой движок с функцией пользовательского аплоада. Отмечалось, что расширения файла ограничены, однако иногда это можно обойти. Хотя ошибка очень прозрачна, но она до сих пор часто встречается. Допустим, ты загружаешь файл. Неопытные программисты иногда пишут проверку расширений примерно вот так: $exps=array( 'rar', 'zip', 'doc', 'txt' ); //Возможные расширения //Проверяем расширение $rash=explode(".",$_FILES["userfile"]['name']); if(!in_array(strtolower($rash[1]), $exps)) die('у файла неверное расширение'); Ошибка здесь следующая. Скрипт проверяет не расширение файла, а ту часть имени файла, которая находится после первой слева точки до второй слева (если такая имеется). Обычно это и есть расширение файла, однако, если загружать файл с именем shell.txt.php - файл загрузится успешно, и сервер будет понимать загруженный файл как PHP-интерпретируемый (если не прописаны соответствующие установки в .htaccess). На самом деле, скрипт должен проверять самую последнюю из частей имени файла, полученных разбивкой последнего по точкам. Другая версия парсера: $exps=array( 'rar', 'zip', 'doc', 'txt' ); //Возможные расширения //Проверяем расширение $rash=explode(".",$_FILES["userfile"]['name']); if(count($rash)< 2)die('у файла нет расширения'); if(!in_array(strtolower($rash[count($rash)-1]), $exps)) die('у файла неверное расширение'); Однако, учитывая особенности сервера Apache (и других), можно утверждать, что данный вариант проверки также уязвим, и на момент написания статьи уязвимости подвержено множество известных и не очень PHP-движков. В чем фишка? Если апач не может определить расширения файла, то он смотрит следующую часть имени файла, отделенную точкой от расширения. Например, файл arhive.php.ex в большинстве случаев будет интерпретирован как PHP-скрипт! В итоге единственным верным решением будет полная фильтрация имени файла на опасные расширения загружаемого файла. Для страховки также рекомендуется поместить в директорию с файлами .htaccess, с удалением/переопределением опасных расширений. Например: RemoveType .php3 .php .phtml .php4 .php5 .cgi .pl Можно поступить и другим способом. Сохранять на сервере файлы под предопределенным именем (скажем, file<index>file, где <index> - номер файла), а при закачке формировать специальный HTTP-заголовок на основе данных об этом файле, предварительно занесенных в какую-либо БД, обеспечивая передачу файла пользователю под подлинным именем. Можно даже хранить файлы в базе данных, например в MySQL. eval Еще одна «злая» функция – eval. В PHP она интерпретирует переданную ей строку как PHP-код. Без этой функции можно вполне обойтись практически в любом PHP-приложении. Очень часто ее применяют для удобной смены templat'ов - тем какого-нибудь движка. Хотя сделать то же самое можно и без eval. С помощью вот такой строки был взломан один хацкерский ресурс, имя которого называть я не буду: |