Возможен ли обход защиты на загрузку php в этом участке кода?

обрый день.
В процессе прохождения одного из заданий на 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?

Заранее спасибо за помощь
  • Вопрос задан
  • 1115 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
1. Правильно. В инете есть куча статей (как и ответов на тостере), которые преподносят эту фигню как панацею.
2. Я бы и сам был не против посмотреть, как это обойти. Возможно, она обходится не в лоб. зачем-то ведь есть строчка list ($foo,$ext) = getnameUpload($myFile["name"]); при том что результат нигде не используется. Возможно, дальше проверяется именно $ext, и надо смотреть код getnameUpload
Ответ написан
anton_reut
@anton_reut
Начинающий веб-разработчик
Эту защиту я обошел, просто дописав к концу содержимого jpg картинки код php
- весь твой код убивается лёгким ресайзом картинки на 1 пиксель. А вообще вот тут годная статья: https://habr.com/ru/post/44610/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы