обрый день.
В процессе прохождения одного из заданий на hackthebox столкнулся с трудностью.
Есть форма для загрузки файла. Планирую залить через нее шелл.
Также была найдена директория с исходным кодом скрипта.
По сути, проверка осуществляется в 2 местах.
function file_mime_type($file) {
$regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/';
if (function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME);
if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system
{
$mime = @finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if (is_string($mime) && preg_match($regexp, $mime, $matches)) {
$file_type = $matches[1];
return $file_type;
}
}
}
if (function_exists('mime_content_type'))
{
$file_type = @mime_content_type($file['tmp_name']);
if (strlen($file_type) > 0) // It's possible that mime_content_type() returns FALSE or an empty string
{
return $file_type;
}
}
return $file['type'];
}
Эту защиту я обошел, просто дописав к концу содержимого jpg картинки код php
Но есть вторая функция, которая проверяет имя файла и чекает его
list ($foo,$ext) = getnameUpload($myFile["name"]);
$validext = array('.jpg', '.png', '.gif', '.jpeg');
$valid = false;
foreach ($validext as $vext) {
if (substr_compare($myFile["name"], $vext, -strlen($vext)) === 0) {
$valid = true;
}
}
Вот с этим вообще не знаю что делать
Пробовал так file.php%00.jpg file.php?dd=.jpg - файл грузится, но при обращении по имени файла сервер пишет что файл не найден
Отсюда 2 вопроса.
1. Правильно ли я обошел защиту 1, выполнится ли код в графическом файле но с расширением php?
И если нет, как лучше было поступить?
2. Как все таки обойти проверку 2?
Заранее спасибо за помощь