объяснение
То, что вы описали, является частью известного бэкдора PHP. Основной код PHP скрыт кодировкой base64, поэтому его не так легко обнаружить. Код , который вы показали , как правило , скрыты в Exif заголовка Model
и другая важная часть (PCRE /.*/e
, как правило , в заголовке Make
Код из Exif исполняется другой частью бэкдора - вызовом preg_replace($exif['Make'],$exif['Model'],'');
на Exif данные с картинки. Подробности см., Например, « Вредоносное ПО, скрытое внутри заголовков JPG EXIF» или « Скрытие кода Backdoor Webshell» в файлах изображений.
Решение
Вы можете вылечить зараженные изображения, удалив соответствующие заголовки Exif. Сначала проверьте, есть ли проблемные строки в заголовках Make
и Model
:
exiftool file.jpg
Затем вы можете удалить заголовки:
find /directory/with/images -iname '*.jpg' -exec exiftools -Make= -Model= {} +
Этот код удалит два заголовка из всех файлов .jpg
независимо от содержимого заголовков. Если вы хотите удалить только зараженные заголовки, код будет значительно сложнее. Сценарий для этого приведен ниже в конце этого ответа.
Убедившись, что результаты в порядке, вы можете удалить резервные копии, созданные exiftool
:
find /directory/with/images -iname '*.jpg_original' -delete
Имейте в виду, что другая часть черного хода тоже должна быть удалена. Он находится в коде PHP на сервере и обычно выглядит так:
$exif = exif_read_data('/path/to/an/image.jpg');
preg_replace($exif['Make'],$exif['Model'],'');
Скрипт для более точного удаления
Следующий скрипт обнаруживает, в каких заголовках Exif находится код вредоносного ПО. Сохраните код в файле, например, rm-jpg-backdoor
затем включите выполнение: chmod a+x rm-jpg-backdoor
. При вызове скрипта вы можете передать каталоги файлов для очистки в качестве аргументов. Пример: ./rm-jpg-backdoor /directory/with/images
#!/bin/sh
suff=jpg # problematic file suffix
# extended regex signatures of malware code
badregex1='eval\( *base64_decode\( *'\'
badregex2='/.+/e'
script="$0" # this script name for recursion
for f in "$@" ; do
if test -d "$f" ; then
echo "=== recursing directory $f"
find "$f" -type f -iname "*.$suff" -exec "$script" {} +
elif test -f "$f" ; then
echo "-- cleaning file $f"
hdr1="$( exiftool "$f" | grep -E ".+ +: +$badregex1" | sed -r 's/^([a-zA-Z /]*[a-zA-Z]) +: +.*$/\1/' )"
test -n "$hdr1" && { echo "removing $hdr1" ; exiftool "-$hdr1=" "$f" ; }
hdr2="$( exiftool "$f" | grep -E ".+ +: +$badregex2" | sed -r 's/^([a-zA-Z /]*[a-zA-Z]) +: +.*$/\1/' )"
test -n "$hdr2" && { echo "removing $hdr2" ; exiftool "-$hdr2=" "$f" ; }
fi
done