Я решаю некоторые проблемы с хакерством в сети от natas overthewire. На уровне 12 я должен загрузить изображение на сервер, а затем сервер дает мне точную ссылку, в которой он загрузил изображение. Я использую это, написав простой скрипт php, повторяющий содержимое пароля. Это работает, потому что я могу загрузить его как.php файл, и сервер также сохраняет его в этом формате. На уровне 13 представлена аналогичная задача, но здесь сервер проверяет, является ли это файлом изображения, вызывая функцию exif_imagetype(). Я просто изменяю существующий файл изображения в блокноте и вставляю свой скрипт в конец.
Мой вопрос: если сервер просто проверил расширение файла и отклонил, если файл не был расширением.jpg, было бы лучше, потому что в этом случае, даже если бы я загрузил скрипт, он никогда не будет выполняться сервером, как это было бы интерпретируется как файл изображения, а сервер php никогда не будет анализировать файл. Итак, зачем использовать такую функцию, как exif_imagetype()?
Проверка правильного изображения всегда лучше, чем проверка расширения файла. Если средство проверки расширений особенно сложно, оно, скорее всего, будет искать последнее .
в имени файла и оценить, что следует.
Например, это может быть пример элементарной проверки расширений:
$extension = end( explode('.', $_FILES['my_file']['name'] );
// or:
$extension = strrchr($_FILES['file']['name'], '.');
Это хорошо и хорошо, и действительно отлично работает для имен файлов, таких как myfile.jpg
, malicious.php
и т.д.
Однако это может быть легко подделано недобросовестным пользователем с различными хаками. Наиболее трудным для обхода является печально известная инъекция NULL-байта:
shell.php%0delete0.jpg
Вы можете узнать больше о инъекции нулевых байт здесь.
ren nastyvirus.exe cutekittens.jpg
. «Ну и дела, это говорит, что .jpg, это должно быть изображение»