2015-02-19 1 views
0

Я решаю некоторые проблемы с хакерством в сети от natas overthewire. На уровне 12 я должен загрузить изображение на сервер, а затем сервер дает мне точную ссылку, в которой он загрузил изображение. Я использую это, написав простой скрипт php, повторяющий содержимое пароля. Это работает, потому что я могу загрузить его как .php-файл, и сервер также сохраняет его в этом формате. На уровне 13 представлена ​​аналогичная задача, но здесь сервер проверяет, является ли это файлом изображения, вызывая функцию exif_imagetype(). Я просто изменяю существующий файл изображения в блокноте и вставляю свой скрипт в конец.Интерпретация jpeg-изображения как сценария php

Мой вопрос в том, что сервер просто проверил расширение файла и отклонил, если файл не был .jpg расширение, было бы лучше, потому что в этом случае, даже если бы я загрузил скрипт, он никогда не будет выполнен сервером поскольку он будет интерпретироваться как файл изображения, а сервер php никогда не будет анализировать файл. Итак, зачем использовать такую ​​функцию, как exif_imagetype()?

+0

'ren nastyvirus.exe cutekittens.jpg'. «Да, это говорит, что это .jpg, это должно быть изображение» –

+0

Каково использование этого вируса, если вещь, которая его выполнит, всегда будет интерпретировать его как изображение? Если php-скрипт не выполняет его, то даже если это не изображение, это не будет иметь никакого вреда. Пожалуйста, объясните ... Возможно, я ошибаюсь. – user257330

+0

Это просто пустяковый пример. но показывает, что вы можете ** НЕ ** доверять именам файлов/расширениям, чтобы правильно идентифицировать содержимое файла. –

ответ

0

Проверка правильного изображения всегда лучше, чем проверка расширения файла. Если средство проверки расширения не является особенно сложным, скорее всего, он будет искать последние . в имени файла и оценить, что следует.

Например, это может быть примером рудиментарном расширения проверки:

$extension = end(explode('.', $_FILES['my_file']['name']); 
// or: 
$extension = strrchr($_FILES['file']['name'], '.'); 

Это все хорошо, и действительно выполняет отлично для имен файлов, таких как myfile.jpg, malicious.php и т.д.

Однако это может быть легко подделано недобросовестным пользователем с различными хаками. Наиболее трудно обойти это пресловутая инъекция NULL байт:

shell.php%0delete0.jpg 

Вы можете узнать больше о инъекции нулевых байт here.

Смежные вопросы