Сценарий, чтобы определить, являются ли файлы Изображениями

Да, Вы можете, и в зависимости от Вашего распределения, оно должно работать из поля. По крайней мере, с драйверами с открытым исходным кодом. Я, которого знают dón't, будут ли драйверы с закрытым исходным кодом вести себя странно, но они не были должны.

Все же Xinerama не то, что Вы хотите сделать больше. Расширение Randr заботится о расположении мониторов. Можно использовать инструменты как arandr выровнять Ваши экраны с помощью GUI.

4
11.03.2015, 01:33
2 ответа

Я думаю, вы должны быть очень осторожны при использовании файла в обстоятельствах, когда вы вводите его совершенно ненадежно. Например, RHEL 5 файл идентифицирует это:

GIF87a
<?php
echo "Hello from PHP!\n";
?>

как «Данные изображения GIF, версия 87a, 15370 x 28735». У интерпретатора PHP нет проблем с выполнением этого ввода. Это отсутствие проблем является основой для проблем « включение локального файла » (LFI).

Во-вторых, файл (и даже строки ) фактически анализируют входные файлы, чтобы сообщить вам то, что вы хотите знать. Эти парсеры сложны и имеют проблемы .

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

6
27.01.2020, 20:47

В качестве быстрого первого прохода команда file может быстро обнаружить заголовки изображений:

if file "$FILE" |grep -qE 'image|bitmap'; then
  echo "File '$FILE' has the headers of an image"
fi

(Второе изменение для bitmap необходимо, если вы хотите распознать Windows BMP файлы, так как libmagic не использует слово "изображение" для описания растровых изображений. )

Однако, мы можем обмануть файл с поддельным изображением на основе PHP из ответа Bruce Ediger:

$ echo 'GIF87a<?php echo "Hello from PHP!"; ?>' > fake.gif
$ file fake.gif && echo image detected || echo no image detected
fake.gif: GIF image data, version 87a, 16188 x 26736
image detected

Использование Imagemagick identify

Набор ImageMagick имеет скрипт identify с фронтендом CLI, который возвращает некоторые метаданные по данному изображению. Он терпит неудачу, когда ожидаемых метаданных нет, поэтому идеально подходит для этой цели:

$ identify fake.gif && echo image detected || echo no image detected
identify-im6.q16: negative or zero image size `fake.gif' @ error/gif.c/ReadGIFImage/1402.
no image detected

Для более быстрого сканирования большой коллекции файлов я рекомендую сложить оба:

if file "$FILE" |grep -qE 'image|bitmap' \
&& ! identify "$FILE" >/dev/null 2>&1; then
  echo "File '$FILE' is a fake image!"
fi

(Это перенаправляет вывод identify в небытие, так как нас волнует только то, смог ли он успешно завершить работу, что захватывается его кодом выхода)

Даже это все равно можно обмануть

В следующем примере используется простой белый GIF размером 1x1 с тем же самым PHP-кодом, добавленным в конец. Я не знаю PHP и не уверен, что он на самом деле будет запущен, но так как PHP - это язык шаблонов, который печатает буквальный "текст" на все, что находится за пределами его тега , я предполагаю, что это запустит данный код как есть, с некоторым мусором перед полезной нагрузкой.

$ { echo 'R0lGODdhAQABAIAAAP///////ywAAAAAAQABAAACAkQBAD'
    echo 's8P3BocCBlY2hvICJIZWxsbyBmcm9tIFBIUCEiOyA/Pgo='
  } | base64 -d > fake2.gif
$ strings fake2.gif
GIF87a
;<?php echo "Hello from PHP!"; ?>
$ file fake2.gif
fake2.gif: GIF image data, version 87a, 1 x 1
$ identify fake2.gif
fake2.gif GIF 1x1 1x1+0+0 8-bit sRGB 2c 68B 0.000u 0:00.000

Это также может быть сделано с комментарием GIF, чтобы быть полностью действительным в качестве изображения:

$ hd fake3.gif
00000000  47 49 46 38 39 61 01 00  01 00 80 00 00 ff ff ff  |GIF89a..........|
00000010  ff ff ff 21 fe 20 3c 3f  70 68 70 20 65 63 68 6f  |...!. <?php echo|
00000020  20 22 48 65 6c 6c 6f 20  66 72 6f 6d 20 50 48 50  | "Hello from PHP|
00000030  21 22 3b 20 3f 3e 00 2c  00 00 00 00 01 00 01 00  |!"; ?>.,........|
00000040  00 02 02 44 01 00 3b                              |...D..;|
00000047

Я выбрал GIF и воспользовался его системой комментариев, но просто конкатенирование полезного груза после любого изображения также должно работать, чтобы обойти эту технику детектирования. Это просто сложнее, чем обмануть файл и (в зависимости от реализации) он может оставить некоторые улики (мусор от изображения).

6
27.01.2020, 20:47

Теги

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